instance nonUnitalSemiring : NonUnitalSemiring k[G] :=
  { AddMonoidAlgebra.nonUnitalNonAssocSemiring with
    mul_assoc := fun f g h => by
      -- Porting note: `reducible` cannot be `local` so proof gets long.
      simp only [mul_def]
      rw [sum_sum_index]; congr; ext a₁ b₁
      rw [sum_sum_index, sum_sum_index]; congr; ext a₂ b₂
      rw [sum_sum_index, sum_single_index]; congr; ext a₃ b₃
      

Proof state:
case e_g.h.h.e_g.h.h.e_g.h.h
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
a₂ : G
b₂ : k
a₃ : G
b₃ : k
⊢ single (a₁ + a₂ + a₃) (b₁ * b₂ * b₃) = sum (single (a₂ + a₃) (b₂ * b₃)) fun a₂ b₂ => single (a₁ + a₂) (b₁ * b₂)
case e_g.h.h.e_g.h.h
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
a₂ : G
b₂ : k
⊢ (sum h fun a₂_1 b₂ => single (a₁ + a₂ + a₂_1) (0 * b₂)) = 0
case e_g.h.h.e_g.h.h.h_zero
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
a₂ : G
b₂ : k
⊢ ∀ (a : G), single (a₁ + a) (b₁ * 0) = 0
case e_g.h.h.e_g.h.h.h_add
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
a₂ : G
b₂ : k
⊢ ∀ (a : G) (b₁_1 b₂ : k), single (a₁ + a) (b₁ * (b₁_1 + b₂)) = single (a₁ + a) (b₁ * b₁_1) + single (a₁ + a) (b₁ * b₂)
case e_g.h.h.h_zero
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
⊢ ∀ (a : G), single (a₁ + a) (b₁ * 0) = 0
case e_g.h.h.h_add
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
⊢ ∀ (a : G) (b₁_1 b₂ : k), single (a₁ + a) (b₁ * (b₁_1 + b₂)) = single (a₁ + a) (b₁ * b₁_1) + single (a₁ + a) (b₁ * b₂)
case e_g.h.h.h_zero
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
⊢ ∀ (a : G), (sum h fun a₂ b₂ => single (a + a₂) (0 * b₂)) = 0
case e_g.h.h.h_add
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
a₁ : G
b₁ : k
⊢ ∀ (a : G) (b₁ b₂ : k),
    (sum h fun a₂ b₂_1 => single (a + a₂) ((b₁ + b₂) * b₂_1)) =
      (sum h fun a₂ b₂ => single (a + a₂) (b₁ * b₂)) + sum h fun a₂ b₂_1 => single (a + a₂) (b₂ * b₂_1)
case h_zero
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
⊢ ∀ (a : G), (sum h fun a₂ b₂ => single (a + a₂) (0 * b₂)) = 0
case h_add
k : Type u₁
G : Type u₂
H : Type u_1
R : Type u_2
inst✝¹ : Semiring k
inst✝ : AddSemigroup G
src✝ : NonUnitalNonAssocSemiring k[G] := nonUnitalNonAssocSemiring
f g h : k[G]
⊢ ∀ (a : G) (b₁ b₂ : k),
    (sum h fun a₂ b₂_1 => single (a + a₂) ((b₁ + b₂) * b₂_1)) =
      (sum h fun a₂ b₂ => single (a + a₂) (b₁ * b₂)) + sum h fun a₂ b₂_1 => single (a + a₂) (b₂ * b₂_1)

Next tactic:
rw [sum_single_index, mul_assoc, add_assoc]