Theorem: PowerSeries.coeff_prod
File: Mathlib/RingTheory/PowerSeries/Basic.lean

tactic: simp only [coeff]
state_before: R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ (coeff R d) (∏ j ∈ s, f j) = ∑ l ∈ s.finsuppAntidiag d, ∏ i ∈ s, (coeff R (l i)) (f i)
state_after: R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ (MvPowerSeries.coeff R (single () d)) (∏ j ∈ s, f j) =
    ∑ x ∈ s.finsuppAntidiag d, ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1)

tactic: convert MvPowerSeries.coeff_prod _ _ _
state_before: R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ (MvPowerSeries.coeff R (single () d)) (∏ j ∈ s, f j) =
    ∑ x ∈ s.finsuppAntidiag d, ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1)
state_after: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ ∑ x ∈ s.finsuppAntidiag d, ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
    ∑ l ∈ s.finsuppAntidiag (single () d), ∏ i ∈ s, (MvPowerSeries.coeff R (l i)) (f i)

case convert_5
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ DecidableEq ι

case convert_6
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ DecidableEq Unit

tactic: rw [← AddEquiv.finsuppUnique_symm d, ← mapRange_finsuppAntidiag_eq, sum_map, sum_congr rfl]
state_before: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ ∑ x ∈ s.finsuppAntidiag d, ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
    ∑ l ∈ s.finsuppAntidiag (single () d), ∏ i ∈ s, (MvPowerSeries.coeff R (l i)) (f i)

case convert_5
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ DecidableEq ι

case convert_6
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ DecidableEq Unit
state_after: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ ∀ x ∈ s.finsuppAntidiag d,
    ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
      ∏ i ∈ s, (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i)) (f i)

tactic: intro x _
state_before: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
⊢ ∀ x ∈ s.finsuppAntidiag d,
    ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
      ∏ i ∈ s, (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i)) (f i)
state_after: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝ : x ∈ s.finsuppAntidiag d
⊢ ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
    ∏ i ∈ s, (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i)) (f i)

tactic: apply prod_congr rfl
state_before: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝ : x ∈ s.finsuppAntidiag d
⊢ ∏ x_1 ∈ s, (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
    ∏ i ∈ s, (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i)) (f i)
state_after: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝ : x ∈ s.finsuppAntidiag d
⊢ ∀ x_1 ∈ s,
    (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
      (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) x_1)) (f x_1)

tactic: intro i _
state_before: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝ : x ∈ s.finsuppAntidiag d
⊢ ∀ x_1 ∈ s,
    (MvPowerSeries.coeff R (single () (x x_1))) (f x_1) =
      (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) x_1)) (f x_1)
state_after: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝¹ : x ∈ s.finsuppAntidiag d
i : ι
a✝ : i ∈ s
⊢ (MvPowerSeries.coeff R (single () (x i))) (f i) =
    (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i)) (f i)

tactic: congr 2
state_before: case h.e'_3
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝¹ : x ∈ s.finsuppAntidiag d
i : ι
a✝ : i ∈ s
⊢ (MvPowerSeries.coeff R (single () (x i))) (f i) =
    (MvPowerSeries.coeff R (((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i)) (f i)
state_after: case h.e'_3.e_a.e_n
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝¹ : x ∈ s.finsuppAntidiag d
i : ι
a✝ : i ∈ s
⊢ single () (x i) = ((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i

tactic: simp only [AddEquiv.toEquiv_eq_coe, Finsupp.mapRange.addEquiv_toEquiv, AddEquiv.toEquiv_symm,
  Equiv.coe_toEmbedding, Finsupp.mapRange.equiv_apply, AddEquiv.coe_toEquiv_symm,
  Finsupp.mapRange_apply, AddEquiv.finsuppUnique_symm]
state_before: case h.e'_3.e_a.e_n
R✝ : Type u_1
R : Type u_2
inst✝¹ : CommSemiring R
ι : Type u_3
inst✝ : DecidableEq ι
f : ι → R⟦X⟧
d : ℕ
s : Finset ι
x : ι →₀ ℕ
a✝¹ : x ∈ s.finsuppAntidiag d
i : ι
a✝ : i ∈ s
⊢ single () (x i) = ((Finsupp.mapRange.addEquiv AddEquiv.finsuppUnique.symm).toEmbedding x) i
state_after: no goals