Theorem: DirectSum.coe_mul_apply_eq_dfinsupp_sum
File: Mathlib/Algebra/DirectSum/Internal.lean

tactic: rw [mul_eq_dfinsupp_sum]
state_before: ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n : ι
⊢ ↑(↑(r * r') n) = Dfinsupp.sum r fun i ri => Dfinsupp.sum r' fun j rj => if i + j = n then ↑ri * ↑rj else 0

tactic: iterate 2 rw [Dfinsupp.sum_apply, Dfinsupp.sum, AddSubmonoidClass.coe_finset_sum]; congr; ext
state_before: ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n : ι
⊢ ↑(↑(Dfinsupp.sum r fun i ai =>
            Dfinsupp.sum r' fun j aj => ↑(of (fun i => { x // x ∈ A i }) (i + j)) (GradedMonoid.GMul.mul ai aj))
        n) =
    Dfinsupp.sum r fun i ri => Dfinsupp.sum r' fun j rj => if i + j = n then ↑ri * ↑rj else 0

tactic: dsimp only
state_before: case e_f.h.e_f.h
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝¹ x✝ : ι
⊢ ↑(↑(↑(of (fun i => { x // x ∈ A i }) (x✝¹ + x✝)) (GradedMonoid.GMul.mul (↑r x✝¹) (↑r' x✝))) n) =
    (fun j rj => if x✝¹ + j = n then ↑(↑r x✝¹) * ↑rj else 0) x✝ (↑r' x✝)

tactic: split_ifs with h
state_before: case e_f.h.e_f.h
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝¹ x✝ : ι
⊢ ↑(↑(↑(of (fun i => { x // x ∈ A i }) (x✝¹ + x✝)) (GradedMonoid.GMul.mul (↑r x✝¹) (↑r' x✝))) n) =
    if x✝¹ + x✝ = n then ↑(↑r x✝¹) * ↑(↑r' x✝) else 0

tactic: rw [Dfinsupp.sum_apply, Dfinsupp.sum, AddSubmonoidClass.coe_finset_sum]
state_before: case e_f.h
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝ : ι
⊢ ↑(↑(Dfinsupp.sum r' fun j aj => ↑(of (fun i => { x // x ∈ A i }) (x✝ + j)) (GradedMonoid.GMul.mul (↑r x✝) aj)) n) =
    (fun i ri => Dfinsupp.sum r' fun j rj => if i + j = n then ↑ri * ↑rj else 0) x✝ (↑r x✝)

tactic: congr
state_before: case e_f.h
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝ : ι
⊢ ∑ i in Dfinsupp.support r',
      ↑(↑(↑(of (fun i => { x // x ∈ A i }) (x✝ + i)) (GradedMonoid.GMul.mul (↑r x✝) (↑r' i))) n) =
    (fun i ri => Dfinsupp.sum r' fun j rj => if i + j = n then ↑ri * ↑rj else 0) x✝ (↑r x✝)

tactic: ext
state_before: case e_f.h.e_f
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝ : ι
⊢ (fun i => ↑(↑(↑(of (fun i => { x // x ∈ A i }) (x✝ + i)) (GradedMonoid.GMul.mul (↑r x✝) (↑r' i))) n)) = fun i =>
    (fun j rj => if x✝ + j = n then ↑(↑r x✝) * ↑rj else 0) i (↑r' i)

tactic: subst h
state_before: case e_f.h.e_f.h.inl
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝¹ x✝ : ι
h : x✝¹ + x✝ = n
⊢ ↑(↑(↑(of (fun i => { x // x ∈ A i }) (x✝¹ + x✝)) (GradedMonoid.GMul.mul (↑r x✝¹) (↑r' x✝))) n) = ↑(↑r x✝¹) * ↑(↑r' x✝)

tactic: rw [of_eq_same]
state_before: case e_f.h.e_f.h.inl
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
x✝¹ x✝ : ι
⊢ ↑(↑(↑(of (fun i => { x // x ∈ A i }) (x✝¹ + x✝)) (GradedMonoid.GMul.mul (↑r x✝¹) (↑r' x✝))) (x✝¹ + x✝)) =
    ↑(↑r x✝¹) * ↑(↑r' x✝)

tactic: rfl
state_before: case e_f.h.e_f.h.inl
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
x✝¹ x✝ : ι
⊢ ↑(GradedMonoid.GMul.mul (↑r x✝¹) (↑r' x✝)) = ↑(↑r x✝¹) * ↑(↑r' x✝)

tactic: rw [of_eq_of_ne _ _ _ _ h]
state_before: case e_f.h.e_f.h.inr
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝¹ x✝ : ι
h : ¬x✝¹ + x✝ = n
⊢ ↑(↑(↑(of (fun i => { x // x ∈ A i }) (x✝¹ + x✝)) (GradedMonoid.GMul.mul (↑r x✝¹) (↑r' x✝))) n) = 0

tactic: rfl
state_before: case e_f.h.e_f.h.inr
ι : Type u_1
σ : Type u_3
S : Type ?u.116978
R : Type u_2
inst✝⁶ : DecidableEq ι
inst✝⁵ : Semiring R
inst✝⁴ : SetLike σ R
inst✝³ : AddSubmonoidClass σ R
A : ι → σ
inst✝² : AddMonoid ι
inst✝¹ : SetLike.GradedMonoid A
inst✝ : (i : ι) → (x : { x // x ∈ A i }) → Decidable (x ≠ 0)
r r' : ⨁ (i : ι), { x // x ∈ A i }
n x✝¹ x✝ : ι
h : ¬x✝¹ + x✝ = n
⊢ ↑0 = 0