/-- The multiplication in a non-unital algebra is a bilinear map.

A weaker version of this for non-unital non-associative algebras exists as `LinearMap.mul`. -/
def _root_.NonUnitalAlgHom.lmul : A →ₙₐ[R] End R A :=
  { mul R A with
    map_mul' := by
      intro a b
      ext c
      

Proof state:
case h
R : Type u_1
A : Type u_2
inst✝⁴ : CommSemiring R
inst✝³ : NonUnitalSemiring A
inst✝² : Module R A
inst✝¹ : SMulCommClass R A A
inst✝ : IsScalarTower R A A
src✝ : A →ₗ[R] A →ₗ[R] A := mul R A
a b c : A
⊢ (MulActionHom.toFun
        {
            toMulActionHom :=
              { toFun := src✝.toFun,
                map_smul' :=
                  (_ :
                    ∀ (r : R) (x : A),
                      AddHom.toFun src✝.toAddHom (r • x) = (RingHom.id R) r • AddHom.toFun src✝.toAddHom x) },
            map_zero' :=
              (_ :
                MulActionHom.toFun
                    { toFun := src✝.toFun,
                      map_smul' :=
                        (_ :
                          ∀ (r : R) (x : A),
                            AddHom.toFun src✝.toAddHom (r • x) = (RingHom.id R) r • AddHom.toFun src✝.toAddHom x) }
                    0 =
                  0),
            map_add' :=
              (_ :
                ∀ (x y : A),
                  AddHom.toFun src✝.toAddHom (x + y) =
                    AddHom.toFun src✝.toAddHom x + AddHom.toFun src✝.toAddHom y) }.toMulActionHom
        (a * b))
      c =
    (MulActionHom.toFun
          {
              toMulActionHom :=
                { toFun := src✝.toFun,
                  map_smul' :=
                    (_ :
                      ∀ (r : R) (x : A),
                        AddHom.toFun src✝.toAddHom (r • x) = (RingHom.id R) r • AddHom.toFun src✝.toAddHom x) },
              map_zero' :=
                (_ :
                  MulActionHom.toFun
                      { toFun := src✝.toFun,
                        map_smul' :=
                          (_ :
                            ∀ (r : R) (x : A),
                              AddHom.toFun src✝.toAddHom (r • x) = (RingHom.id R) r • AddHom.toFun src✝.toAddHom x) }
                      0 =
                    0),
              map_add' :=
                (_ :
                  ∀ (x y : A),
                    AddHom.toFun src✝.toAddHom (x + y) =
                      AddHom.toFun src✝.toAddHom x + AddHom.toFun src✝.toAddHom y) }.toMulActionHom
          a *
        MulActionHom.toFun
          {
              toMulActionHom :=
                { toFun := src✝.toFun,
                  map_smul' :=
                    (_ :
                      ∀ (r : R) (x : A),
                        AddHom.toFun src✝.toAddHom (r • x) = (RingHom.id R) r • AddHom.toFun src✝.toAddHom x) },
              map_zero' :=
                (_ :
                  MulActionHom.toFun
                      { toFun := src✝.toFun,
                        map_smul' :=
                          (_ :
                            ∀ (r : R) (x : A),
                              AddHom.toFun src✝.toAddHom (r • x) = (RingHom.id R) r • AddHom.toFun src✝.toAddHom x) }
                      0 =
                    0),
              map_add' :=
                (_ :
                  ∀ (x y : A),
                    AddHom.toFun src✝.toAddHom (x + y) =
                      AddHom.toFun src✝.toAddHom x + AddHom.toFun src✝.toAddHom y) }.toMulActionHom
          b)
      c

Next tactic:
exact mul_assoc a b c