Theorem: Ideal.quotientInfToPiQuotient_surj
File: Mathlib/RingTheory/Ideal/QuotientOperations.lean

tactic: cases nonempty_fintype ι
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
⊢ Surjective ⇑(quotientInfToPiQuotient I)
state_after: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
⊢ Surjective ⇑(quotientInfToPiQuotient I)

tactic: intro g
state_before: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
⊢ Surjective ⇑(quotientInfToPiQuotient I)
state_after: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
⊢ ∃ a, (quotientInfToPiQuotient I) a = g

tactic: choose f hf using fun i ↦ mk_surjective (g i)
state_before: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
⊢ ∃ a, (quotientInfToPiQuotient I) a = g
state_after: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
⊢ ∃ a, (quotientInfToPiQuotient I) a = g

tactic: choose e he using key
state_before: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
key : ∀ (i : ι), ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0
⊢ ∃ a, (quotientInfToPiQuotient I) a = g
state_after: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
⊢ ∃ a, (quotientInfToPiQuotient I) a = g

tactic: use mk _ (∑ i, f i*e i)
state_before: case intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
⊢ ∃ a, (quotientInfToPiQuotient I) a = g
state_after: case h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
⊢ (quotientInfToPiQuotient I) ((Quotient.mk (⨅ i, I i)) (∑ i : ι, f i * e i)) = g

tactic: ext i
state_before: case h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
⊢ (quotientInfToPiQuotient I) ((Quotient.mk (⨅ i, I i)) (∑ i : ι, f i * e i)) = g
state_after: case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i : ι
⊢ (quotientInfToPiQuotient I) ((Quotient.mk (⨅ i, I i)) (∑ i : ι, f i * e i)) i = g i

tactic: rw [quotientInfToPiQuotient_mk', map_sum, Fintype.sum_eq_single i]
state_before: case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i : ι
⊢ (quotientInfToPiQuotient I) ((Quotient.mk (⨅ i, I i)) (∑ i : ι, f i * e i)) i = g i
state_after: case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i : ι
⊢ (Quotient.mk (I i)) (f i * e i) = g i

case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i : ι
⊢ ∀ (x : ι), x ≠ i → (Quotient.mk (I i)) (f x * e x) = 0

tactic: intro i
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
⊢ ∀ (i : ι), ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0
state_after: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0

tactic: have hI' : ∀ j ∈ ({i} : Finset ι)ᶜ, IsCoprime (I i) (I j) := by
  intros j hj
  exact hI (by simpa [ne_comm, isCoprime_iff_add] using hj)
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0
state_after: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0

tactic: rcases isCoprime_iff_exists.mp (isCoprime_biInf hI') with ⟨u, hu, e, he, hue⟩
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0
state_after: case intro.intro.intro.intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
he : e ∈ ⨅ j ∈ {i}ᶜ, I j
hue : u + e = 1
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0

tactic: replace he : ∀ j, j ≠ i → e ∈ I j := by simpa using he
state_before: case intro.intro.intro.intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
he : e ∈ ⨅ j ∈ {i}ᶜ, I j
hue : u + e = 1
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0
state_after: case intro.intro.intro.intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
hue : u + e = 1
he : ∀ (j : ι), j ≠ i → e ∈ I j
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0

tactic: refine ⟨e, ?_, ?_⟩
state_before: case intro.intro.intro.intro
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
hue : u + e = 1
he : ∀ (j : ι), j ≠ i → e ∈ I j
⊢ ∃ e, (Quotient.mk (I i)) e = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0
state_after: case intro.intro.intro.intro.refine_1
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
hue : u + e = 1
he : ∀ (j : ι), j ≠ i → e ∈ I j
⊢ (Quotient.mk (I i)) e = 1

case intro.intro.intro.intro.refine_2
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
hue : u + e = 1
he : ∀ (j : ι), j ≠ i → e ∈ I j
⊢ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0

tactic: intros j hj
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
⊢ ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
state_after: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i j : ι
hj : j ∈ {i}ᶜ
⊢ IsCoprime (I i) (I j)

tactic: exact hI (by simpa [ne_comm, isCoprime_iff_add] using hj)
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i j : ι
hj : j ∈ {i}ᶜ
⊢ IsCoprime (I i) (I j)
state_after: no goals

tactic: simpa [ne_comm, isCoprime_iff_add] using hj
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i j : ι
hj : j ∈ {i}ᶜ
⊢ i ≠ j
state_after: no goals

tactic: simpa using he
state_before: R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
he : e ∈ ⨅ j ∈ {i}ᶜ, I j
hue : u + e = 1
⊢ ∀ (j : ι), j ≠ i → e ∈ I j
state_after: no goals

tactic: simp [eq_sub_of_add_eq' hue, map_sub, eq_zero_iff_mem.mpr hu]
state_before: case intro.intro.intro.intro.refine_1
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
hue : u + e = 1
he : ∀ (j : ι), j ≠ i → e ∈ I j
⊢ (Quotient.mk (I i)) e = 1
state_after: no goals

tactic: exact fun j hj ↦ eq_zero_iff_mem.mpr (he j hj)
state_before: case intro.intro.intro.intro.refine_2
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
i : ι
hI' : ∀ j ∈ {i}ᶜ, IsCoprime (I i) (I j)
u : R
hu : u ∈ I i
e : R
hue : u + e = 1
he : ∀ (j : ι), j ≠ i → e ∈ I j
⊢ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) e = 0
state_after: no goals

tactic: simp [(he i).1, hf]
state_before: case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i : ι
⊢ (Quotient.mk (I i)) (f i * e i) = g i
state_after: no goals

tactic: intros j hj
state_before: case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i : ι
⊢ ∀ (x : ι), x ≠ i → (Quotient.mk (I i)) (f x * e x) = 0
state_after: case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i j : ι
hj : j ≠ i
⊢ (Quotient.mk (I i)) (f j * e j) = 0

tactic: simp [(he j).2 i hj.symm]
state_before: case h.h
R : Type u
S : Type v
F : Type w
inst✝² : CommRing R
inst✝¹ : Semiring S
ι : Type u_1
inst✝ : Finite ι
I : ι → Ideal R
hI : Pairwise fun i j => IsCoprime (I i) (I j)
val✝ : Fintype ι
g : (i : ι) → R ⧸ I i
f : ι → R
hf : ∀ (i : ι), (Quotient.mk (I i)) (f i) = g i
e : ι → R
he : ∀ (i : ι), (Quotient.mk (I i)) (e i) = 1 ∧ ∀ (j : ι), j ≠ i → (Quotient.mk (I j)) (e i) = 0
i j : ι
hj : j ≠ i
⊢ (Quotient.mk (I i)) (f j * e j) = 0
state_after: no goals