/-
Copyright (c) 2018 Patrick Massot. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Patrick Massot, Kevin Buzzard, Scott Morrison, Johan Commelin, Chris Hughes,
  Johannes Hölzl, Yury Kudryashov

! This file was ported from Lean 3 source module algebra.hom.group_instances
! leanprover-community/mathlib commit c3291da49cfa65f0d43b094750541c0731edc932
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
import Mathbin.Algebra.GroupPower.Basic
import Mathbin.Algebra.Ring.Basic

/-!
# Instances on spaces of monoid and group morphisms

> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
> Any changes to this file require a corresponding PR to mathlib4.

We endow the space of monoid morphisms `M →* N` with a `comm_monoid` structure when the target is
commutative, through pointwise multiplication, and with a `comm_group` structure when the target
is a commutative group. We also prove the same instances for additive situations.

Since these structures permit morphisms of morphisms, we also provide some composition-like
operations.

Finally, we provide the `ring` structure on `add_monoid.End`.
-/

universe uM uN uP uQ

variable {M : Type uM} {N : Type uN} {P : Type uP} {Q : Type uQ}

/-- `(M →* N)` is a `comm_monoid` if `N` is commutative. -/
@[to_additive "`(M →+ N)` is an `add_comm_monoid` if `N` is commutative."]
instance [MulOneClass M] [CommMonoid N] : CommMonoid (M →* N)
    where
  mul := (· * ·)
  mul_assoc := by intros <;> ext <;> apply mul_assoc
  one := 1
  one_mul := by intros <;> ext <;> apply one_mul
  mul_one := by intros <;> ext <;> apply mul_one
  mul_comm := by intros <;> ext <;> apply mul_comm
  npow n f :=
    { toFun := fun x => f x ^ n
      map_one' := by simp
      map_mul' := fun x y => by simp [mul_pow] }
  npow_zero f := by
    ext x
    simp
  npow_succ n f := by
    ext x
    simp [pow_succ]

/-- If `G` is a commutative group, then `M →* G` is a commutative group too. -/
@[to_additive
      "If `G` is an additive commutative group, then `M →+ G` is an additive commutative\ngroup too."]
instance {M G} [MulOneClass M] [CommGroup G] : CommGroup (M →* G) :=
  { MonoidHom.commMonoid with
    inv := Inv.inv
    div := Div.div
    div_eq_mul_inv := by
      intros
      ext
      apply div_eq_mul_inv
    mul_left_inv := by intros <;> ext <;> apply mul_left_inv
    zpow := fun n f =>
      { toFun := fun x => f x ^ n
        map_one' := by simp
        map_mul' := fun x y => by simp [mul_zpow] }
    zpow_zero' := fun f => by
      ext x
      simp
    zpow_succ' := fun n f => by
      ext x
      simp [zpow_ofNat, pow_succ]
    zpow_neg' := fun n f => by
      ext x
      simp }

instance [AddCommMonoid M] : AddCommMonoid (AddMonoid.End M) :=
  AddMonoidHom.addCommMonoid

instance [AddCommMonoid M] : Semiring (AddMonoid.End M) :=
  { AddMonoid.End.monoid M,
    AddMonoidHom.addCommMonoid with
    zero_mul := fun x => AddMonoidHom.ext fun i => rfl
    mul_zero := fun x => AddMonoidHom.ext fun i => AddMonoidHom.map_zero _
    left_distrib := fun x y z => AddMonoidHom.ext fun i => AddMonoidHom.map_add _ _ _
    right_distrib := fun x y z => AddMonoidHom.ext fun i => rfl
    natCast := fun n => n • 1
    natCast_zero := AddMonoid.nsmul_zero _
    natCast_succ := fun n => (AddMonoid.nsmul_succ n 1).trans (add_comm _ _) }

#print AddMonoid.End.natCast_apply /-
/-- See also `add_monoid.End.nat_cast_def`. -/
@[simp]
theorem AddMonoid.End.natCast_apply [AddCommMonoid M] (n : ℕ) (m : M) :
    (↑n : AddMonoid.End M) m = n • m :=
  rfl
#align add_monoid.End.nat_cast_apply AddMonoid.End.natCast_apply
-/

instance [AddCommGroup M] : AddCommGroup (AddMonoid.End M) :=
  AddMonoidHom.addCommGroup

instance [AddCommGroup M] : Ring (AddMonoid.End M) :=
  { AddMonoid.End.semiring,
    AddMonoidHom.addCommGroup with
    intCast := fun z => z • 1
    intCast_ofNat := ofNat_zsmul _
    intCast_negSucc := negSucc_zsmul _ }

/- warning: add_monoid.End.int_cast_apply -> AddMonoid.End.int_cast_apply is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} [_inst_1 : AddCommGroup.{u1} M] (z : Int) (m : M), Eq.{succ u1} M (coeFn.{succ u1, succ u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (fun (_x : AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) => M -> M) (FunLike.hasCoeToFun.{succ u1, succ u1, succ u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) M (fun (_x : M) => M) (AddHomClass.toFunLike.{u1, u1, u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) M M (AddZeroClass.toHasAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (AddZeroClass.toHasAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (AddMonoidHomClass.toAddHomClass.{u1, u1, u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) M M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1)))) (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1)))) (AddMonoid.End.addMonoidHomClass.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1)))))))) ((fun (a : Type) (b : Type.{u1}) [self : HasLiftT.{1, succ u1} a b] => self.0) Int (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (HasLiftT.mk.{1, succ u1} Int (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (CoeTCₓ.coe.{1, succ u1} Int (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (Int.castCoe.{u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (AddGroupWithOne.toHasIntCast.{u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (AddCommGroupWithOne.toAddGroupWithOne.{u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (Ring.toAddCommGroupWithOne.{u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (AddMonoid.End.ring.{u1} M _inst_1))))))) z) m) (SMul.smul.{0, u1} Int M (SubNegMonoid.SMulInt.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))) z m)
but is expected to have type
  forall {M : Type.{u1}} [_inst_1 : AddCommGroup.{u1} M] (z : Int) (m : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : M) => M) m) (FunLike.coe.{succ u1, succ u1, succ u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : M) => M) _x) (AddHomClass.toFunLike.{u1, u1, u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) M M (AddZeroClass.toAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (AddZeroClass.toAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (AddMonoidHomClass.toAddHomClass.{u1, u1, u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) M M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1)))) (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1)))) (AddMonoid.End.instAddMonoidHomClassEnd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))))) (Int.cast.{u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (Ring.toIntCast.{u1} (AddMonoid.End.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1))))) (instRingEndToAddZeroClassToAddMonoidToSubNegMonoidToAddGroup.{u1} M _inst_1)) z) m) (HSMul.hSMul.{0, u1, u1} Int M M (instHSMul.{0, u1} Int M (SubNegMonoid.SMulInt.{u1} M (AddGroup.toSubNegMonoid.{u1} M (AddCommGroup.toAddGroup.{u1} M _inst_1)))) z m)
Case conversion may be inaccurate. Consider using '#align add_monoid.End.int_cast_apply AddMonoid.End.int_cast_applyₓ'. -/
/-- See also `add_monoid.End.int_cast_def`. -/
@[simp]
theorem AddMonoid.End.int_cast_apply [AddCommGroup M] (z : ℤ) (m : M) :
    (↑z : AddMonoid.End M) m = z • m :=
  rfl
#align add_monoid.End.int_cast_apply AddMonoid.End.int_cast_apply

/-!
### Morphisms of morphisms

The structures above permit morphisms that themselves produce morphisms, provided the codomain
is commutative.
-/

namespace MonoidHom

/- warning: monoid_hom.ext_iff₂ -> MonoidHom.ext_iff₂ is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} {f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))} {g : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))}, Iff (Eq.{max (succ (max u3 u2)) (succ u1)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f g) (forall (x : M) (y : N), Eq.{succ u3} P (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f x) y) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) g x) y))
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} {f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))} {g : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))}, Iff (Eq.{max (max (succ u1) (succ u2)) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f g) (forall (x : M) (y : N), Eq.{succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) y) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))))) f x) y) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))))) g x) y))
Case conversion may be inaccurate. Consider using '#align monoid_hom.ext_iff₂ MonoidHom.ext_iff₂ₓ'. -/
@[to_additive]
theorem ext_iff₂ {mM : MulOneClass M} {mN : MulOneClass N} {mP : CommMonoid P} {f g : M →* N →* P} :
    f = g ↔ ∀ x y, f x y = g x y :=
  MonoidHom.ext_iff.trans <| forall_congr' fun _ => MonoidHom.ext_iff
#align monoid_hom.ext_iff₂ MonoidHom.ext_iff₂
#align add_monoid_hom.ext_iff₂ AddMonoidHom.ext_iff₂

#print MonoidHom.flip /-
/-- `flip` arguments of `f : M →* N →* P` -/
@[to_additive "`flip` arguments of `f : M →+ N →+ P`"]
def flip {mM : MulOneClass M} {mN : MulOneClass N} {mP : CommMonoid P} (f : M →* N →* P) :
    N →* M →* P
    where
  toFun y :=
    ⟨fun x => f x y, by rw [f.map_one, one_apply], fun x₁ x₂ => by rw [f.map_mul, mul_apply]⟩
  map_one' := ext fun x => (f x).map_one
  map_mul' y₁ y₂ := ext fun x => (f x).map_mul y₁ y₂
#align monoid_hom.flip MonoidHom.flip
#align add_monoid_hom.flip AddMonoidHom.flip
-/

/- warning: monoid_hom.flip_apply -> MonoidHom.flip_apply is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (x : M) (y : N), Eq.{succ u3} P (coeFn.{max (succ u3) (succ u1), max (succ u1) (succ u3)} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => M -> P) (MonoidHom.hasCoeToFun.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u1)) (succ u2), max (succ u2) (succ (max u3 u1))} (MonoidHom.{u2, max u3 u1} N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u3 u1} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u1} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))) (fun (_x : MonoidHom.{u2, max u3 u1} N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u3 u1} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u1} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))) => N -> (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u2, max u3 u1} N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u3 u1} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u1} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))) (MonoidHom.flip.{u1, u2, u3} M N P mM mN mP f) y) x) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f x) y)
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (x : M) (y : N), Eq.{succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) x) (FunLike.coe.{max (succ u1) (succ u3), succ u1, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) y) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u3, u1, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) y) M P (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u1 u3, u1, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) y) M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u2, max (succ u1) (succ u3)} (MonoidHom.{u2, max u3 u1} N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u2, max u1 u3} (MonoidHom.{u2, max u3 u1} N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))) N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u2, max u1 u3} (MonoidHom.{u2, max u3 u1} N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))) N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP))) (MonoidHom.monoidHomClass.{u2, max u1 u3} N (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mN (Monoid.toMulOneClass.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u1 u3} (MonoidHom.{u1, u3} M P mM (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u1, u3} M P mM mP)))))) (MonoidHom.flip.{u1, u2, u3} M N P mM mN mP f) y) x) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) x) N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))))) f x) y)
Case conversion may be inaccurate. Consider using '#align monoid_hom.flip_apply MonoidHom.flip_applyₓ'. -/
@[simp, to_additive]
theorem flip_apply {mM : MulOneClass M} {mN : MulOneClass N} {mP : CommMonoid P} (f : M →* N →* P)
    (x : M) (y : N) : f.flip y x = f x y :=
  rfl
#align monoid_hom.flip_apply MonoidHom.flip_apply
#align add_monoid_hom.flip_apply AddMonoidHom.flip_apply

/- warning: monoid_hom.map_one₂ -> MonoidHom.map_one₂ is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (n : N), Eq.{succ u3} P (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M mM))))) n) (OfNat.ofNat.{u3} P 1 (OfNat.mk.{u3} P 1 (One.one.{u3} P (MulOneClass.toHasOne.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))))
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (n : N), Eq.{succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M mM)))) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M mM)))) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M mM)))) N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))))) f (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M mM)))) n) (OfNat.ofNat.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) 1 (One.toOfNat1.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (Monoid.toOne.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (CommMonoid.toMonoid.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) mP))))
Case conversion may be inaccurate. Consider using '#align monoid_hom.map_one₂ MonoidHom.map_one₂ₓ'. -/
@[to_additive]
theorem map_one₂ {mM : MulOneClass M} {mN : MulOneClass N} {mP : CommMonoid P} (f : M →* N →* P)
    (n : N) : f 1 n = 1 :=
  (flip f n).map_one
#align monoid_hom.map_one₂ MonoidHom.map_one₂
#align add_monoid_hom.map_one₂ AddMonoidHom.map_one₂

/- warning: monoid_hom.map_mul₂ -> MonoidHom.map_mul₂ is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (m₁ : M) (m₂ : M) (n : N), Eq.{succ u3} P (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M mM)) m₁ m₂)) n) (HMul.hMul.{u3, u3, u3} P P P (instHMul.{u3} P (MulOneClass.toHasMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f m₁) n) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) f m₂) n))
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : MulOneClass.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommMonoid.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (m₁ : M) (m₂ : M) (n : N), Eq.{succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M mM)) m₁ m₂)) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M mM)) m₁ m₂)) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M mM)) m₁ m₂)) N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))))) f (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M mM)) m₁ m₂)) n) (HMul.hMul.{u3, u3, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (instHMul.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (MulOneClass.toMul.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (Monoid.toMulOneClass.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (CommMonoid.toMonoid.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) mP)))) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) m₁) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) m₁) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) m₁) N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))))) f m₁) n) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) m₂) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) m₂) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) m₂) N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP)) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MulOneClass.toMul.{u1} M mM) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) mM (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P mP))) (MonoidHom.commMonoid.{u2, u3} N P mN mP)))))) f m₂) n))
Case conversion may be inaccurate. Consider using '#align monoid_hom.map_mul₂ MonoidHom.map_mul₂ₓ'. -/
@[to_additive]
theorem map_mul₂ {mM : MulOneClass M} {mN : MulOneClass N} {mP : CommMonoid P} (f : M →* N →* P)
    (m₁ m₂ : M) (n : N) : f (m₁ * m₂) n = f m₁ n * f m₂ n :=
  (flip f n).map_mul _ _
#align monoid_hom.map_mul₂ MonoidHom.map_mul₂
#align add_monoid_hom.map_mul₂ AddMonoidHom.map_mul₂

/- warning: monoid_hom.map_inv₂ -> MonoidHom.map_inv₂ is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : Group.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommGroup.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (m : M) (n : N), Eq.{succ u3} P (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) f (Inv.inv.{u1} M (DivInvMonoid.toHasInv.{u1} M (Group.toDivInvMonoid.{u1} M mM)) m)) n) (Inv.inv.{u3} P (DivInvMonoid.toHasInv.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) f m) n))
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : Group.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommGroup.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (m : M) (n : N), Eq.{succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Inv.inv.{u1} M (InvOneClass.toInv.{u1} M (DivInvOneMonoid.toInvOneClass.{u1} M (DivisionMonoid.toDivInvOneMonoid.{u1} M (Group.toDivisionMonoid.{u1} M mM)))) m)) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Inv.inv.{u1} M (InvOneClass.toInv.{u1} M (DivInvOneMonoid.toInvOneClass.{u1} M (DivisionMonoid.toDivInvOneMonoid.{u1} M (Group.toDivisionMonoid.{u1} M mM)))) m)) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Inv.inv.{u1} M (InvOneClass.toInv.{u1} M (DivInvOneMonoid.toInvOneClass.{u1} M (DivisionMonoid.toDivInvOneMonoid.{u1} M (Group.toDivisionMonoid.{u1} M mM)))) m)) N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM)))) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP))))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))))) f (Inv.inv.{u1} M (InvOneClass.toInv.{u1} M (DivInvOneMonoid.toInvOneClass.{u1} M (DivisionMonoid.toDivInvOneMonoid.{u1} M (Group.toDivisionMonoid.{u1} M mM)))) m)) n) (Inv.inv.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (InvOneClass.toInv.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (DivInvOneMonoid.toInvOneClass.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (DivisionMonoid.toDivInvOneMonoid.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (DivisionCommMonoid.toDivisionMonoid.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (CommGroup.toDivisionCommMonoid.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) mP))))) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m) N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM)))) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP))))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))))) f m) n))
Case conversion may be inaccurate. Consider using '#align monoid_hom.map_inv₂ MonoidHom.map_inv₂ₓ'. -/
@[to_additive]
theorem map_inv₂ {mM : Group M} {mN : MulOneClass N} {mP : CommGroup P} (f : M →* N →* P) (m : M)
    (n : N) : f m⁻¹ n = (f m n)⁻¹ :=
  (flip f n).map_inv _
#align monoid_hom.map_inv₂ MonoidHom.map_inv₂
#align add_monoid_hom.map_inv₂ AddMonoidHom.map_inv₂

/- warning: monoid_hom.map_div₂ -> MonoidHom.map_div₂ is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : Group.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommGroup.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (m₁ : M) (m₂ : M) (n : N), Eq.{succ u3} P (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) f (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toHasDiv.{u1} M (Group.toDivInvMonoid.{u1} M mM))) m₁ m₂)) n) (HDiv.hDiv.{u3, u3, u3} P P P (instHDiv.{u3} P (DivInvMonoid.toHasDiv.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) f m₁) n) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (fun (_x : MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) => M -> (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u3 u2} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) f m₂) n))
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {mM : Group.{u1} M} {mN : MulOneClass.{u2} N} {mP : CommGroup.{u3} P} (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (m₁ : M) (m₂ : M) (n : N), Eq.{succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toDiv.{u1} M (Group.toDivInvMonoid.{u1} M mM))) m₁ m₂)) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toDiv.{u1} M (Group.toDivInvMonoid.{u1} M mM))) m₁ m₂)) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toDiv.{u1} M (Group.toDivInvMonoid.{u1} M mM))) m₁ m₂)) N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM)))) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP))))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))))) f (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toDiv.{u1} M (Group.toDivInvMonoid.{u1} M mM))) m₁ m₂)) n) (HDiv.hDiv.{u3, u3, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (instHDiv.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (DivInvMonoid.toDiv.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (Group.toDivInvMonoid.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) (CommGroup.toGroup.{u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) n) mP)))) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m₁) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m₁) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m₁) N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM)))) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP))))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))))) f m₁) n) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m₂) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m₂) N P (MulOneClass.toMul.{u2} N mN) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) m₂) N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP)))) (MonoidHom.monoidHomClass.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM)))) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))) M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP))))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M mM))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (DivInvMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (Group.toDivInvMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (CommGroup.toGroup.{max u2 u3} (MonoidHom.{u2, u3} N P mN (Monoid.toMulOneClass.{u3} P (DivInvMonoid.toMonoid.{u3} P (Group.toDivInvMonoid.{u3} P (CommGroup.toGroup.{u3} P mP))))) (MonoidHom.commGroup.{u2, u3} N P mN mP)))))))) f m₂) n))
Case conversion may be inaccurate. Consider using '#align monoid_hom.map_div₂ MonoidHom.map_div₂ₓ'. -/
@[to_additive]
theorem map_div₂ {mM : Group M} {mN : MulOneClass N} {mP : CommGroup P} (f : M →* N →* P)
    (m₁ m₂ : M) (n : N) : f (m₁ / m₂) n = f m₁ n / f m₂ n :=
  (flip f n).map_div _ _
#align monoid_hom.map_div₂ MonoidHom.map_div₂
#align add_monoid_hom.map_div₂ AddMonoidHom.map_div₂

#print MonoidHom.eval /-
/-- Evaluation of a `monoid_hom` at a point as a monoid homomorphism. See also `monoid_hom.apply`
for the evaluation of any function at a point. -/
@[to_additive
      "Evaluation of an `add_monoid_hom` at a point as an additive monoid homomorphism.\nSee also `add_monoid_hom.apply` for the evaluation of any function at a point.",
  simps]
def eval [MulOneClass M] [CommMonoid N] : M →* (M →* N) →* N :=
  (MonoidHom.id (M →* N)).flip
#align monoid_hom.eval MonoidHom.eval
#align add_monoid_hom.eval AddMonoidHom.eval
-/

#print MonoidHom.compHom' /-
/-- The expression `λ g m, g (f m)` as a `monoid_hom`.
Equivalently, `(λ g, monoid_hom.comp g f)` as a `monoid_hom`. -/
@[to_additive
      "The expression `λ g m, g (f m)` as a `add_monoid_hom`.\nEquivalently, `(λ g, monoid_hom.comp g f)` as a `add_monoid_hom`.\n\nThis also exists in a `linear_map` version, `linear_map.lcomp`.",
  simps]
def compHom' [MulOneClass M] [MulOneClass N] [CommMonoid P] (f : M →* N) : (N →* P) →* M →* P :=
  flip <| eval.comp f
#align monoid_hom.comp_hom' MonoidHom.compHom'
#align add_monoid_hom.comp_hom' AddMonoidHom.compHom'
-/

#print MonoidHom.compHom /-
/-- Composition of monoid morphisms (`monoid_hom.comp`) as a monoid morphism.

Note that unlike `monoid_hom.comp_hom'` this requires commutativity of `N`. -/
@[to_additive
      "Composition of additive monoid morphisms (`add_monoid_hom.comp`) as an additive\nmonoid morphism.\n\nNote that unlike `add_monoid_hom.comp_hom'` this requires commutativity of `N`.\n\nThis also exists in a `linear_map` version, `linear_map.llcomp`.",
  simps]
def compHom [MulOneClass M] [CommMonoid N] [CommMonoid P] : (N →* P) →* (M →* N) →* M →* P
    where
  toFun g :=
    { toFun := g.comp
      map_one' := comp_one g
      map_mul' := comp_mul g }
  map_one' := by
    ext1 f
    exact one_comp f
  map_mul' g₁ g₂ := by
    ext1 f
    exact mul_comp g₁ g₂ f
#align monoid_hom.comp_hom MonoidHom.compHom
#align add_monoid_hom.comp_hom AddMonoidHom.compHom
-/

#print MonoidHom.flipHom /-
/-- Flipping arguments of monoid morphisms (`monoid_hom.flip`) as a monoid morphism. -/
@[to_additive
      "Flipping arguments of additive monoid morphisms (`add_monoid_hom.flip`)\nas an additive monoid morphism.",
  simps]
def flipHom {mM : MulOneClass M} {mN : MulOneClass N} {mP : CommMonoid P} :
    (M →* N →* P) →* N →* M →* P where
  toFun := MonoidHom.flip
  map_one' := rfl
  map_mul' f g := rfl
#align monoid_hom.flip_hom MonoidHom.flipHom
#align add_monoid_hom.flip_hom AddMonoidHom.flipHom
-/

#print MonoidHom.compl₂ /-
/-- The expression `λ m q, f m (g q)` as a `monoid_hom`.

Note that the expression `λ q n, f (g q) n` is simply `monoid_hom.comp`. -/
@[to_additive
      "The expression `λ m q, f m (g q)` as an `add_monoid_hom`.\n\nNote that the expression `λ q n, f (g q) n` is simply `add_monoid_hom.comp`.\n\nThis also exists as a `linear_map` version, `linear_map.compl₂`"]
def compl₂ [MulOneClass M] [MulOneClass N] [CommMonoid P] [MulOneClass Q] (f : M →* N →* P)
    (g : Q →* N) : M →* Q →* P :=
  (compHom' g).comp f
#align monoid_hom.compl₂ MonoidHom.compl₂
#align add_monoid_hom.compl₂ AddMonoidHom.compl₂
-/

/- warning: monoid_hom.compl₂_apply -> MonoidHom.compl₂_apply is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {Q : Type.{u4}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] [_inst_3 : CommMonoid.{u3} P] [_inst_4 : MulOneClass.{u4} Q] (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (g : MonoidHom.{u4, u2} Q N _inst_4 _inst_2) (m : M) (q : Q), Eq.{succ u3} P (coeFn.{max (succ u3) (succ u4), max (succ u4) (succ u3)} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (fun (_x : MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) => Q -> P) (MonoidHom.hasCoeToFun.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (coeFn.{max (succ (max u3 u4)) (succ u1), max (succ u1) (succ (max u3 u4))} (MonoidHom.{u1, max u3 u4} M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))) (fun (_x : MonoidHom.{u1, max u3 u4} M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))) => M -> (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)))) (MonoidHom.hasCoeToFun.{u1, max u3 u4} M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))) (MonoidHom.compl₂.{u1, u2, u3, u4} M N P Q _inst_1 _inst_2 _inst_3 _inst_4 f g) m) q) (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (fun (_x : MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) => M -> (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) f m) (coeFn.{max (succ u2) (succ u4), max (succ u4) (succ u2)} (MonoidHom.{u4, u2} Q N _inst_4 _inst_2) (fun (_x : MonoidHom.{u4, u2} Q N _inst_4 _inst_2) => Q -> N) (MonoidHom.hasCoeToFun.{u4, u2} Q N _inst_4 _inst_2) g q))
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {Q : Type.{u4}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] [_inst_3 : CommMonoid.{u3} P] [_inst_4 : MulOneClass.{u4} Q] (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (g : MonoidHom.{u4, u2} Q N _inst_4 _inst_2) (m : M) (q : Q), Eq.{succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Q) => P) q) (FunLike.coe.{max (succ u3) (succ u4), succ u4, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) Q (fun (_x : Q) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Q) => P) _x) (MulHomClass.toFunLike.{max u3 u4, u4, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) Q P (MulOneClass.toMul.{u4} Q _inst_4) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHomClass.toMulHomClass.{max u3 u4, u4, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (MonoidHom.monoidHomClass.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))))) (FunLike.coe.{max (max (succ u1) (succ u3)) (succ u4), succ u1, max (succ u3) (succ u4)} (MonoidHom.{u1, max u3 u4} M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _x) (MulHomClass.toFunLike.{max (max u1 u3) u4, u1, max u3 u4} (MonoidHom.{u1, max u3 u4} M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))) M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))) (MonoidHomClass.toMulHomClass.{max (max u1 u3) u4, u1, max u3 u4} (MonoidHom.{u1, max u3 u4} M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))) M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3))) (MonoidHom.monoidHomClass.{u1, max u3 u4} M (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u4} (MonoidHom.{u4, u3} Q P _inst_4 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u4, u3} Q P _inst_4 _inst_3)))))) (MonoidHom.compl₂.{u1, u2, u3, u4} M N P Q _inst_1 _inst_2 _inst_3 _inst_4 f g) m) q) (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) N P (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (MonoidHom.monoidHomClass.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))))) f m) (FunLike.coe.{max (succ u2) (succ u4), succ u4, succ u2} (MonoidHom.{u4, u2} Q N _inst_4 _inst_2) Q (fun (_x : Q) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Q) => N) _x) (MulHomClass.toFunLike.{max u2 u4, u4, u2} (MonoidHom.{u4, u2} Q N _inst_4 _inst_2) Q N (MulOneClass.toMul.{u4} Q _inst_4) (MulOneClass.toMul.{u2} N _inst_2) (MonoidHomClass.toMulHomClass.{max u2 u4, u4, u2} (MonoidHom.{u4, u2} Q N _inst_4 _inst_2) Q N _inst_4 _inst_2 (MonoidHom.monoidHomClass.{u4, u2} Q N _inst_4 _inst_2))) g q))
Case conversion may be inaccurate. Consider using '#align monoid_hom.compl₂_apply MonoidHom.compl₂_applyₓ'. -/
@[simp, to_additive]
theorem compl₂_apply [MulOneClass M] [MulOneClass N] [CommMonoid P] [MulOneClass Q]
    (f : M →* N →* P) (g : Q →* N) (m : M) (q : Q) : (compl₂ f g) m q = f m (g q) :=
  rfl
#align monoid_hom.compl₂_apply MonoidHom.compl₂_apply
#align add_monoid_hom.compl₂_apply AddMonoidHom.compl₂_apply

#print MonoidHom.compr₂ /-
/-- The expression `λ m n, g (f m n)` as a `monoid_hom`. -/
@[to_additive
      "The expression `λ m n, g (f m n)` as an `add_monoid_hom`.\n\nThis also exists as a linear_map version, `linear_map.compr₂`"]
def compr₂ [MulOneClass M] [MulOneClass N] [CommMonoid P] [CommMonoid Q] (f : M →* N →* P)
    (g : P →* Q) : M →* N →* Q :=
  (compHom g).comp f
#align monoid_hom.compr₂ MonoidHom.compr₂
#align add_monoid_hom.compr₂ AddMonoidHom.compr₂
-/

/- warning: monoid_hom.compr₂_apply -> MonoidHom.compr₂_apply is a dubious translation:
lean 3 declaration is
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {Q : Type.{u4}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] [_inst_3 : CommMonoid.{u3} P] [_inst_4 : CommMonoid.{u4} Q] (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (g : MonoidHom.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (m : M) (n : N), Eq.{succ u4} Q (coeFn.{max (succ u4) (succ u2), max (succ u2) (succ u4)} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (fun (_x : MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) => N -> Q) (MonoidHom.hasCoeToFun.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (coeFn.{max (succ (max u4 u2)) (succ u1), max (succ u1) (succ (max u4 u2))} (MonoidHom.{u1, max u4 u2} M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u4 u2} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u4 u2} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))) (fun (_x : MonoidHom.{u1, max u4 u2} M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u4 u2} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u4 u2} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))) => M -> (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4)))) (MonoidHom.hasCoeToFun.{u1, max u4 u2} M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u4 u2} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u4 u2} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))) (MonoidHom.compr₂.{u1, u2, u3, u4} M N P Q _inst_1 _inst_2 _inst_3 _inst_4 f g) m) n) (coeFn.{max (succ u4) (succ u3), max (succ u3) (succ u4)} (MonoidHom.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (fun (_x : MonoidHom.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) => P -> Q) (MonoidHom.hasCoeToFun.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) g (coeFn.{max (succ u3) (succ u2), max (succ u2) (succ u3)} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (fun (_x : MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) => N -> P) (MonoidHom.hasCoeToFun.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (coeFn.{max (succ (max u3 u2)) (succ u1), max (succ u1) (succ (max u3 u2))} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (fun (_x : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) => M -> (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)))) (MonoidHom.hasCoeToFun.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u3 u2} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) f m) n))
but is expected to have type
  forall {M : Type.{u1}} {N : Type.{u2}} {P : Type.{u3}} {Q : Type.{u4}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] [_inst_3 : CommMonoid.{u3} P] [_inst_4 : CommMonoid.{u4} Q] (f : MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (g : MonoidHom.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (m : M) (n : N), Eq.{succ u4} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => Q) n) (FunLike.coe.{max (succ u2) (succ u4), succ u2, succ u4} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) m) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => Q) _x) (MulHomClass.toFunLike.{max u2 u4, u2, u4} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) m) N Q (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u4} Q (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHomClass.toMulHomClass.{max u2 u4, u2, u4} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) m) N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4)) (MonoidHom.monoidHomClass.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u4), succ u1, max (succ u2) (succ u4)} (MonoidHom.{u1, max u4 u2} M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u4, u1, max u2 u4} (MonoidHom.{u1, max u4 u2} M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))) M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (Monoid.toMulOneClass.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u4, u1, max u2 u4} (MonoidHom.{u1, max u4 u2} M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))) M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4))) (MonoidHom.monoidHomClass.{u1, max u2 u4} M (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) _inst_1 (Monoid.toMulOneClass.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (CommMonoid.toMonoid.{max u2 u4} (MonoidHom.{u2, u4} N Q _inst_2 (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHom.commMonoid.{u2, u4} N Q _inst_2 _inst_4)))))) (MonoidHom.compr₂.{u1, u2, u3, u4} M N P Q _inst_1 _inst_2 _inst_3 _inst_4 f g) m) n) (FunLike.coe.{max (succ u3) (succ u4), succ u3, succ u4} (MonoidHom.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) P (fun (_x : P) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : P) => Q) _x) (MulHomClass.toFunLike.{max u3 u4, u3, u4} (MonoidHom.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) P Q (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MulOneClass.toMul.{u4} Q (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) (MonoidHomClass.toMulHomClass.{max u3 u4, u3, u4} (MonoidHom.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))) P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4)) (MonoidHom.monoidHomClass.{u3, u4} P Q (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (Monoid.toMulOneClass.{u4} Q (CommMonoid.toMonoid.{u4} Q _inst_4))))) g (FunLike.coe.{max (succ u2) (succ u3), succ u2, succ u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => P) _x) (MulHomClass.toFunLike.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) N P (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u3} P (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHomClass.toMulHomClass.{max u2 u3, u2, u3} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) m) N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3)) (MonoidHom.monoidHomClass.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))))) (FunLike.coe.{max (max (succ u1) (succ u2)) (succ u3), succ u1, max (succ u2) (succ u3)} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _x) (MulHomClass.toFunLike.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) (MonoidHomClass.toMulHomClass.{max (max u1 u2) u3, u1, max u2 u3} (MonoidHom.{u1, max u3 u2} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))) M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3))) (MonoidHom.monoidHomClass.{u1, max u2 u3} M (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) _inst_1 (Monoid.toMulOneClass.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (CommMonoid.toMonoid.{max u2 u3} (MonoidHom.{u2, u3} N P _inst_2 (Monoid.toMulOneClass.{u3} P (CommMonoid.toMonoid.{u3} P _inst_3))) (MonoidHom.commMonoid.{u2, u3} N P _inst_2 _inst_3)))))) f m) n))
Case conversion may be inaccurate. Consider using '#align monoid_hom.compr₂_apply MonoidHom.compr₂_applyₓ'. -/
@[simp, to_additive]
theorem compr₂_apply [MulOneClass M] [MulOneClass N] [CommMonoid P] [CommMonoid Q] (f : M →* N →* P)
    (g : P →* Q) (m : M) (n : N) : (compr₂ f g) m n = g (f m n) :=
  rfl
#align monoid_hom.compr₂_apply MonoidHom.compr₂_apply
#align add_monoid_hom.compr₂_apply AddMonoidHom.compr₂_apply

end MonoidHom

/-!
### Miscellaneous definitions

Due to the fact this file imports `algebra.group_power.basic`, it is not possible to import it in
some of the lower-level files like `algebra.ring.basic`. The following lemmas should be rehomed
if the import structure permits them to be.
-/

section Semiring

variable {R S : Type _} [NonUnitalNonAssocSemiring R] [NonUnitalNonAssocSemiring S]

#print AddMonoidHom.mul /-
/-- Multiplication of an element of a (semi)ring is an `add_monoid_hom` in both arguments.

This is a more-strongly bundled version of `add_monoid_hom.mul_left` and `add_monoid_hom.mul_right`.

Stronger versions of this exists for algebras as `linear_map.mul`, `non_unital_alg_hom.mul`
and `algebra.lmul`.
-/
def AddMonoidHom.mul : R →+ R →+ R
    where
  toFun := AddMonoidHom.mulLeft
  map_zero' := AddMonoidHom.ext <| MulZeroClass.zero_mul
  map_add' a b := AddMonoidHom.ext <| add_mul a b
#align add_monoid_hom.mul AddMonoidHom.mul
-/

/- warning: add_monoid_hom.mul_apply -> AddMonoidHom.mul_apply is a dubious translation:
lean 3 declaration is
  forall {R : Type.{u1}} [_inst_1 : NonUnitalNonAssocSemiring.{u1} R] (x : R) (y : R), Eq.{succ u1} R (coeFn.{succ u1, succ u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (fun (_x : AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) => R -> R) (AddMonoidHom.hasCoeToFun.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (coeFn.{succ u1, succ u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (fun (_x : AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) => R -> (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHom.hasCoeToFun.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHom.mul.{u1} R _inst_1) x) y) (HMul.hMul.{u1, u1, u1} R R R (instHMul.{u1} R (Distrib.toHasMul.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R _inst_1))) x y)
but is expected to have type
  forall {R : Type.{u1}} [_inst_1 : NonUnitalNonAssocSemiring.{u1} R] (x : R) (y : R), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => R) y) (FunLike.coe.{succ u1, succ u1, succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) x) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => R) _x) (AddHomClass.toFunLike.{u1, u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) x) R R (AddZeroClass.toAdd.{u1} R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddZeroClass.toAdd.{u1} R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHomClass.toAddHomClass.{u1, u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) x) R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoidHom.addMonoidHomClass.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))))) (FunLike.coe.{succ u1, succ u1, succ u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) _x) (AddHomClass.toFunLike.{u1, u1, u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddZeroClass.toAdd.{u1} R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddZeroClass.toAdd.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHomClass.toAddHomClass.{u1, u1, u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addMonoidHomClass.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))))) (AddMonoidHom.mul.{u1} R _inst_1) x) y) (HMul.hMul.{u1, u1, u1} R R R (instHMul.{u1} R (NonUnitalNonAssocSemiring.toMul.{u1} R _inst_1)) x y)
Case conversion may be inaccurate. Consider using '#align add_monoid_hom.mul_apply AddMonoidHom.mul_applyₓ'. -/
theorem AddMonoidHom.mul_apply (x y : R) : AddMonoidHom.mul x y = x * y :=
  rfl
#align add_monoid_hom.mul_apply AddMonoidHom.mul_apply

/- warning: add_monoid_hom.coe_mul -> AddMonoidHom.coe_mul is a dubious translation:
lean 3 declaration is
  forall {R : Type.{u1}} [_inst_1 : NonUnitalNonAssocSemiring.{u1} R], Eq.{succ u1} (R -> (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (coeFn.{succ u1, succ u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (fun (_x : AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) => R -> (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHom.hasCoeToFun.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHom.mul.{u1} R _inst_1)) (AddMonoidHom.mulLeft.{u1} R _inst_1)
but is expected to have type
  forall {R : Type.{u1}} [_inst_1 : NonUnitalNonAssocSemiring.{u1} R], Eq.{succ u1} (forall (ᾰ : R), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) ᾰ) (FunLike.coe.{succ u1, succ u1, succ u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) _x) (AddHomClass.toFunLike.{u1, u1, u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddZeroClass.toAdd.{u1} R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddZeroClass.toAdd.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHomClass.toAddHomClass.{u1, u1, u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addMonoidHomClass.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))))) (AddMonoidHom.mul.{u1} R _inst_1)) (AddMonoidHom.mulLeft.{u1} R _inst_1)
Case conversion may be inaccurate. Consider using '#align add_monoid_hom.coe_mul AddMonoidHom.coe_mulₓ'. -/
@[simp]
theorem AddMonoidHom.coe_mul : ⇑(AddMonoidHom.mul : R →+ R →+ R) = AddMonoidHom.mulLeft :=
  rfl
#align add_monoid_hom.coe_mul AddMonoidHom.coe_mul

/- warning: add_monoid_hom.coe_flip_mul -> AddMonoidHom.coe_flip_mul is a dubious translation:
lean 3 declaration is
  forall {R : Type.{u1}} [_inst_1 : NonUnitalNonAssocSemiring.{u1} R], Eq.{succ u1} (R -> (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (coeFn.{succ u1, succ u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (fun (_x : AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) => R -> (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHom.hasCoeToFun.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHom.flip.{u1, u1, u1} R R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1) (AddMonoidHom.mul.{u1} R _inst_1))) (AddMonoidHom.mulRight.{u1} R _inst_1)
but is expected to have type
  forall {R : Type.{u1}} [_inst_1 : NonUnitalNonAssocSemiring.{u1} R], Eq.{succ u1} (forall (ᾰ : R), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) ᾰ) (FunLike.coe.{succ u1, succ u1, succ u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) _x) (AddHomClass.toFunLike.{u1, u1, u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddZeroClass.toAdd.{u1} R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddZeroClass.toAdd.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) (AddMonoidHomClass.toAddHomClass.{u1, u1, u1} (AddMonoidHom.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))) R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addMonoidHomClass.{u1, u1} R (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1)))) (AddMonoidHom.addCommMonoid.{u1, u1} R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))))))) (AddMonoidHom.flip.{u1, u1, u1} R R R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1) (AddMonoidHom.mul.{u1} R _inst_1))) (AddMonoidHom.mulRight.{u1} R _inst_1)
Case conversion may be inaccurate. Consider using '#align add_monoid_hom.coe_flip_mul AddMonoidHom.coe_flip_mulₓ'. -/
@[simp]
theorem AddMonoidHom.coe_flip_mul :
    ⇑(AddMonoidHom.mul : R →+ R →+ R).flip = AddMonoidHom.mulRight :=
  rfl
#align add_monoid_hom.coe_flip_mul AddMonoidHom.coe_flip_mul

/- warning: add_monoid_hom.map_mul_iff -> AddMonoidHom.map_mul_iff is a dubious translation:
lean 3 declaration is
  forall {R : Type.{u1}} {S : Type.{u2}} [_inst_1 : NonUnitalNonAssocSemiring.{u1} R] [_inst_2 : NonUnitalNonAssocSemiring.{u2} S] (f : AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))), Iff (forall (x : R) (y : R), Eq.{succ u2} S (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (fun (_x : AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) => R -> S) (AddMonoidHom.hasCoeToFun.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) f (HMul.hMul.{u1, u1, u1} R R R (instHMul.{u1} R (Distrib.toHasMul.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R _inst_1))) x y)) (HMul.hMul.{u2, u2, u2} S S S (instHMul.{u2} S (Distrib.toHasMul.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S _inst_2))) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (fun (_x : AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) => R -> S) (AddMonoidHom.hasCoeToFun.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) f x) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (fun (_x : AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) => R -> S) (AddMonoidHom.hasCoeToFun.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) f y))) (Eq.{max (succ (max u2 u1)) (succ u1)} (AddMonoidHom.{u1, max u2 u1} R (AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{max u2 u1} (AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (AddCommMonoid.toAddMonoid.{max u2 u1} (AddMonoidHom.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (AddMonoidHom.addCommMonoid.{u1, u2} R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2))))) (AddMonoidHom.compr₂.{u1, u1, u1, u2} R R R S (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2) (AddMonoidHom.mul.{u1} R _inst_1) f) (AddMonoidHom.compl₂.{u1, u2, u2, u1} R S S R (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoidHom.comp.{u1, u2, u2} R S (AddMonoidHom.{u2, u2} S S (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (AddMonoid.toAddZeroClass.{u1} R (AddCommMonoid.toAddMonoid.{u1} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2))) (AddMonoid.toAddZeroClass.{u2} (AddMonoidHom.{u2, u2} S S (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (AddCommMonoid.toAddMonoid.{u2} (AddMonoidHom.{u2, u2} S S (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2))) (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (AddMonoidHom.addCommMonoid.{u2, u2} S S (AddMonoid.toAddZeroClass.{u2} S (AddCommMonoid.toAddMonoid.{u2} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} S _inst_2)))) (AddMonoidHom.mul.{u2} S _inst_2) f) f))
but is expected to have type
  forall {R : Type.{u2}} {S : Type.{u1}} [_inst_1 : NonUnitalNonAssocSemiring.{u2} R] [_inst_2 : NonUnitalNonAssocSemiring.{u1} S] (f : AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))), Iff (forall (x : R) (y : R), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) (HMul.hMul.{u2, u2, u2} R R R (instHMul.{u2} R (NonUnitalNonAssocSemiring.toMul.{u2} R _inst_1)) x y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) _x) (AddHomClass.toFunLike.{max u2 u1, u2, u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R S (AddZeroClass.toAdd.{u2} R (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1)))) (AddZeroClass.toAdd.{u1} S (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoidHomClass.toAddHomClass.{max u2 u1, u2, u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (AddMonoidHom.addMonoidHomClass.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))))) f (HMul.hMul.{u2, u2, u2} R R R (instHMul.{u2} R (NonUnitalNonAssocSemiring.toMul.{u2} R _inst_1)) x y)) (HMul.hMul.{u1, u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) x) ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) y) ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) x) (instHMul.{u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) x) (NonUnitalNonAssocSemiring.toMul.{u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) x) _inst_2)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) _x) (AddHomClass.toFunLike.{max u2 u1, u2, u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R S (AddZeroClass.toAdd.{u2} R (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1)))) (AddZeroClass.toAdd.{u1} S (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoidHomClass.toAddHomClass.{max u2 u1, u2, u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (AddMonoidHom.addMonoidHomClass.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R (fun (_x : R) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.403 : R) => S) _x) (AddHomClass.toFunLike.{max u2 u1, u2, u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R S (AddZeroClass.toAdd.{u2} R (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1)))) (AddZeroClass.toAdd.{u1} S (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoidHomClass.toAddHomClass.{max u2 u1, u2, u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (AddMonoidHom.addMonoidHomClass.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))))) f y))) (Eq.{max (succ u2) (succ u1)} (AddMonoidHom.{u2, max u1 u2} R (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{max u2 u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddCommMonoid.toAddMonoid.{max u2 u1} (AddMonoidHom.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoidHom.addCommMonoid.{u2, u1} R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))))) (AddMonoidHom.compr₂.{u2, u2, u2, u1} R R R S (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2) (AddMonoidHom.mul.{u2} R _inst_1) f) (AddMonoidHom.compl₂.{u2, u1, u1, u2} R S S R (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2) (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoidHom.comp.{u2, u1, u1} R S (AddMonoidHom.{u1, u1} S S (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoid.toAddZeroClass.{u2} R (AddCommMonoid.toAddMonoid.{u2} R (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R _inst_1))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (AddMonoid.toAddZeroClass.{u1} (AddMonoidHom.{u1, u1} S S (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddCommMonoid.toAddMonoid.{u1} (AddMonoidHom.{u1, u1} S S (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoidHom.addCommMonoid.{u1, u1} S S (AddMonoid.toAddZeroClass.{u1} S (AddCommMonoid.toAddMonoid.{u1} S (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2))) (NonUnitalNonAssocSemiring.toAddCommMonoid.{u1} S _inst_2)))) (AddMonoidHom.mul.{u1} S _inst_2) f) f))
Case conversion may be inaccurate. Consider using '#align add_monoid_hom.map_mul_iff AddMonoidHom.map_mul_iffₓ'. -/
/-- An `add_monoid_hom` preserves multiplication if pre- and post- composition with
`add_monoid_hom.mul` are equivalent. By converting the statement into an equality of
`add_monoid_hom`s, this lemma allows various specialized `ext` lemmas about `→+` to then be applied.
-/
theorem AddMonoidHom.map_mul_iff (f : R →+ S) :
    (∀ x y, f (x * y) = f x * f y) ↔
      (AddMonoidHom.mul : R →+ R →+ R).compr₂ f = (AddMonoidHom.mul.comp f).compl₂ f :=
  Iff.symm AddMonoidHom.ext_iff₂
#align add_monoid_hom.map_mul_iff AddMonoidHom.map_mul_iff

#print AddMonoid.End.mulLeft /-
/-- The left multiplication map: `(a, b) ↦ a * b`. See also `add_monoid_hom.mul_left`. -/
@[simps]
def AddMonoid.End.mulLeft : R →+ AddMonoid.End R :=
  AddMonoidHom.mul
#align add_monoid.End.mul_left AddMonoid.End.mulLeft
-/

#print AddMonoid.End.mulRight /-
/-- The right multiplication map: `(a, b) ↦ b * a`. See also `add_monoid_hom.mul_right`. -/
@[simps]
def AddMonoid.End.mulRight : R →+ AddMonoid.End R :=
  (AddMonoidHom.mul : R →+ AddMonoid.End R).flip
#align add_monoid.End.mul_right AddMonoid.End.mulRight
-/

end Semiring