/-- The canonical homomorphism from the center into the centroid -/
def centerToCentroid : NonUnitalSubsemiring.center α →ₙ+* CentroidHom α where
  toFun z :=
    { L (z : α) with
      map_mul_left' := ((Set.mem_center_iff _).mp z.prop).left_comm
      map_mul_right' := ((Set.mem_center_iff _).mp z.prop).left_assoc }
  map_zero' := by
    simp only [ZeroMemClass.coe_zero, map_zero]
    exact rfl
  map_add' := fun _ _ => by
    

Proof state:
F : Type u_1
M : Type u_2
N : Type u_3
R : Type u_4
α : Type u_5
inst✝¹² : NonUnitalNonAssocSemiring α
inst✝¹¹ : Monoid M
inst✝¹⁰ : Monoid N
inst✝⁹ : Semiring R
inst✝⁸ : DistribMulAction M α
inst✝⁷ : SMulCommClass M α α
inst✝⁶ : IsScalarTower M α α
inst✝⁵ : DistribMulAction N α
inst✝⁴ : SMulCommClass N α α
inst✝³ : IsScalarTower N α α
inst✝² : Module R α
inst✝¹ : SMulCommClass R α α
inst✝ : IsScalarTower R α α
x✝¹ x✝ : ↥(NonUnitalSubsemiring.center α)
⊢ MulHom.toFun
      {
        toFun := fun z =>
          let src := L ↑z;
          {
            toAddMonoidHom :=
              { toZeroHom := ↑src,
                map_add' :=
                  (_ : ∀ (x y : α), ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
            map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
            map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) },
        map_mul' :=
          (_ :
            ∀ (z₁ z₂ : ↥(NonUnitalSubsemiring.center α)),
              (fun z =>
                    let src := L ↑z;
                    {
                      toAddMonoidHom :=
                        { toZeroHom := ↑src,
                          map_add' :=
                            (_ :
                              ∀ (x y : α),
                                ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                      map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                      map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                  (z₁ * z₂) =
                (fun z =>
                      let src := L ↑z;
                      {
                        toAddMonoidHom :=
                          { toZeroHom := ↑src,
                            map_add' :=
                              (_ :
                                ∀ (x y : α),
                                  ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                        map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                        map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                    z₁ *
                  (fun z =>
                      let src := L ↑z;
                      {
                        toAddMonoidHom :=
                          { toZeroHom := ↑src,
                            map_add' :=
                              (_ :
                                ∀ (x y : α),
                                  ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                        map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                        map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                    z₂) }
      (x✝¹ + x✝) =
    MulHom.toFun
        {
          toFun := fun z =>
            let src := L ↑z;
            {
              toAddMonoidHom :=
                { toZeroHom := ↑src,
                  map_add' :=
                    (_ : ∀ (x y : α), ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
              map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
              map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) },
          map_mul' :=
            (_ :
              ∀ (z₁ z₂ : ↥(NonUnitalSubsemiring.center α)),
                (fun z =>
                      let src := L ↑z;
                      {
                        toAddMonoidHom :=
                          { toZeroHom := ↑src,
                            map_add' :=
                              (_ :
                                ∀ (x y : α),
                                  ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                        map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                        map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                    (z₁ * z₂) =
                  (fun z =>
                        let src := L ↑z;
                        {
                          toAddMonoidHom :=
                            { toZeroHom := ↑src,
                              map_add' :=
                                (_ :
                                  ∀ (x y : α),
                                    ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                          map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                          map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                      z₁ *
                    (fun z =>
                        let src := L ↑z;
                        {
                          toAddMonoidHom :=
                            { toZeroHom := ↑src,
                              map_add' :=
                                (_ :
                                  ∀ (x y : α),
                                    ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                          map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                          map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                      z₂) }
        x✝¹ +
      MulHom.toFun
        {
          toFun := fun z =>
            let src := L ↑z;
            {
              toAddMonoidHom :=
                { toZeroHom := ↑src,
                  map_add' :=
                    (_ : ∀ (x y : α), ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
              map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
              map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) },
          map_mul' :=
            (_ :
              ∀ (z₁ z₂ : ↥(NonUnitalSubsemiring.center α)),
                (fun z =>
                      let src := L ↑z;
                      {
                        toAddMonoidHom :=
                          { toZeroHom := ↑src,
                            map_add' :=
                              (_ :
                                ∀ (x y : α),
                                  ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                        map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                        map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                    (z₁ * z₂) =
                  (fun z =>
                        let src := L ↑z;
                        {
                          toAddMonoidHom :=
                            { toZeroHom := ↑src,
                              map_add' :=
                                (_ :
                                  ∀ (x y : α),
                                    ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                          map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                          map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                      z₁ *
                    (fun z =>
                        let src := L ↑z;
                        {
                          toAddMonoidHom :=
                            { toZeroHom := ↑src,
                              map_add' :=
                                (_ :
                                  ∀ (x y : α),
                                    ZeroHom.toFun (↑src) (x + y) = ZeroHom.toFun (↑src) x + ZeroHom.toFun (↑src) y) },
                          map_mul_left' := (_ : ∀ (b c : α), ↑z * (b * c) = b * (↑z * c)),
                          map_mul_right' := (_ : ∀ (b c : α), ↑z * (b * c) = ↑z * b * c) })
                      z₂) }
        x✝

Next tactic:
simp only [AddSubmonoid.coe_add, NonUnitalSubsemiring.coe_toAddSubmonoid, map_add]