group_theory.congruenceMathlib.GroupTheory.Congruence

This file has been ported!

Changes since the initial port

The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(last sync)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Amelia Livingston
 -/
 import Algebra.Group.Prod
-import Algebra.Hom.Equiv.Basic
+import Algebra.Group.Equiv.Basic
 import Data.Setoid.Basic
 import GroupTheory.Submonoid.Operations
 
@@ -1287,7 +1287,7 @@ section Monoids
 protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
     ∀ (n : ℕ) {w x}, c w x → c (w ^ n) (x ^ n)
   | 0, w, x, h => by simpa using c.refl _
-  | Nat.succ n, w, x, h => by simpa [pow_succ] using c.mul h (pow n h)
+  | Nat.succ n, w, x, h => by simpa [pow_succ'] using c.mul h (pow n h)
 #align con.pow Con.pow
 #align add_con.nsmul AddCon.nsmul
 -/
@@ -1384,7 +1384,7 @@ protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) :=
 /-- Multiplicative congruence relations preserve integer powers. -/
 @[to_additive AddCon.zsmul "Additive congruence relations preserve integer scaling."]
 protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
-  | Int.ofNat n, w, x, h => by simpa only [zpow_coe_nat] using c.pow _ h
+  | Int.ofNat n, w, x, h => by simpa only [zpow_natCast] using c.pow _ h
   | -[n+1], w, x, h => by simpa only [zpow_negSucc] using c.inv (c.pow _ h)
 #align con.zpow Con.zpow
 #align add_con.zsmul AddCon.zsmul
Diff
@@ -781,7 +781,7 @@ def correspondence : { d // c ≤ d } ≃o Con c.Quotient
     let Hm :
       (mulKer (coe : M → c.Quotient) fun x y => rfl) ≤
         comap (coe : M → c.Quotient) (fun x y => rfl) d :=
-      fun x y h => show d _ _ by rw [mul_ker_mk_eq] at h  <;> exact c.eq.2 h ▸ d.refl _
+      fun x y h => show d _ _ by rw [mul_ker_mk_eq] at h <;> exact c.eq.2 h ▸ d.refl _
     ext fun x y =>
       ⟨fun h =>
         let ⟨a, b, hx, hy, H⟩ := h
Diff
@@ -1384,7 +1384,7 @@ protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) :=
 /-- Multiplicative congruence relations preserve integer powers. -/
 @[to_additive AddCon.zsmul "Additive congruence relations preserve integer scaling."]
 protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
-  | Int.ofNat n, w, x, h => by simpa only [zpow_ofNat] using c.pow _ h
+  | Int.ofNat n, w, x, h => by simpa only [zpow_coe_nat] using c.pow _ h
   | -[n+1], w, x, h => by simpa only [zpow_negSucc] using c.inv (c.pow _ h)
 #align con.zpow Con.zpow
 #align add_con.zsmul AddCon.zsmul
Diff
@@ -233,14 +233,14 @@ theorem ext_iff {c d : Con M} : (∀ x y, c x y ↔ d x y) ↔ c = d :=
 #align add_con.ext_iff AddCon.ext_iff
 -/
 
-#print Con.ext'_iff /-
+#print Con.coe_inj /-
 /-- Two congruence relations are equal iff their underlying binary relations are equal. -/
 @[to_additive
       "Two additive congruence relations are equal iff their underlying binary relations\nare equal."]
-theorem ext'_iff {c d : Con M} : c.R = d.R ↔ c = d :=
+theorem coe_inj {c d : Con M} : c.R = d.R ↔ c = d :=
   ⟨ext', fun h => h ▸ rfl⟩
-#align con.ext'_iff Con.ext'_iff
-#align add_con.ext'_iff AddCon.ext'_iff
+#align con.ext'_iff Con.coe_inj
+#align add_con.ext'_iff AddCon.coe_inj
 -/
 
 #print Con.mulKer /-
@@ -499,15 +499,15 @@ theorem sInf_toSetoid (S : Set (Con M)) : (sInf S).toSetoid = sInf (toSetoid ''
 #align add_con.Inf_to_setoid AddCon.sInf_toSetoid
 -/
 
-#print Con.sInf_def /-
+#print Con.coe_sInf /-
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying binary relation. -/
 @[to_additive
       "The infimum of a set of additive congruence relations is the same as the infimum\nof the set's image under the map to the underlying binary relation."]
-theorem sInf_def (S : Set (Con M)) : ⇑(sInf S) = sInf (@Set.image (Con M) (M → M → Prop) coeFn S) :=
+theorem coe_sInf (S : Set (Con M)) : ⇑(sInf S) = sInf (@Set.image (Con M) (M → M → Prop) coeFn S) :=
   by ext; simp only [sInf_image, iInf_apply, iInf_Prop_eq]; rfl
-#align con.Inf_def Con.sInf_def
-#align add_con.Inf_def AddCon.sInf_def
+#align con.Inf_def Con.coe_sInf
+#align add_con.Inf_def AddCon.coe_sInf
 -/
 
 @[to_additive]
@@ -538,15 +538,15 @@ instance : CompleteLattice (Con M) :=
     bot := { Setoid.completeLattice.bot with mul' := fun _ _ _ _ h1 h2 => h1 ▸ h2 ▸ rfl }
     bot_le := fun c x y h => h ▸ c.refl x }
 
-#print Con.inf_def /-
+#print Con.coe_inf /-
 /-- The infimum of two congruence relations equals the infimum of the underlying binary
     operations. -/
 @[to_additive
       "The infimum of two additive congruence relations equals the infimum of the\nunderlying binary operations."]
-theorem inf_def {c d : Con M} : (c ⊓ d).R = c.R ⊓ d.R :=
+theorem coe_inf {c d : Con M} : (c ⊓ d).R = c.R ⊓ d.R :=
   rfl
-#align con.inf_def Con.inf_def
-#align add_con.inf_def AddCon.inf_def
+#align con.inf_def Con.coe_inf
+#align add_con.inf_def AddCon.coe_inf
 -/
 
 #print Con.inf_iff_and /-
Diff
@@ -3,10 +3,10 @@ Copyright (c) 2019 Amelia Livingston. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Amelia Livingston
 -/
-import Mathbin.Algebra.Group.Prod
-import Mathbin.Algebra.Hom.Equiv.Basic
-import Mathbin.Data.Setoid.Basic
-import Mathbin.GroupTheory.Submonoid.Operations
+import Algebra.Group.Prod
+import Algebra.Hom.Equiv.Basic
+import Data.Setoid.Basic
+import GroupTheory.Submonoid.Operations
 
 #align_import group_theory.congruence from "leanprover-community/mathlib"@"cc70d9141824ea8982d1562ce009952f2c3ece30"
 
Diff
@@ -844,7 +844,7 @@ protected def submonoid : Submonoid (M × M)
     where
   carrier := {x | c x.1 x.2}
   one_mem' := c.iseqv.1 1
-  mul_mem' _ _ := c.mul
+  hMul_mem' _ _ := c.mul
 #align con.submonoid Con.submonoid
 #align add_con.add_submonoid AddCon.addSubmonoid
 -/
@@ -860,7 +860,7 @@ def ofSubmonoid (N : Submonoid (M × M)) (H : Equivalence fun x y => (x, y) ∈
     where
   R x y := (x, y) ∈ N
   iseqv := H
-  mul' _ _ _ _ := N.mul_mem
+  mul' _ _ _ _ := N.hMul_mem
 #align con.of_submonoid Con.ofSubmonoid
 #align add_con.of_add_submonoid AddCon.ofAddSubmonoid
 -/
@@ -1002,7 +1002,7 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
     `f`. -/
 @[to_additive
       "Given an `add_monoid` homomorphism `f : N → M` and an additive congruence relation\n`c` on `M`, the additive congruence relation induced on `N` by `f` equals the kernel of `c`'s\nquotient homomorphism composed with `f`."]
-theorem comap_eq {f : N →* M} : comap f f.map_mul c = ker (c.mk'.comp f) :=
+theorem comap_eq {f : N →* M} : comap f f.map_hMul c = ker (c.mk'.comp f) :=
   ext fun x y => show c _ _ ↔ c.mk' _ = c.mk' _ by rw [← c.eq] <;> rfl
 #align con.comap_eq Con.comap_eq
 #align add_con.comap_eq AddCon.comap_eq
@@ -1019,7 +1019,7 @@ def lift (H : c ≤ ker f) : c.Quotient →* P
     where
   toFun x := Con.liftOn x f fun _ _ h => H h
   map_one' := by rw [← f.map_one] <;> rfl
-  map_mul' x y := Con.induction_on₂ x y fun m n => f.map_mul m n ▸ rfl
+  map_mul' x y := Con.induction_on₂ x y fun m n => f.map_hMul m n ▸ rfl
 #align con.lift Con.lift
 #align add_con.lift AddCon.lift
 -/
@@ -1257,7 +1257,7 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
 /-- The second isomorphism theorem for monoids. -/
 @[to_additive "The second isomorphism theorem for `add_monoid`s."]
 noncomputable def comapQuotientEquiv (f : N →* M) :
-    (comap f f.map_mul c).Quotient ≃* (c.mk'.comp f).mrange :=
+    (comap f f.map_hMul c).Quotient ≃* (c.mk'.comp f).mrange :=
   (Con.congr comap_eq).trans <| quotientKerEquivRange <| c.mk'.comp f
 #align con.comap_quotient_equiv Con.comapQuotientEquiv
 #align add_con.comap_quotient_equiv AddCon.comapQuotientEquiv
@@ -1527,7 +1527,7 @@ instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M]
     where
   smul := (· • ·)
   one_smul := Quotient.ind' fun x => congr_arg Quotient.mk'' <| one_smul _ _
-  mul_smul a₁ a₂ := Quotient.ind' fun x => congr_arg Quotient.mk'' <| mul_smul _ _ _
+  hMul_smul a₁ a₂ := Quotient.ind' fun x => congr_arg Quotient.mk'' <| mul_smul _ _ _
 #align con.mul_action Con.mulAction
 #align add_con.add_action AddCon.addAction
 -/
@@ -1538,7 +1538,7 @@ instance mulDistribMulAction {α M : Type _} [Monoid α] [Monoid M] [MulDistribM
   { c.MulAction with
     smul := (· • ·)
     smul_one := fun r => congr_arg Quotient.mk'' <| smul_one _
-    smul_mul := fun r => Quotient.ind₂' fun m₁ m₂ => congr_arg Quotient.mk'' <| smul_mul' _ _ _ }
+    smul_hMul := fun r => Quotient.ind₂' fun m₁ m₂ => congr_arg Quotient.mk'' <| smul_mul' _ _ _ }
 #align con.mul_distrib_mul_action Con.mulDistribMulAction
 -/
 
Diff
@@ -1503,12 +1503,12 @@ end Units
 
 section Actions
 
-#print Con.smulinst /-
+#print Con.instSMul /-
 @[to_additive]
-instance smulinst {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
+instance instSMul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
     SMul α c.Quotient where smul a := Quotient.map' ((· • ·) a) fun x y => c.smul a
-#align con.has_smul Con.smulinst
-#align add_con.has_vadd AddCon.smulinst
+#align con.has_smul Con.instSMul
+#align add_con.has_vadd AddCon.instVAdd
 -/
 
 #print Con.coe_smul /-
Diff
@@ -985,7 +985,6 @@ theorem mrange_mk' : c.mk'.mrange = ⊤ :=
 #align add_con.mrange_mk' AddCon.mrange_mk'
 -/
 
-#print Con.ker_apply_eq_preimage /-
 /-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
     those in the preimage of `f(x)` under `f`. -/
 @[to_additive
@@ -996,7 +995,6 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
       (Set.mem_singleton_iff.1 <| Set.mem_preimage.1 h).symm⟩
 #align con.ker_apply_eq_preimage Con.ker_apply_eq_preimage
 #align add_con.ker_apply_eq_preimage AddCon.ker_apply_eq_preimage
--/
 
 #print Con.comap_eq /-
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
Diff
@@ -2,17 +2,14 @@
 Copyright (c) 2019 Amelia Livingston. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Amelia Livingston
-
-! This file was ported from Lean 3 source module group_theory.congruence
-! leanprover-community/mathlib commit cc70d9141824ea8982d1562ce009952f2c3ece30
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathbin.Algebra.Group.Prod
 import Mathbin.Algebra.Hom.Equiv.Basic
 import Mathbin.Data.Setoid.Basic
 import Mathbin.GroupTheory.Submonoid.Operations
 
+#align_import group_theory.congruence from "leanprover-community/mathlib"@"cc70d9141824ea8982d1562ce009952f2c3ece30"
+
 /-!
 # Congruence relations
 
Diff
@@ -352,6 +352,7 @@ protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quoti
 #align add_con.hrec_on₂ AddCon.hrecOn₂
 -/
 
+#print Con.hrec_on₂_coe /-
 @[simp, to_additive]
 theorem hrec_on₂_coe {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort _} (a : M)
     (b : N) (f : ∀ (x : M) (y : N), φ x y)
@@ -360,6 +361,7 @@ theorem hrec_on₂_coe {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotie
   rfl
 #align con.hrec_on₂_coe Con.hrec_on₂_coe
 #align add_con.hrec_on₂_coe AddCon.hrec_on₂_coe
+-/
 
 variable {c}
 
@@ -488,6 +490,7 @@ instance : InfSet (Con M) :=
           c.trans (h1 c hc) <| h2 c hc⟩⟩,
       fun _ _ _ _ h1 h2 c hc => c.mul (h1 c hc) <| h2 c hc⟩⟩
 
+#print Con.sInf_toSetoid /-
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying equivalence relation. -/
 @[to_additive
@@ -497,7 +500,9 @@ theorem sInf_toSetoid (S : Set (Con M)) : (sInf S).toSetoid = sInf (toSetoid ''
     ⟨fun h r ⟨c, hS, hr⟩ => by rw [← hr] <;> exact h c hS, fun h c hS => h c.toSetoid ⟨c, hS, rfl⟩⟩
 #align con.Inf_to_setoid Con.sInf_toSetoid
 #align add_con.Inf_to_setoid AddCon.sInf_toSetoid
+-/
 
+#print Con.sInf_def /-
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying binary relation. -/
 @[to_additive
@@ -506,6 +511,7 @@ theorem sInf_def (S : Set (Con M)) : ⇑(sInf S) = sInf (@Set.image (Con M) (M 
   by ext; simp only [sInf_image, iInf_apply, iInf_Prop_eq]; rfl
 #align con.Inf_def Con.sInf_def
 #align add_con.Inf_def AddCon.sInf_def
+-/
 
 @[to_additive]
 instance : PartialOrder (Con M) where
@@ -535,6 +541,7 @@ instance : CompleteLattice (Con M) :=
     bot := { Setoid.completeLattice.bot with mul' := fun _ _ _ _ h1 h2 => h1 ▸ h2 ▸ rfl }
     bot_le := fun c x y h => h ▸ c.refl x }
 
+#print Con.inf_def /-
 /-- The infimum of two congruence relations equals the infimum of the underlying binary
     operations. -/
 @[to_additive
@@ -543,14 +550,18 @@ theorem inf_def {c d : Con M} : (c ⊓ d).R = c.R ⊓ d.R :=
   rfl
 #align con.inf_def Con.inf_def
 #align add_con.inf_def AddCon.inf_def
+-/
 
+#print Con.inf_iff_and /-
 /-- Definition of the infimum of two congruence relations. -/
 @[to_additive "Definition of the infimum of two additive congruence relations."]
 theorem inf_iff_and {c d : Con M} {x y} : (c ⊓ d) x y ↔ c x y ∧ d x y :=
   Iff.rfl
 #align con.inf_iff_and Con.inf_iff_and
 #align add_con.inf_iff_and AddCon.inf_iff_and
+-/
 
+#print Con.conGen_eq /-
 /-- The inductively defined smallest congruence relation containing a binary relation `r` equals
     the infimum of the set of congruence relations containing `r`. -/
 @[to_additive add_con_gen_eq
@@ -563,6 +574,7 @@ theorem conGen_eq (r : M → M → Prop) : conGen r = sInf {s : Con M | ∀ x y,
     (sInf_le fun _ _ => ConGen.Rel.of _ _)
 #align con.con_gen_eq Con.conGen_eq
 #align add_con.add_con_gen_eq AddCon.addConGen_eq
+-/
 
 #print Con.conGen_le /-
 /-- The smallest congruence relation containing a binary relation `r` is contained in any
@@ -609,6 +621,7 @@ theorem conGen_idem (r : M → M → Prop) : conGen (conGen r) = conGen r :=
 #align add_con.add_con_gen_idem AddCon.addConGen_idem
 -/
 
+#print Con.sup_eq_conGen /-
 /-- The supremum of congruence relations `c, d` equals the smallest congruence relation containing
     the binary relation '`x` is related to `y` by `c` or `d`'. -/
 @[to_additive sup_eq_add_con_gen
@@ -620,7 +633,9 @@ theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x
   simp only [le_def, or_imp, ← forall_and]
 #align con.sup_eq_con_gen Con.sup_eq_conGen
 #align add_con.sup_eq_add_con_gen AddCon.sup_eq_addConGen
+-/
 
+#print Con.sup_def /-
 /-- The supremum of two congruence relations equals the smallest congruence relation containing
     the supremum of the underlying binary operations. -/
 @[to_additive
@@ -628,7 +643,9 @@ theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x
 theorem sup_def {c d : Con M} : c ⊔ d = conGen (c.R ⊔ d.R) := by rw [sup_eq_con_gen] <;> rfl
 #align con.sup_def Con.sup_def
 #align add_con.sup_def AddCon.sup_def
+-/
 
+#print Con.sSup_eq_conGen /-
 /-- The supremum of a set of congruence relations `S` equals the smallest congruence relation
     containing the binary relation 'there exists `c ∈ S` such that `x` is related to `y` by
     `c`'. -/
@@ -642,7 +659,9 @@ theorem sSup_eq_conGen (S : Set (Con M)) : sSup S = conGen fun x y => ∃ c : Co
   exact ⟨fun h _ _ ⟨r, hr⟩ => h hr.1 hr.2, fun h r hS _ _ hr => h _ _ ⟨r, hS, hr⟩⟩
 #align con.Sup_eq_con_gen Con.sSup_eq_conGen
 #align add_con.Sup_eq_add_con_gen AddCon.sSup_eq_addConGen
+-/
 
+#print Con.sSup_def /-
 /-- The supremum of a set of congruence relations is the same as the smallest congruence relation
     containing the supremum of the set's image under the map to the underlying binary relation. -/
 @[to_additive
@@ -655,9 +674,11 @@ theorem sSup_def {S : Set (Con M)} :
   simp only [sSup_image, iSup_apply, iSup_Prop_eq, exists_prop, rel_eq_coe]
 #align con.Sup_def Con.sSup_def
 #align add_con.Sup_def AddCon.sSup_def
+-/
 
 variable (M)
 
+#print Con.gi /-
 /-- There is a Galois insertion of congruence relations on a type with a multiplication `M` into
     binary relations on `M`. -/
 @[to_additive
@@ -670,6 +691,7 @@ protected def gi : @GaloisInsertion (M → M → Prop) (Con M) _ _ conGen coeFn
   choice_eq _ _ := rfl
 #align con.gi Con.gi
 #align add_con.gi AddCon.gi
+-/
 
 variable {M} (c)
 
@@ -700,6 +722,7 @@ def mapOfSurjective (f : M → N) (H : ∀ x y, f (x * y) = f x * f y) (h : mulK
 #align add_con.map_of_surjective AddCon.mapOfSurjective
 -/
 
+#print Con.mapOfSurjective_eq_mapGen /-
 /-- A specialization of 'the smallest congruence relation containing a congruence relation `c`
     equals `c`'. -/
 @[to_additive
@@ -709,6 +732,7 @@ theorem mapOfSurjective_eq_mapGen {c : Con M} {f : M → N} (H : ∀ x y, f (x *
   rw [← con_gen_of_con (c.map_of_surjective f H h hf)] <;> rfl
 #align con.map_of_surjective_eq_map_gen Con.mapOfSurjective_eq_mapGen
 #align add_con.map_of_surjective_eq_map_gen AddCon.mapOfSurjective_eq_mapGen
+-/
 
 #print Con.comap /-
 /-- Given types with multiplications `M, N` and a congruence relation `c` on `N`, a
@@ -785,6 +809,7 @@ section MulOneClass
 
 variable {M} [MulOneClass M] [MulOneClass N] [MulOneClass P] (c : Con M)
 
+#print Con.mulOneClass /-
 /-- The quotient of a monoid by a congruence relation is a monoid. -/
 @[to_additive
       "The quotient of an `add_monoid` by an additive congruence relation is\nan `add_monoid`."]
@@ -796,9 +821,11 @@ instance mulOneClass : MulOneClass c.Quotient
   one_mul x := Quotient.inductionOn' x fun _ => congr_arg (coe : M → c.Quotient) <| one_mul _
 #align con.mul_one_class Con.mulOneClass
 #align add_con.add_zero_class AddCon.addZeroClass
+-/
 
 variable {c}
 
+#print Con.coe_one /-
 /-- The 1 of the quotient of a monoid by a congruence relation is the equivalence class of the
     monoid's 1. -/
 @[simp,
@@ -808,9 +835,11 @@ theorem coe_one : ((1 : M) : c.Quotient) = 1 :=
   rfl
 #align con.coe_one Con.coe_one
 #align add_con.coe_zero AddCon.coe_zero
+-/
 
 variable (M c)
 
+#print Con.submonoid /-
 /-- The submonoid of `M × M` defined by a congruence relation on a monoid `M`. -/
 @[to_additive
       "The `add_submonoid` of `M × M` defined by an additive congruence\nrelation on an `add_monoid` `M`."]
@@ -821,9 +850,11 @@ protected def submonoid : Submonoid (M × M)
   mul_mem' _ _ := c.mul
 #align con.submonoid Con.submonoid
 #align add_con.add_submonoid AddCon.addSubmonoid
+-/
 
 variable {M c}
 
+#print Con.ofSubmonoid /-
 /-- The congruence relation on a monoid `M` from a submonoid of `M × M` for which membership
     is an equivalence relation. -/
 @[to_additive
@@ -835,7 +866,9 @@ def ofSubmonoid (N : Submonoid (M × M)) (H : Equivalence fun x y => (x, y) ∈
   mul' _ _ _ _ := N.mul_mem
 #align con.of_submonoid Con.ofSubmonoid
 #align add_con.of_add_submonoid AddCon.ofAddSubmonoid
+-/
 
+#print Con.toSubmonoid /-
 /-- Coercion from a congruence relation `c` on a monoid `M` to the submonoid of `M × M` whose
     elements are `(x, y)` such that `x` is related to `y` by `c`. -/
 @[to_additive
@@ -844,32 +877,42 @@ instance toSubmonoid : Coe (Con M) (Submonoid (M × M)) :=
   ⟨fun c => c.Submonoid M⟩
 #align con.to_submonoid Con.toSubmonoid
 #align add_con.to_add_submonoid AddCon.toAddSubmonoid
+-/
 
+#print Con.mem_coe /-
 @[to_additive]
 theorem mem_coe {c : Con M} {x y} : (x, y) ∈ (↑c : Submonoid (M × M)) ↔ (x, y) ∈ c :=
   Iff.rfl
 #align con.mem_coe Con.mem_coe
 #align add_con.mem_coe AddCon.mem_coe
+-/
 
+#print Con.to_submonoid_inj /-
 @[to_additive]
 theorem to_submonoid_inj (c d : Con M) (H : (c : Submonoid (M × M)) = d) : c = d :=
   ext fun x y => show (x, y) ∈ (c : Submonoid (M × M)) ↔ (x, y) ∈ ↑d by rw [H]
 #align con.to_submonoid_inj Con.to_submonoid_inj
 #align add_con.to_add_submonoid_inj AddCon.to_addSubmonoid_inj
+-/
 
+#print Con.le_iff /-
 @[to_additive]
 theorem le_iff {c d : Con M} : c ≤ d ↔ (c : Submonoid (M × M)) ≤ d :=
   ⟨fun h x H => h H, fun h x y hc => h <| show (x, y) ∈ c from hc⟩
 #align con.le_iff Con.le_iff
 #align add_con.le_iff AddCon.le_iff
+-/
 
+#print Con.ker /-
 /-- The kernel of a monoid homomorphism as a congruence relation. -/
 @[to_additive "The kernel of an `add_monoid` homomorphism as an additive congruence relation."]
 def ker (f : M →* P) : Con M :=
   mulKer f f.3
 #align con.ker Con.ker
 #align add_con.ker AddCon.ker
+-/
 
+#print Con.ker_rel /-
 /-- The definition of the congruence relation defined by a monoid homomorphism's kernel. -/
 @[simp,
   to_additive
@@ -878,7 +921,9 @@ theorem ker_rel (f : M →* P) {x y} : ker f x y ↔ f x = f y :=
   Iff.rfl
 #align con.ker_rel Con.ker_rel
 #align add_con.ker_rel AddCon.ker_rel
+-/
 
+#print Con.Quotient.inhabited /-
 /-- There exists an element of the quotient of a monoid by a congruence relation (namely 1). -/
 @[to_additive
       "There exists an element of the quotient of an `add_monoid` by a congruence relation\n(namely 0)."]
@@ -886,9 +931,11 @@ instance Quotient.inhabited : Inhabited c.Quotient :=
   ⟨((1 : M) : c.Quotient)⟩
 #align con.quotient.inhabited Con.Quotient.inhabited
 #align add_con.quotient.inhabited AddCon.Quotient.inhabited
+-/
 
 variable (c)
 
+#print Con.mk' /-
 /-- The natural homomorphism from a monoid to its quotient by a congruence relation. -/
 @[to_additive
       "The natural homomorphism from an `add_monoid` to its quotient by an additive\ncongruence relation."]
@@ -896,9 +943,11 @@ def mk' : M →* c.Quotient :=
   ⟨coe, rfl, fun _ _ => rfl⟩
 #align con.mk' Con.mk'
 #align add_con.mk' AddCon.mk'
+-/
 
 variable (x y : M)
 
+#print Con.mk'_ker /-
 /-- The kernel of the natural homomorphism from a monoid to its quotient by a congruence
     relation `c` equals `c`. -/
 @[simp,
@@ -908,9 +957,11 @@ theorem mk'_ker : ker c.mk' = c :=
   ext fun _ _ => c.Eq
 #align con.mk'_ker Con.mk'_ker
 #align add_con.mk'_ker AddCon.mk'_ker
+-/
 
 variable {c}
 
+#print Con.mk'_surjective /-
 /-- The natural homomorphism from a monoid to its quotient by a congruence relation is
     surjective. -/
 @[to_additive
@@ -919,19 +970,25 @@ theorem mk'_surjective : Surjective c.mk' :=
   Quotient.surjective_Quotient_mk''
 #align con.mk'_surjective Con.mk'_surjective
 #align add_con.mk'_surjective AddCon.mk'_surjective
+-/
 
+#print Con.coe_mk' /-
 @[simp, to_additive]
 theorem coe_mk' : (c.mk' : M → c.Quotient) = coe :=
   rfl
 #align con.coe_mk' Con.coe_mk'
 #align add_con.coe_mk' AddCon.coe_mk'
+-/
 
+#print Con.mrange_mk' /-
 @[simp, to_additive]
 theorem mrange_mk' : c.mk'.mrange = ⊤ :=
   MonoidHom.mrange_top_iff_surjective.2 mk'_surjective
 #align con.mrange_mk' Con.mrange_mk'
 #align add_con.mrange_mk' AddCon.mrange_mk'
+-/
 
+#print Con.ker_apply_eq_preimage /-
 /-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
     those in the preimage of `f(x)` under `f`. -/
 @[to_additive
@@ -942,7 +999,9 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
       (Set.mem_singleton_iff.1 <| Set.mem_preimage.1 h).symm⟩
 #align con.ker_apply_eq_preimage Con.ker_apply_eq_preimage
 #align add_con.ker_apply_eq_preimage AddCon.ker_apply_eq_preimage
+-/
 
+#print Con.comap_eq /-
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
     relation induced on `N` by `f` equals the kernel of `c`'s quotient homomorphism composed with
     `f`. -/
@@ -952,9 +1011,11 @@ theorem comap_eq {f : N →* M} : comap f f.map_mul c = ker (c.mk'.comp f) :=
   ext fun x y => show c _ _ ↔ c.mk' _ = c.mk' _ by rw [← c.eq] <;> rfl
 #align con.comap_eq Con.comap_eq
 #align add_con.comap_eq AddCon.comap_eq
+-/
 
 variable (c) (f : M →* P)
 
+#print Con.lift /-
 /-- The homomorphism on the quotient of a monoid by a congruence relation `c` induced by a
     homomorphism constant on `c`'s equivalence classes. -/
 @[to_additive
@@ -966,9 +1027,11 @@ def lift (H : c ≤ ker f) : c.Quotient →* P
   map_mul' x y := Con.induction_on₂ x y fun m n => f.map_mul m n ▸ rfl
 #align con.lift Con.lift
 #align add_con.lift AddCon.lift
+-/
 
 variable {c f}
 
+#print Con.lift_mk' /-
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[to_additive
       "The diagram describing the universal property for quotients of `add_monoid`s\ncommutes."]
@@ -976,7 +1039,9 @@ theorem lift_mk' (H : c ≤ ker f) (x) : c.lift f H (c.mk' x) = f x :=
   rfl
 #align con.lift_mk' Con.lift_mk'
 #align add_con.lift_mk' AddCon.lift_mk'
+-/
 
+#print Con.lift_coe /-
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[simp,
   to_additive
@@ -985,7 +1050,9 @@ theorem lift_coe (H : c ≤ ker f) (x : M) : c.lift f H x = f x :=
   rfl
 #align con.lift_coe Con.lift_coe
 #align add_con.lift_coe AddCon.lift_coe
+-/
 
+#print Con.lift_comp_mk' /-
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[simp,
   to_additive
@@ -993,7 +1060,9 @@ theorem lift_coe (H : c ≤ ker f) (x : M) : c.lift f H x = f x :=
 theorem lift_comp_mk' (H : c ≤ ker f) : (c.lift f H).comp c.mk' = f := by ext <;> rfl
 #align con.lift_comp_mk' Con.lift_comp_mk'
 #align add_con.lift_comp_mk' AddCon.lift_comp_mk'
+-/
 
+#print Con.lift_apply_mk' /-
 /-- Given a homomorphism `f` from the quotient of a monoid by a congruence relation, `f` equals the
     homomorphism on the quotient induced by `f` composed with the natural map from the monoid to
     the quotient. -/
@@ -1005,7 +1074,9 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
   ext <;> rcases x with ⟨⟩ <;> rfl
 #align con.lift_apply_mk' Con.lift_apply_mk'
 #align add_con.lift_apply_mk' AddCon.lift_apply_mk'
+-/
 
+#print Con.lift_funext /-
 /-- Homomorphisms on the quotient of a monoid by a congruence relation are equal if they
     are equal on elements that are coercions from the monoid. -/
 @[to_additive
@@ -1017,7 +1088,9 @@ theorem lift_funext (f g : c.Quotient →* P) (h : ∀ a : M, f a = g a) : f = g
   exact MonoidHom.ext_iff.2 h
 #align con.lift_funext Con.lift_funext
 #align add_con.lift_funext AddCon.lift_funext
+-/
 
+#print Con.lift_unique /-
 /-- The uniqueness part of the universal property for quotients of monoids. -/
 @[to_additive "The uniqueness part of the universal property for quotients of `add_monoid`s."]
 theorem lift_unique (H : c ≤ ker f) (g : c.Quotient →* P) (Hg : g.comp c.mk' = f) :
@@ -1025,7 +1098,9 @@ theorem lift_unique (H : c ≤ ker f) (g : c.Quotient →* P) (Hg : g.comp c.mk'
   lift_funext g (c.lift f H) fun x => by subst f; rfl
 #align con.lift_unique Con.lift_unique
 #align add_con.lift_unique AddCon.lift_unique
+-/
 
+#print Con.lift_range /-
 /-- Given a congruence relation `c` on a monoid and a homomorphism `f` constant on `c`'s
     equivalence classes, `f` has the same image as the homomorphism that `f` induces on the
     quotient. -/
@@ -1035,7 +1110,9 @@ theorem lift_range (H : c ≤ ker f) : (c.lift f H).mrange = f.mrange :=
   Submonoid.ext fun x => ⟨by rintro ⟨⟨y⟩, hy⟩ <;> exact ⟨y, hy⟩, fun ⟨y, hy⟩ => ⟨↑y, hy⟩⟩
 #align con.lift_range Con.lift_range
 #align add_con.lift_range AddCon.lift_range
+-/
 
+#print Con.lift_surjective_of_surjective /-
 /-- Surjective monoid homomorphisms constant on a congruence relation `c`'s equivalence classes
     induce a surjective homomorphism on `c`'s quotient. -/
 @[to_additive
@@ -1044,9 +1121,11 @@ theorem lift_surjective_of_surjective (h : c ≤ ker f) (hf : Surjective f) :
     Surjective (c.lift f h) := fun y => Exists.elim (hf y) fun w hw => ⟨w, (lift_mk' h w).symm ▸ hw⟩
 #align con.lift_surjective_of_surjective Con.lift_surjective_of_surjective
 #align add_con.lift_surjective_of_surjective AddCon.lift_surjective_of_surjective
+-/
 
 variable (c f)
 
+#print Con.ker_eq_lift_of_injective /-
 /-- Given a monoid homomorphism `f` from `M` to `P`, the kernel of `f` is the unique congruence
     relation on `M` whose induced map from the quotient of `M` to `P` is injective. -/
 @[to_additive
@@ -1055,6 +1134,7 @@ theorem ker_eq_lift_of_injective (H : c ≤ ker f) (h : Injective (c.lift f H))
   toSetoid_inj <| ker_eq_lift_of_injective f H h
 #align con.ker_eq_lift_of_injective Con.ker_eq_lift_of_injective
 #align add_con.ker_eq_lift_of_injective AddCon.ker_eq_lift_of_injective
+-/
 
 variable {c}
 
@@ -1070,6 +1150,7 @@ def kerLift : (ker f).Quotient →* P :=
 
 variable {f}
 
+#print Con.kerLift_mk /-
 /-- The diagram described by the universal property for quotients of monoids, when the congruence
     relation is the kernel of the homomorphism, commutes. -/
 @[simp,
@@ -1079,6 +1160,7 @@ theorem kerLift_mk (x : M) : kerLift f x = f x :=
   rfl
 #align con.ker_lift_mk Con.kerLift_mk
 #align add_con.ker_lift_mk AddCon.kerLift_mk
+-/
 
 #print Con.kerLift_range_eq /-
 /-- Given a monoid homomorphism `f`, the induced homomorphism on the quotient by `f`'s kernel has
@@ -1092,6 +1174,7 @@ theorem kerLift_range_eq : (kerLift f).mrange = f.mrange :=
 #align add_con.ker_lift_range_eq AddCon.kerLift_range_eq
 -/
 
+#print Con.kerLift_injective /-
 /-- A monoid homomorphism `f` induces an injective homomorphism on the quotient by `f`'s kernel. -/
 @[to_additive
       "An `add_monoid` homomorphism `f` induces an injective homomorphism on the quotient\nby `f`'s kernel."]
@@ -1099,7 +1182,9 @@ theorem kerLift_injective (f : M →* P) : Injective (kerLift f) := fun x y =>
   Quotient.inductionOn₂' x y fun _ _ => (ker f).Eq.2
 #align con.ker_lift_injective Con.kerLift_injective
 #align add_con.ker_lift_injective AddCon.kerLift_injective
+-/
 
+#print Con.map /-
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, `d`'s quotient
     map induces a homomorphism from the quotient by `c` to the quotient by `d`. -/
 @[to_additive
@@ -1108,7 +1193,9 @@ def map (c d : Con M) (h : c ≤ d) : c.Quotient →* d.Quotient :=
   c.lift d.mk' fun x y hc => show (ker d.mk') x y from (mk'_ker d).symm ▸ h hc
 #align con.map Con.map
 #align add_con.map AddCon.map
+-/
 
+#print Con.map_apply /-
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, the definition of
     the homomorphism from the quotient by `c` to the quotient by `d` induced by `d`'s quotient
     map. -/
@@ -1119,9 +1206,11 @@ theorem map_apply {c d : Con M} (h : c ≤ d) (x) :
   rfl
 #align con.map_apply Con.map_apply
 #align add_con.map_apply AddCon.map_apply
+-/
 
 variable (c)
 
+#print Con.quotientKerEquivRange /-
 /-- The first isomorphism theorem for monoids. -/
 @[to_additive "The first isomorphism theorem for `add_monoid`s."]
 noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* f.mrange :=
@@ -1137,7 +1226,9 @@ noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* f
     map_mul' := MonoidHom.map_mul _ }
 #align con.quotient_ker_equiv_range Con.quotientKerEquivRange
 #align add_con.quotient_ker_equiv_range AddCon.quotientKerEquivRange
+-/
 
+#print Con.quotientKerEquivOfRightInverse /-
 /-- The first isomorphism theorem for monoids in the case of a homomorphism with right inverse. -/
 @[to_additive
       "The first isomorphism theorem for `add_monoid`s in the case of a homomorphism\nwith right inverse.",
@@ -1151,7 +1242,9 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
     right_inv := hf }
 #align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverse
 #align add_con.quotient_ker_equiv_of_right_inverse AddCon.quotientKerEquivOfRightInverse
+-/
 
+#print Con.quotientKerEquivOfSurjective /-
 /-- The first isomorphism theorem for monoids in the case of a surjective homomorphism.
 
 For a `computable` version, see `con.quotient_ker_equiv_of_right_inverse`.
@@ -1163,7 +1256,9 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
   quotientKerEquivOfRightInverse _ _ hf.HasRightInverse.choose_spec
 #align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjective
 #align add_con.quotient_ker_equiv_of_surjective AddCon.quotientKerEquivOfSurjective
+-/
 
+#print Con.comapQuotientEquiv /-
 /-- The second isomorphism theorem for monoids. -/
 @[to_additive "The second isomorphism theorem for `add_monoid`s."]
 noncomputable def comapQuotientEquiv (f : N →* M) :
@@ -1171,7 +1266,9 @@ noncomputable def comapQuotientEquiv (f : N →* M) :
   (Con.congr comap_eq).trans <| quotientKerEquivRange <| c.mk'.comp f
 #align con.comap_quotient_equiv Con.comapQuotientEquiv
 #align add_con.comap_quotient_equiv AddCon.comapQuotientEquiv
+-/
 
+#print Con.quotientQuotientEquivQuotient /-
 /-- The third isomorphism theorem for monoids. -/
 @[to_additive "The third isomorphism theorem for `add_monoid`s."]
 def quotientQuotientEquivQuotient (c d : Con M) (h : c ≤ d) :
@@ -1183,11 +1280,13 @@ def quotientQuotientEquivQuotient (c d : Con M) (h : c ≤ d) :
           show _ = d.mk' a * d.mk' b by rw [← d.mk'.map_mul] <;> rfl }
 #align con.quotient_quotient_equiv_quotient Con.quotientQuotientEquivQuotient
 #align add_con.quotient_quotient_equiv_quotient AddCon.quotientQuotientEquivQuotient
+-/
 
 end MulOneClass
 
 section Monoids
 
+#print Con.pow /-
 /-- Multiplicative congruence relations preserve natural powers. -/
 @[to_additive AddCon.nsmul "Additive congruence relations preserve natural scaling."]
 protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
@@ -1196,26 +1295,32 @@ protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
   | Nat.succ n, w, x, h => by simpa [pow_succ] using c.mul h (pow n h)
 #align con.pow Con.pow
 #align add_con.nsmul AddCon.nsmul
+-/
 
 @[to_additive]
 instance {M : Type _} [MulOneClass M] (c : Con M) : One c.Quotient
     where one := ((1 : M) : c.Quotient)
 
+#print Con.smul /-
 @[to_additive]
 theorem smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α)
     {w x : M} (h : c w x) : c (a • w) (a • x) := by
   simpa only [smul_one_mul] using c.mul (c.refl' (a • 1 : M)) h
 #align con.smul Con.smul
 #align add_con.vadd AddCon.vadd
+-/
 
+#print AddCon.Quotient.nsmul /-
 instance AddCon.Quotient.nsmul {M : Type _} [AddMonoid M] (c : AddCon M) : SMul ℕ c.Quotient
     where smul n := Quotient.map' ((· • ·) n) fun x y => c.nsmul n
 #align add_con.quotient.has_nsmul AddCon.Quotient.nsmul
+-/
 
 @[to_additive AddCon.Quotient.nsmul]
 instance {M : Type _} [Monoid M] (c : Con M) : Pow c.Quotient ℕ
     where pow x n := Quotient.map' (fun x => x ^ n) (fun x y => c.pow n) x
 
+#print Con.semigroup /-
 /-- The quotient of a semigroup by a congruence relation is a semigroup. -/
 @[to_additive
       "The quotient of an `add_semigroup` by an additive congruence relation is\nan `add_semigroup`."]
@@ -1223,7 +1328,9 @@ instance semigroup {M : Type _} [Semigroup M] (c : Con M) : Semigroup c.Quotient
   Function.Surjective.semigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
 #align con.semigroup Con.semigroup
 #align add_con.add_semigroup AddCon.addSemigroup
+-/
 
+#print Con.commSemigroup /-
 /-- The quotient of a commutative semigroup by a congruence relation is a semigroup. -/
 @[to_additive
       "The quotient of an `add_comm_semigroup` by an additive congruence relation is\nan `add_semigroup`."]
@@ -1231,7 +1338,9 @@ instance commSemigroup {M : Type _} [CommSemigroup M] (c : Con M) : CommSemigrou
   Function.Surjective.commSemigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
 #align con.comm_semigroup Con.commSemigroup
 #align add_con.add_comm_semigroup AddCon.addCommSemigroup
+-/
 
+#print Con.monoid /-
 /-- The quotient of a monoid by a congruence relation is a monoid. -/
 @[to_additive
       "The quotient of an `add_monoid` by an additive congruence relation is\nan `add_monoid`."]
@@ -1239,7 +1348,9 @@ instance monoid {M : Type _} [Monoid M] (c : Con M) : Monoid c.Quotient :=
   Function.Surjective.monoid _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) fun _ _ => rfl
 #align con.monoid Con.monoid
 #align add_con.add_monoid AddCon.addMonoid
+-/
 
+#print Con.commMonoid /-
 /-- The quotient of a `comm_monoid` by a congruence relation is a `comm_monoid`. -/
 @[to_additive
       "The quotient of an `add_comm_monoid` by an additive congruence\nrelation is an `add_comm_monoid`."]
@@ -1248,6 +1359,7 @@ instance commMonoid {M : Type _} [CommMonoid M] (c : Con M) : CommMonoid c.Quoti
     rfl
 #align con.comm_monoid Con.commMonoid
 #align add_con.add_comm_monoid AddCon.addCommMonoid
+-/
 
 end Monoids
 
@@ -1255,20 +1367,25 @@ section Groups
 
 variable {M} [Group M] [Group N] [Group P] (c : Con M)
 
+#print Con.inv /-
 /-- Multiplicative congruence relations preserve inversion. -/
 @[to_additive "Additive congruence relations preserve negation."]
 protected theorem inv : ∀ {w x}, c w x → c w⁻¹ x⁻¹ := fun x y h => by
   simpa using c.symm (c.mul (c.mul (c.refl x⁻¹) h) (c.refl y⁻¹))
 #align con.inv Con.inv
 #align add_con.neg AddCon.neg
+-/
 
+#print Con.div /-
 /-- Multiplicative congruence relations preserve division. -/
 @[to_additive "Additive congruence relations preserve subtraction."]
 protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) := fun w x y z h1 h2 => by
   simpa only [div_eq_mul_inv] using c.mul h1 (c.inv h2)
 #align con.div Con.div
 #align add_con.sub AddCon.sub
+-/
 
+#print Con.zpow /-
 /-- Multiplicative congruence relations preserve integer powers. -/
 @[to_additive AddCon.zsmul "Additive congruence relations preserve integer scaling."]
 protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
@@ -1276,7 +1393,9 @@ protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
   | -[n+1], w, x, h => by simpa only [zpow_negSucc] using c.inv (c.pow _ h)
 #align con.zpow Con.zpow
 #align add_con.zsmul AddCon.zsmul
+-/
 
+#print Con.hasInv /-
 /-- The inversion induced on the quotient by a congruence relation on a type with a
     inversion. -/
 @[to_additive
@@ -1285,7 +1404,9 @@ instance hasInv : Inv c.Quotient :=
   ⟨Quotient.map' Inv.inv fun a b => c.inv⟩
 #align con.has_inv Con.hasInv
 #align add_con.has_neg AddCon.hasNeg
+-/
 
+#print Con.hasDiv /-
 /-- The division induced on the quotient by a congruence relation on a type with a
     division. -/
 @[to_additive
@@ -1294,13 +1415,17 @@ instance hasDiv : Div c.Quotient :=
   ⟨Quotient.map₂' (· / ·) fun _ _ h₁ _ _ h₂ => c.div h₁ h₂⟩
 #align con.has_div Con.hasDiv
 #align add_con.has_sub AddCon.hasSub
+-/
 
+#print AddCon.Quotient.zsmul /-
 /-- The integer scaling induced on the quotient by a congruence relation on a type with a
     subtraction. -/
 instance AddCon.Quotient.zsmul {M : Type _} [AddGroup M] (c : AddCon M) : SMul ℤ c.Quotient :=
   ⟨fun z => Quotient.map' ((· • ·) z) fun x y => c.zsmul z⟩
 #align add_con.quotient.has_zsmul AddCon.Quotient.zsmul
+-/
 
+#print Con.zpowinst /-
 /-- The integer power induced on the quotient by a congruence relation on a type with a
     division. -/
 @[to_additive AddCon.Quotient.zsmul]
@@ -1308,7 +1433,9 @@ instance zpowinst : Pow c.Quotient ℤ :=
   ⟨fun x z => Quotient.map' (fun x => x ^ z) (fun x y h => c.zpow z h) x⟩
 #align con.has_zpow Con.zpowinst
 #align add_con.quotient.has_zsmul AddCon.Quotient.zsmul
+-/
 
+#print Con.group /-
 /-- The quotient of a group by a congruence relation is a group. -/
 @[to_additive
       "The quotient of an `add_group` by an additive congruence relation is\nan `add_group`."]
@@ -1317,6 +1444,7 @@ instance group : Group c.Quotient :=
     (fun _ _ => rfl) (fun _ _ => rfl) fun _ _ => rfl
 #align con.group Con.group
 #align add_con.add_group AddCon.addGroup
+-/
 
 end Groups
 
@@ -1324,6 +1452,7 @@ section Units
 
 variable {α : Type _} [Monoid M] {c : Con M}
 
+#print Con.liftOnUnits /-
 /-- In order to define a function `(con.quotient c)ˣ → α` on the units of `con.quotient c`,
 where `c : con M` is a multiplicative congruence on a monoid, it suffices to define a function `f`
 that takes elements `x y : M` with proofs of `c (x * y) 1` and `c (y * x) 1`, and returns an element
@@ -1345,6 +1474,7 @@ def liftOnUnits (u : Units c.Quotient) (f : ∀ x y : M, c (x * y) 1 → c (y *
   exact hEq_of_eq (Hf _ _ _ _ _ _ _ _ hx hy)
 #align con.lift_on_units Con.liftOnUnits
 #align add_con.lift_on_add_units AddCon.liftOnAddUnits
+-/
 
 /-- In order to define a function `(con.quotient c)ˣ → α` on the units of `con.quotient c`,
 where `c : con M` is a multiplicative congruence on a monoid, it suffices to define a function `f`
@@ -1352,6 +1482,7 @@ that takes elements `x y : M` with proofs of `c (x * y) 1` and `c (y * x) 1`, an
 of `α` provided that `f x y _ _ = f x' y' _ _` whenever `c x x'` and `c y y'`. -/
 add_decl_doc AddCon.liftOnAddUnits
 
+#print Con.liftOnUnits_mk /-
 @[simp, to_additive]
 theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
     (Hf : ∀ x y hxy hyx x' y' hxy' hyx', c x x' → c y y' → f x y hxy hyx = f x' y' hxy' hyx')
@@ -1360,7 +1491,9 @@ theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
   rfl
 #align con.lift_on_units_mk Con.liftOnUnits_mk
 #align add_con.lift_on_add_units_mk AddCon.liftOnAddUnits_mk
+-/
 
+#print Con.induction_on_units /-
 @[elab_as_elim, to_additive]
 theorem induction_on_units {p : Units c.Quotient → Prop} (u : Units c.Quotient)
     (H : ∀ (x y : M) (hxy : c (x * y) 1) (hyx : c (y * x) 1), p ⟨x, y, c.Eq.2 hxy, c.Eq.2 hyx⟩) :
@@ -1369,24 +1502,30 @@ theorem induction_on_units {p : Units c.Quotient → Prop} (u : Units c.Quotient
   exact H x y (c.eq.1 h₁) (c.eq.1 h₂)
 #align con.induction_on_units Con.induction_on_units
 #align add_con.induction_on_add_units AddCon.induction_on_addUnits
+-/
 
 end Units
 
 section Actions
 
+#print Con.smulinst /-
 @[to_additive]
 instance smulinst {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
     SMul α c.Quotient where smul a := Quotient.map' ((· • ·) a) fun x y => c.smul a
 #align con.has_smul Con.smulinst
 #align add_con.has_vadd AddCon.smulinst
+-/
 
+#print Con.coe_smul /-
 @[to_additive]
 theorem coe_smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α)
     (x : M) : (↑(a • x) : c.Quotient) = a • ↑x :=
   rfl
 #align con.coe_smul Con.coe_smul
 #align add_con.coe_vadd AddCon.coe_vadd
+-/
 
+#print Con.mulAction /-
 @[to_additive]
 instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M] [IsScalarTower α M M]
     (c : Con M) : MulAction α c.Quotient
@@ -1396,7 +1535,9 @@ instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M]
   mul_smul a₁ a₂ := Quotient.ind' fun x => congr_arg Quotient.mk'' <| mul_smul _ _ _
 #align con.mul_action Con.mulAction
 #align add_con.add_action AddCon.addAction
+-/
 
+#print Con.mulDistribMulAction /-
 instance mulDistribMulAction {α M : Type _} [Monoid α] [Monoid M] [MulDistribMulAction α M]
     [IsScalarTower α M M] (c : Con M) : MulDistribMulAction α c.Quotient :=
   { c.MulAction with
@@ -1404,6 +1545,7 @@ instance mulDistribMulAction {α M : Type _} [Monoid α] [Monoid M] [MulDistribM
     smul_one := fun r => congr_arg Quotient.mk'' <| smul_one _
     smul_mul := fun r => Quotient.ind₂' fun m₁ m₂ => congr_arg Quotient.mk'' <| smul_mul' _ _ _ }
 #align con.mul_distrib_mul_action Con.mulDistribMulAction
+-/
 
 end Actions
 
Diff
@@ -555,7 +555,7 @@ theorem inf_iff_and {c d : Con M} {x y} : (c ⊓ d) x y ↔ c x y ∧ d x y :=
     the infimum of the set of congruence relations containing `r`. -/
 @[to_additive add_con_gen_eq
       "The inductively defined smallest additive congruence relation\ncontaining a binary relation `r` equals the infimum of the set of additive congruence relations\ncontaining `r`."]
-theorem conGen_eq (r : M → M → Prop) : conGen r = sInf { s : Con M | ∀ x y, r x y → s x y } :=
+theorem conGen_eq (r : M → M → Prop) : conGen r = sInf {s : Con M | ∀ x y, r x y → s x y} :=
   le_antisymm
     (fun x y H =>
       ConGen.Rel.rec_on H (fun _ _ h _ hs => hs _ _ h) (Con.refl _) (fun _ _ _ => Con.symm _)
@@ -816,7 +816,7 @@ variable (M c)
       "The `add_submonoid` of `M × M` defined by an additive congruence\nrelation on an `add_monoid` `M`."]
 protected def submonoid : Submonoid (M × M)
     where
-  carrier := { x | c x.1 x.2 }
+  carrier := {x | c x.1 x.2}
   one_mem' := c.iseqv.1 1
   mul_mem' _ _ := c.mul
 #align con.submonoid Con.submonoid
Diff
@@ -760,7 +760,7 @@ def correspondence : { d // c ≤ d } ≃o Con c.Quotient
     let Hm :
       (mulKer (coe : M → c.Quotient) fun x y => rfl) ≤
         comap (coe : M → c.Quotient) (fun x y => rfl) d :=
-      fun x y h => show d _ _ by rw [mul_ker_mk_eq] at h <;> exact c.eq.2 h ▸ d.refl _
+      fun x y h => show d _ _ by rw [mul_ker_mk_eq] at h  <;> exact c.eq.2 h ▸ d.refl _
     ext fun x y =>
       ⟨fun h =>
         let ⟨a, b, hx, hy, H⟩ := h
Diff
@@ -352,9 +352,6 @@ protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quoti
 #align add_con.hrec_on₂ AddCon.hrecOn₂
 -/
 
-/- warning: con.hrec_on₂_coe -> Con.hrec_on₂_coe is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align con.hrec_on₂_coe Con.hrec_on₂_coeₓ'. -/
 @[simp, to_additive]
 theorem hrec_on₂_coe {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort _} (a : M)
     (b : N) (f : ∀ (x : M) (y : N), φ x y)
@@ -491,12 +488,6 @@ instance : InfSet (Con M) :=
           c.trans (h1 c hc) <| h2 c hc⟩⟩,
       fun _ _ _ _ h1 h2 c hc => c.mul (h1 c hc) <| h2 c hc⟩⟩
 
-/- warning: con.Inf_to_setoid -> Con.sInf_toSetoid is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1 (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (Setoid.{succ u1} M) (Setoid.hasInf.{u1} M) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1) S))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1 (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (Setoid.{succ u1} M) (Setoid.instInfSetSetoid.{u1} M) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1) S))
-Case conversion may be inaccurate. Consider using '#align con.Inf_to_setoid Con.sInf_toSetoidₓ'. -/
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying equivalence relation. -/
 @[to_additive
@@ -507,12 +498,6 @@ theorem sInf_toSetoid (S : Set (Con M)) : (sInf S).toSetoid = sInf (toSetoid ''
 #align con.Inf_to_setoid Con.sInf_toSetoid
 #align add_con.Inf_to_setoid AddCon.sInf_toSetoid
 
-/- warning: con.Inf_def -> Con.sInf_def is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (M -> M -> Prop) (Pi.infSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.infSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteSemilatticeInf.toHasInf.{0} Prop (CompleteLattice.toCompleteSemilatticeInf.{0} Prop Prop.completeLattice)))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (ᾰ : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1)) S))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (forall (ᾰ : M), (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (M -> M -> Prop) (Pi.infSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.infSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteBooleanAlgebra.toInfSet.{0} Prop Prop.completeBooleanAlgebra))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (ᾰ : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (Con.instFunLikeConForAllProp.{u1} M _inst_1)) S))
-Case conversion may be inaccurate. Consider using '#align con.Inf_def Con.sInf_defₓ'. -/
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying binary relation. -/
 @[to_additive
@@ -550,12 +535,6 @@ instance : CompleteLattice (Con M) :=
     bot := { Setoid.completeLattice.bot with mul' := fun _ _ _ _ h1 h2 => h1 ▸ h2 ▸ rfl }
     bot_le := fun c x y h => h ▸ c.refl x }
 
-/- warning: con.inf_def -> Con.inf_def is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (M -> M -> Prop) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 (Inf.inf.{u1} (Con.{u1} M _inst_1) (SemilatticeInf.toHasInf.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d))) (Inf.inf.{u1} (M -> M -> Prop) (Pi.hasInf.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.hasInf.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeInf.toHasInf.{0} Prop (Lattice.toSemilatticeInf.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d)))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (M -> M -> Prop) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 (Inf.inf.{u1} (Con.{u1} M _inst_1) (Lattice.toInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1))) c d))) (Inf.inf.{u1} (M -> M -> Prop) (Pi.instInfForAll.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.instInfForAll.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => Lattice.toInf.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice)))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d)))
-Case conversion may be inaccurate. Consider using '#align con.inf_def Con.inf_defₓ'. -/
 /-- The infimum of two congruence relations equals the infimum of the underlying binary
     operations. -/
 @[to_additive
@@ -565,12 +544,6 @@ theorem inf_def {c d : Con M} : (c ⊓ d).R = c.R ⊓ d.R :=
 #align con.inf_def Con.inf_def
 #align add_con.inf_def AddCon.inf_def
 
-/- warning: con.inf_iff_and -> Con.inf_iff_and is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1} {x : M} {y : M}, Iff (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) (Inf.inf.{u1} (Con.{u1} M _inst_1) (SemilatticeInf.toHasInf.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) x y) (And (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) d x y))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1} {x : M} {y : M}, Iff (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) (Inf.inf.{u1} (Con.{u1} M _inst_1) (Lattice.toInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1))) c d) x y) (And (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) d x y))
-Case conversion may be inaccurate. Consider using '#align con.inf_iff_and Con.inf_iff_andₓ'. -/
 /-- Definition of the infimum of two congruence relations. -/
 @[to_additive "Definition of the infimum of two additive congruence relations."]
 theorem inf_iff_and {c d : Con M} {x y} : (c ⊓ d) x y ↔ c x y ∧ d x y :=
@@ -578,12 +551,6 @@ theorem inf_iff_and {c d : Con M} {x y} : (c ⊓ d) x y ↔ c x y ∧ d x y :=
 #align con.inf_iff_and Con.inf_iff_and
 #align add_con.inf_iff_and AddCon.inf_iff_and
 
-/- warning: con.con_gen_eq -> Con.conGen_eq is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (r : M -> M -> Prop), Eq.{succ u1} (Con.{u1} M _inst_1) (conGen.{u1} M _inst_1 r) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) (setOf.{u1} (Con.{u1} M _inst_1) (fun (s : Con.{u1} M _inst_1) => forall (x : M) (y : M), (r x y) -> (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) s x y))))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (r : M -> M -> Prop), Eq.{succ u1} (Con.{u1} M _inst_1) (conGen.{u1} M _inst_1 r) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) (setOf.{u1} (Con.{u1} M _inst_1) (fun (s : Con.{u1} M _inst_1) => forall (x : M) (y : M), (r x y) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) s x y))))
-Case conversion may be inaccurate. Consider using '#align con.con_gen_eq Con.conGen_eqₓ'. -/
 /-- The inductively defined smallest congruence relation containing a binary relation `r` equals
     the infimum of the set of congruence relations containing `r`. -/
 @[to_additive add_con_gen_eq
@@ -642,12 +609,6 @@ theorem conGen_idem (r : M → M → Prop) : conGen (conGen r) = conGen r :=
 #align add_con.add_con_gen_idem AddCon.addConGen_idem
 -/
 
-/- warning: con.sup_eq_con_gen -> Con.sup_eq_conGen is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (c : Con.{u1} M _inst_1) (d : Con.{u1} M _inst_1), Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Or (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) d x y)))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (c : Con.{u1} M _inst_1) (d : Con.{u1} M _inst_1), Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Or (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) d x y)))
-Case conversion may be inaccurate. Consider using '#align con.sup_eq_con_gen Con.sup_eq_conGenₓ'. -/
 /-- The supremum of congruence relations `c, d` equals the smallest congruence relation containing
     the binary relation '`x` is related to `y` by `c` or `d`'. -/
 @[to_additive sup_eq_add_con_gen
@@ -660,12 +621,6 @@ theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x
 #align con.sup_eq_con_gen Con.sup_eq_conGen
 #align add_con.sup_eq_add_con_gen AddCon.sup_eq_addConGen
 
-/- warning: con.sup_def -> Con.sup_def is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (Sup.sup.{u1} (M -> M -> Prop) (Pi.hasSup.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.hasSup.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeSup.toHasSup.{0} Prop (Lattice.toSemilatticeSup.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d))))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (Sup.sup.{u1} (M -> M -> Prop) (Pi.instSupForAll.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.instSupForAll.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeSup.toSup.{0} Prop (Lattice.toSemilatticeSup.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d))))
-Case conversion may be inaccurate. Consider using '#align con.sup_def Con.sup_defₓ'. -/
 /-- The supremum of two congruence relations equals the smallest congruence relation containing
     the supremum of the underlying binary operations. -/
 @[to_additive
@@ -674,12 +629,6 @@ theorem sup_def {c d : Con M} : c ⊔ d = conGen (c.R ⊔ d.R) := by rw [sup_eq_
 #align con.sup_def Con.sup_def
 #align add_con.sup_def AddCon.sup_def
 
-/- warning: con.Sup_eq_con_gen -> Con.sSup_eq_conGen is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteSemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toCompleteSemilatticeSup.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1))) S) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Exists.{succ u1} (Con.{u1} M _inst_1) (fun (c : Con.{u1} M _inst_1) => And (Membership.Mem.{u1, u1} (Con.{u1} M _inst_1) (Set.{u1} (Con.{u1} M _inst_1)) (Set.hasMem.{u1} (Con.{u1} M _inst_1)) c S) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y))))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toSupSet.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)) S) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Exists.{succ u1} (Con.{u1} M _inst_1) (fun (c : Con.{u1} M _inst_1) => And (Membership.mem.{u1, u1} (Con.{u1} M _inst_1) (Set.{u1} (Con.{u1} M _inst_1)) (Set.instMembershipSet.{u1} (Con.{u1} M _inst_1)) c S) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y))))
-Case conversion may be inaccurate. Consider using '#align con.Sup_eq_con_gen Con.sSup_eq_conGenₓ'. -/
 /-- The supremum of a set of congruence relations `S` equals the smallest congruence relation
     containing the binary relation 'there exists `c ∈ S` such that `x` is related to `y` by
     `c`'. -/
@@ -694,12 +643,6 @@ theorem sSup_eq_conGen (S : Set (Con M)) : sSup S = conGen fun x y => ∃ c : Co
 #align con.Sup_eq_con_gen Con.sSup_eq_conGen
 #align add_con.Sup_eq_add_con_gen AddCon.sSup_eq_addConGen
 
-/- warning: con.Sup_def -> Con.sSup_def is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {S : Set.{u1} (Con.{u1} M _inst_1)}, Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteSemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toCompleteSemilatticeSup.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1))) S) (conGen.{u1} M _inst_1 (SupSet.sSup.{u1} (M -> M -> Prop) (Pi.supSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.supSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteSemilatticeSup.toHasSup.{0} Prop (CompleteLattice.toCompleteSemilatticeSup.{0} Prop Prop.completeLattice)))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (ᾰ : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1)) S)))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {S : Set.{u1} (Con.{u1} M _inst_1)}, Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toSupSet.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)) S) (conGen.{u1} M _inst_1 (SupSet.sSup.{u1} (M -> M -> Prop) (Pi.supSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.supSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteBooleanAlgebra.toSupSet.{0} Prop Prop.completeBooleanAlgebra))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (ᾰ : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (Con.instFunLikeConForAllProp.{u1} M _inst_1)) S)))
-Case conversion may be inaccurate. Consider using '#align con.Sup_def Con.sSup_defₓ'. -/
 /-- The supremum of a set of congruence relations is the same as the smallest congruence relation
     containing the supremum of the set's image under the map to the underlying binary relation. -/
 @[to_additive
@@ -715,12 +658,6 @@ theorem sSup_def {S : Set (Con M)} :
 
 variable (M)
 
-/- warning: con.gi -> Con.gi is a dubious translation:
-lean 3 declaration is
-  forall (M : Type.{u1}) [_inst_1 : Mul.{u1} M], GaloisInsertion.{u1, u1} (M -> M -> Prop) (Con.{u1} M _inst_1) (Pi.preorder.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.preorder.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => PartialOrder.toPreorder.{0} Prop Prop.partialOrder))) (PartialOrder.toPreorder.{u1} (Con.{u1} M _inst_1) (Con.partialOrder.{u1} M _inst_1)) (conGen.{u1} M _inst_1) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (ᾰ : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1))
-but is expected to have type
-  forall (M : Type.{u1}) [_inst_1 : Mul.{u1} M], GaloisInsertion.{u1, u1} (M -> M -> Prop) (Con.{u1} M _inst_1) (Pi.preorder.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.preorder.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => PartialOrder.toPreorder.{0} Prop Prop.partialOrder))) (PartialOrder.toPreorder.{u1} (Con.{u1} M _inst_1) (Con.instPartialOrderCon.{u1} M _inst_1)) (conGen.{u1} M _inst_1) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (ᾰ : M) => M -> Prop) (Con.instFunLikeConForAllProp.{u1} M _inst_1))
-Case conversion may be inaccurate. Consider using '#align con.gi Con.giₓ'. -/
 /-- There is a Galois insertion of congruence relations on a type with a multiplication `M` into
     binary relations on `M`. -/
 @[to_additive
@@ -763,12 +700,6 @@ def mapOfSurjective (f : M → N) (H : ∀ x y, f (x * y) = f x * f y) (h : mulK
 #align add_con.map_of_surjective AddCon.mapOfSurjective
 -/
 
-/- warning: con.map_of_surjective_eq_map_gen -> Con.mapOfSurjective_eq_mapGen is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : Mul.{u1} M] [_inst_2 : Mul.{u2} N] {c : Con.{u1} M _inst_1} {f : M -> N} (H : forall (x : M) (y : M), Eq.{succ u2} N (f (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M _inst_1) x y)) (HMul.hMul.{u2, u2, u2} N N N (instHMul.{u2} N _inst_2) (f x) (f y))) (h : LE.le.{u1} (Con.{u1} M _inst_1) (Con.hasLe.{u1} M _inst_1) (Con.mulKer.{u1, u2} M N _inst_1 _inst_2 f H) c) (hf : Function.Surjective.{succ u1, succ u2} M N f), Eq.{succ u2} (Con.{u2} N _inst_2) (Con.mapGen.{u1, u2} M N _inst_1 _inst_2 c f) (Con.mapOfSurjective.{u1, u2} M N _inst_1 _inst_2 c f H h hf)
-but is expected to have type
-  forall {M : Type.{u2}} {N : Type.{u1}} [_inst_1 : Mul.{u2} M] [_inst_2 : Mul.{u1} N] {c : Con.{u2} M _inst_1} {f : M -> N} (H : forall (x : M) (y : M), Eq.{succ u1} N (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M _inst_1) x y)) (HMul.hMul.{u1, u1, u1} N N N (instHMul.{u1} N _inst_2) (f x) (f y))) (h : LE.le.{u2} (Con.{u2} M _inst_1) (Con.instLECon.{u2} M _inst_1) (Con.mulKer.{u2, u1} M N _inst_1 _inst_2 f H) c) (hf : Function.Surjective.{succ u2, succ u1} M N f), Eq.{succ u1} (Con.{u1} N _inst_2) (Con.mapGen.{u2, u1} M N _inst_1 _inst_2 c f) (Con.mapOfSurjective.{u2, u1} M N _inst_1 _inst_2 c f H h hf)
-Case conversion may be inaccurate. Consider using '#align con.map_of_surjective_eq_map_gen Con.mapOfSurjective_eq_mapGenₓ'. -/
 /-- A specialization of 'the smallest congruence relation containing a congruence relation `c`
     equals `c`'. -/
 @[to_additive
@@ -854,12 +785,6 @@ section MulOneClass
 
 variable {M} [MulOneClass M] [MulOneClass N] [MulOneClass P] (c : Con M)
 
-/- warning: con.mul_one_class -> Con.mulOneClass is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)), MulOneClass.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)), MulOneClass.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
-Case conversion may be inaccurate. Consider using '#align con.mul_one_class Con.mulOneClassₓ'. -/
 /-- The quotient of a monoid by a congruence relation is a monoid. -/
 @[to_additive
       "The quotient of an `add_monoid` by an additive congruence relation is\nan `add_monoid`."]
@@ -874,12 +799,6 @@ instance mulOneClass : MulOneClass c.Quotient
 
 variable {c}
 
-/- warning: con.coe_one -> Con.coe_one is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M _inst_1))))) (OfNat.ofNat.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) 1 (OfNat.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) 1 (One.one.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (MulOneClass.toHasOne.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)))))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M _inst_1)))) (OfNat.ofNat.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) 1 (One.toOfNat1.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toOne.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))))
-Case conversion may be inaccurate. Consider using '#align con.coe_one Con.coe_oneₓ'. -/
 /-- The 1 of the quotient of a monoid by a congruence relation is the equivalence class of the
     monoid's 1. -/
 @[simp,
@@ -892,12 +811,6 @@ theorem coe_one : ((1 : M) : c.Quotient) = 1 :=
 
 variable (M c)
 
-/- warning: con.submonoid -> Con.submonoid is a dubious translation:
-lean 3 declaration is
-  forall (M : Type.{u1}) [_inst_1 : MulOneClass.{u1} M], (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) -> (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M], (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) -> (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1))
-Case conversion may be inaccurate. Consider using '#align con.submonoid Con.submonoidₓ'. -/
 /-- The submonoid of `M × M` defined by a congruence relation on a monoid `M`. -/
 @[to_additive
       "The `add_submonoid` of `M × M` defined by an additive congruence\nrelation on an `add_monoid` `M`."]
@@ -911,12 +824,6 @@ protected def submonoid : Submonoid (M × M)
 
 variable {M c}
 
-/- warning: con.of_submonoid -> Con.ofSubmonoid is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (N : Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)), (Equivalence.{succ u1} M (fun (x : M) (y : M) => Membership.Mem.{u1, u1} (Prod.{u1, u1} M M) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (SetLike.hasMem.{u1, u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Prod.{u1, u1} M M) (Submonoid.setLike.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1))) (Prod.mk.{u1, u1} M M x y) N)) -> (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (N : Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)), (Equivalence.{succ u1} M (fun (x : M) (y : M) => Membership.mem.{u1, u1} (Prod.{u1, u1} M M) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (Prod.{u1, u1} M M) (Submonoid.instSetLikeSubmonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1))) (Prod.mk.{u1, u1} M M x y) N)) -> (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1))
-Case conversion may be inaccurate. Consider using '#align con.of_submonoid Con.ofSubmonoidₓ'. -/
 /-- The congruence relation on a monoid `M` from a submonoid of `M × M` for which membership
     is an equivalence relation. -/
 @[to_additive
@@ -929,12 +836,6 @@ def ofSubmonoid (N : Submonoid (M × M)) (H : Equivalence fun x y => (x, y) ∈
 #align con.of_submonoid Con.ofSubmonoid
 #align add_con.of_add_submonoid AddCon.ofAddSubmonoid
 
-/- warning: con.to_submonoid -> Con.toSubmonoid is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M], Coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M], Coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1))
-Case conversion may be inaccurate. Consider using '#align con.to_submonoid Con.toSubmonoidₓ'. -/
 /-- Coercion from a congruence relation `c` on a monoid `M` to the submonoid of `M × M` whose
     elements are `(x, y)` such that `x` is related to `y` by `c`. -/
 @[to_additive
@@ -944,48 +845,24 @@ instance toSubmonoid : Coe (Con M) (Submonoid (M × M)) :=
 #align con.to_submonoid Con.toSubmonoid
 #align add_con.to_add_submonoid AddCon.toAddSubmonoid
 
-/- warning: con.mem_coe -> Con.mem_coe is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {x : M} {y : M}, Iff (Membership.Mem.{u1, u1} (Prod.{u1, u1} M M) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (SetLike.hasMem.{u1, u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Prod.{u1, u1} M M) (Submonoid.setLike.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1))) (Prod.mk.{u1, u1} M M x y) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) c)) (Membership.Mem.{u1, u1} (Prod.{u1, u1} M M) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasMem.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Prod.mk.{u1, u1} M M x y) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {x : M} {y : M}, Iff (Membership.mem.{u1, u1} (Prod.{u1, u1} M M) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (Prod.{u1, u1} M M) (Submonoid.instSetLikeSubmonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1))) (Prod.mk.{u1, u1} M M x y) (Con.submonoid.{u1} M _inst_1 c)) (Membership.mem.{u1, u1} (Prod.{u1, u1} M M) (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instMembershipProdCon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Prod.mk.{u1, u1} M M x y) c)
-Case conversion may be inaccurate. Consider using '#align con.mem_coe Con.mem_coeₓ'. -/
 @[to_additive]
 theorem mem_coe {c : Con M} {x y} : (x, y) ∈ (↑c : Submonoid (M × M)) ↔ (x, y) ∈ c :=
   Iff.rfl
 #align con.mem_coe Con.mem_coe
 #align add_con.mem_coe AddCon.mem_coe
 
-/- warning: con.to_submonoid_inj -> Con.to_submonoid_inj is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)), (Eq.{succ u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) d)) -> (Eq.{succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)), (Eq.{succ u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (Con.submonoid.{u1} M _inst_1 c) (Con.submonoid.{u1} M _inst_1 d)) -> (Eq.{succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d)
-Case conversion may be inaccurate. Consider using '#align con.to_submonoid_inj Con.to_submonoid_injₓ'. -/
 @[to_additive]
 theorem to_submonoid_inj (c d : Con M) (H : (c : Submonoid (M × M)) = d) : c = d :=
   ext fun x y => show (x, y) ∈ (c : Submonoid (M × M)) ↔ (x, y) ∈ ↑d by rw [H]
 #align con.to_submonoid_inj Con.to_submonoid_inj
 #align add_con.to_add_submonoid_inj AddCon.to_addSubmonoid_inj
 
-/- warning: con.le_iff -> Con.le_iff is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Iff (LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) (LE.le.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Preorder.toHasLe.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (PartialOrder.toPreorder.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (SetLike.partialOrder.{u1, u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Prod.{u1, u1} M M) (Submonoid.setLike.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1))))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) d))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Iff (LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (LE.le.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (Preorder.toLE.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (PartialOrder.toPreorder.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (CompleteSemilatticeInf.toPartialOrder.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (Submonoid.instCompleteLatticeSubmonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)))))) (Con.submonoid.{u1} M _inst_1 c) (Con.submonoid.{u1} M _inst_1 d))
-Case conversion may be inaccurate. Consider using '#align con.le_iff Con.le_iffₓ'. -/
 @[to_additive]
 theorem le_iff {c d : Con M} : c ≤ d ↔ (c : Submonoid (M × M)) ≤ d :=
   ⟨fun h x H => h H, fun h x y hc => h <| show (x, y) ∈ c from hc⟩
 #align con.le_iff Con.le_iff
 #align add_con.le_iff AddCon.le_iff
 
-/- warning: con.ker -> Con.ker is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P], (MonoidHom.{u1, u2} M P _inst_1 _inst_3) -> (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1))
-but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P], (MonoidHom.{u1, u2} M P _inst_1 _inst_3) -> (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1))
-Case conversion may be inaccurate. Consider using '#align con.ker Con.kerₓ'. -/
 /-- The kernel of a monoid homomorphism as a congruence relation. -/
 @[to_additive "The kernel of an `add_monoid` homomorphism as an additive congruence relation."]
 def ker (f : M →* P) : Con M :=
@@ -993,12 +870,6 @@ def ker (f : M →* P) : Con M :=
 #align con.ker Con.ker
 #align add_con.ker AddCon.ker
 
-/- warning: con.ker_rel -> Con.ker_rel is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x y) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f y))
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x y) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f y))
-Case conversion may be inaccurate. Consider using '#align con.ker_rel Con.ker_relₓ'. -/
 /-- The definition of the congruence relation defined by a monoid homomorphism's kernel. -/
 @[simp,
   to_additive
@@ -1008,12 +879,6 @@ theorem ker_rel (f : M →* P) {x y} : ker f x y ↔ f x = f y :=
 #align con.ker_rel Con.ker_rel
 #align add_con.ker_rel AddCon.ker_rel
 
-/- warning: con.quotient.inhabited -> Con.Quotient.inhabited is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Inhabited.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Inhabited.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
-Case conversion may be inaccurate. Consider using '#align con.quotient.inhabited Con.Quotient.inhabitedₓ'. -/
 /-- There exists an element of the quotient of a monoid by a congruence relation (namely 1). -/
 @[to_additive
       "There exists an element of the quotient of an `add_monoid` by a congruence relation\n(namely 0)."]
@@ -1024,12 +889,6 @@ instance Quotient.inhabited : Inhabited c.Quotient :=
 
 variable (c)
 
-/- warning: con.mk' -> Con.mk' is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)), MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)), MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)
-Case conversion may be inaccurate. Consider using '#align con.mk' Con.mk'ₓ'. -/
 /-- The natural homomorphism from a monoid to its quotient by a congruence relation. -/
 @[to_additive
       "The natural homomorphism from an `add_monoid` to its quotient by an additive\ncongruence relation."]
@@ -1040,12 +899,6 @@ def mk' : M →* c.Quotient :=
 
 variable (x y : M)
 
-/- warning: con.mk'_ker -> Con.mk'_ker is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c)) c
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.ker.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c)) c
-Case conversion may be inaccurate. Consider using '#align con.mk'_ker Con.mk'_kerₓ'. -/
 /-- The kernel of the natural homomorphism from a monoid to its quotient by a congruence
     relation `c` equals `c`. -/
 @[simp,
@@ -1058,12 +911,6 @@ theorem mk'_ker : ker c.mk' = c :=
 
 variable {c}
 
-/- warning: con.mk'_surjective -> Con.mk'_surjective is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c))
-Case conversion may be inaccurate. Consider using '#align con.mk'_surjective Con.mk'_surjectiveₓ'. -/
 /-- The natural homomorphism from a monoid to its quotient by a congruence relation is
     surjective. -/
 @[to_additive
@@ -1073,36 +920,18 @@ theorem mk'_surjective : Surjective c.mk' :=
 #align con.mk'_surjective Con.mk'_surjective
 #align add_con.mk'_surjective AddCon.mk'_surjective
 
-/- warning: con.coe_mk' -> Con.coe_mk' is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Eq.{succ u1} ((fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (Con.mk'.{u1} M _inst_1 c)) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (forall (a : M), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) a) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
-Case conversion may be inaccurate. Consider using '#align con.coe_mk' Con.coe_mk'ₓ'. -/
 @[simp, to_additive]
 theorem coe_mk' : (c.mk' : M → c.Quotient) = coe :=
   rfl
 #align con.coe_mk' Con.coe_mk'
 #align add_con.coe_mk' AddCon.coe_mk'
 
-/- warning: con.mrange_mk' -> Con.mrange_mk' is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Eq.{succ u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.mrange.{u1, u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c)) (Top.top.{u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Submonoid.hasTop.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.mrange.{u1, u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c)) (Top.top.{u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Submonoid.instTopSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)))
-Case conversion may be inaccurate. Consider using '#align con.mrange_mk' Con.mrange_mk'ₓ'. -/
 @[simp, to_additive]
 theorem mrange_mk' : c.mk'.mrange = ⊤ :=
   MonoidHom.mrange_top_iff_surjective.2 mk'_surjective
 #align con.mrange_mk' Con.mrange_mk'
 #align add_con.mrange_mk' AddCon.mrange_mk'
 
-/- warning: con.ker_apply_eq_preimage -> Con.ker_apply_eq_preimage is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u1} (M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x) (Set.preimage.{u1, u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f) (Singleton.singleton.{u2, u2} P (Set.{u2} P) (Set.hasSingleton.{u2} P) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)))
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) x) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x) (Set.preimage.{u2, u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f) (Singleton.singleton.{u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) x) (Set.{u1} P) (Set.instSingletonSet.{u1} P) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)))
-Case conversion may be inaccurate. Consider using '#align con.ker_apply_eq_preimage Con.ker_apply_eq_preimageₓ'. -/
 /-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
     those in the preimage of `f(x)` under `f`. -/
 @[to_additive
@@ -1114,12 +943,6 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
 #align con.ker_apply_eq_preimage Con.ker_apply_eq_preimage
 #align add_con.ker_apply_eq_preimage AddCon.ker_apply_eq_preimage
 
-/- warning: con.comap_eq -> Con.comap_eq is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
-but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
-Case conversion may be inaccurate. Consider using '#align con.comap_eq Con.comap_eqₓ'. -/
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
     relation induced on `N` by `f` equals the kernel of `c`'s quotient homomorphism composed with
     `f`. -/
@@ -1132,12 +955,6 @@ theorem comap_eq {f : N →* M} : comap f f.map_mul c = ker (c.mk'.comp f) :=
 
 variable (c) (f : M →* P)
 
-/- warning: con.lift -> Con.lift is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3)
-but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3)
-Case conversion may be inaccurate. Consider using '#align con.lift Con.liftₓ'. -/
 /-- The homomorphism on the quotient of a monoid by a congruence relation `c` induced by a
     homomorphism constant on `c`'s equivalence classes. -/
 @[to_additive
@@ -1152,12 +969,6 @@ def lift (H : c ≤ ker f) : c.Quotient →* P
 
 variable {c f}
 
-/- warning: con.lift_mk' -> Con.lift_mk' is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (a : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) a) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _x) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
-Case conversion may be inaccurate. Consider using '#align con.lift_mk' Con.lift_mk'ₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[to_additive
       "The diagram describing the universal property for quotients of `add_monoid`s\ncommutes."]
@@ -1166,12 +977,6 @@ theorem lift_mk' (H : c ≤ ker f) (x) : c.lift f H (c.mk' x) = f x :=
 #align con.lift_mk' Con.lift_mk'
 #align add_con.lift_mk' AddCon.lift_mk'
 
-/- warning: con.lift_coe -> Con.lift_coe is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
-Case conversion may be inaccurate. Consider using '#align con.lift_coe Con.lift_coeₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[simp,
   to_additive
@@ -1181,12 +986,6 @@ theorem lift_coe (H : c ≤ ker f) (x : M) : c.lift f H x = f x :=
 #align con.lift_coe Con.lift_coe
 #align add_con.lift_coe AddCon.lift_coe
 
-/- warning: con.lift_comp_mk' -> Con.lift_comp_mk' is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (MonoidHom.comp.{u1, u1, u2} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) _inst_3 (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) (Con.mk'.{u1} M _inst_1 c)) f
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.mk'.{u2} M _inst_1 c)) f
-Case conversion may be inaccurate. Consider using '#align con.lift_comp_mk' Con.lift_comp_mk'ₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[simp,
   to_additive
@@ -1195,9 +994,6 @@ theorem lift_comp_mk' (H : c ≤ ker f) : (c.lift f H).comp c.mk' = f := by ext
 #align con.lift_comp_mk' Con.lift_comp_mk'
 #align add_con.lift_comp_mk' AddCon.lift_comp_mk'
 
-/- warning: con.lift_apply_mk' -> Con.lift_apply_mk' is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align con.lift_apply_mk' Con.lift_apply_mk'ₓ'. -/
 /-- Given a homomorphism `f` from the quotient of a monoid by a congruence relation, `f` equals the
     homomorphism on the quotient induced by `f` composed with the natural map from the monoid to
     the quotient. -/
@@ -1210,12 +1006,6 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
 #align con.lift_apply_mk' Con.lift_apply_mk'
 #align add_con.lift_apply_mk' AddCon.lift_apply_mk'
 
-/- warning: con.lift_funext -> Con.lift_funext is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (g : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) g ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f g)
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) g (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) f g)
-Case conversion may be inaccurate. Consider using '#align con.lift_funext Con.lift_funextₓ'. -/
 /-- Homomorphisms on the quotient of a monoid by a congruence relation are equal if they
     are equal on elements that are coercions from the monoid. -/
 @[to_additive
@@ -1228,12 +1018,6 @@ theorem lift_funext (f g : c.Quotient →* P) (h : ∀ a : M, f a = g a) : f = g
 #align con.lift_funext Con.lift_funext
 #align add_con.lift_funext AddCon.lift_funext
 
-/- warning: con.lift_unique -> Con.lift_unique is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (g : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (MonoidHom.comp.{u1, u1, u2} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) _inst_3 g (Con.mk'.{u1} M _inst_1 c)) f) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) g (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H))
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 g (Con.mk'.{u2} M _inst_1 c)) f) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) g (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))
-Case conversion may be inaccurate. Consider using '#align con.lift_unique Con.lift_uniqueₓ'. -/
 /-- The uniqueness part of the universal property for quotients of monoids. -/
 @[to_additive "The uniqueness part of the universal property for quotients of `add_monoid`s."]
 theorem lift_unique (H : c ≤ ker f) (g : c.Quotient →* P) (Hg : g.comp c.mk' = f) :
@@ -1242,12 +1026,6 @@ theorem lift_unique (H : c ≤ ker f) (g : c.Quotient →* P) (Hg : g.comp c.mk'
 #align con.lift_unique Con.lift_unique
 #align add_con.lift_unique AddCon.lift_unique
 
-/- warning: con.lift_range -> Con.lift_range is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), Eq.{succ u2} (Submonoid.{u2} P _inst_3) (MonoidHom.mrange.{u1, u2, max u2 u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3 (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H)) (MonoidHom.mrange.{u1, u2, max u2 u1} M P _inst_1 _inst_3 (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3) f)
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), Eq.{succ u1} (Submonoid.{u1} P _inst_3) (MonoidHom.mrange.{u2, u1, max u2 u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H)) (MonoidHom.mrange.{u2, u1, max u2 u1} M P _inst_1 _inst_3 (MonoidHom.{u2, u1} M P _inst_1 _inst_3) (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3) f)
-Case conversion may be inaccurate. Consider using '#align con.lift_range Con.lift_rangeₓ'. -/
 /-- Given a congruence relation `c` on a monoid and a homomorphism `f` constant on `c`'s
     equivalence classes, `f` has the same image as the homomorphism that `f` induces on the
     quotient. -/
@@ -1258,12 +1036,6 @@ theorem lift_range (H : c ≤ ker f) : (c.lift f H).mrange = f.mrange :=
 #align con.lift_range Con.lift_range
 #align add_con.lift_range AddCon.lift_range
 
-/- warning: con.lift_surjective_of_surjective -> Con.lift_surjective_of_surjective is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (Function.Surjective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f h)))
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (h : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u2, succ u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f)) -> (Function.Surjective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f h)))
-Case conversion may be inaccurate. Consider using '#align con.lift_surjective_of_surjective Con.lift_surjective_of_surjectiveₓ'. -/
 /-- Surjective monoid homomorphisms constant on a congruence relation `c`'s equivalence classes
     induce a surjective homomorphism on `c`'s quotient. -/
 @[to_additive
@@ -1275,12 +1047,6 @@ theorem lift_surjective_of_surjective (h : c ≤ ker f) (hf : Surjective f) :
 
 variable (c f)
 
-/- warning: con.ker_eq_lift_of_injective -> Con.ker_eq_lift_of_injective is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) c)
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) c)
-Case conversion may be inaccurate. Consider using '#align con.ker_eq_lift_of_injective Con.ker_eq_lift_of_injectiveₓ'. -/
 /-- Given a monoid homomorphism `f` from `M` to `P`, the kernel of `f` is the unique congruence
     relation on `M` whose induced map from the quotient of `M` to `P` is injective. -/
 @[to_additive
@@ -1304,12 +1070,6 @@ def kerLift : (ker f).Quotient →* P :=
 
 variable {f}
 
-/- warning: con.ker_lift_mk -> Con.kerLift_mk is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
-but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f x)
-Case conversion may be inaccurate. Consider using '#align con.ker_lift_mk Con.kerLift_mkₓ'. -/
 /-- The diagram described by the universal property for quotients of monoids, when the congruence
     relation is the kernel of the homomorphism, commutes. -/
 @[simp,
@@ -1332,12 +1092,6 @@ theorem kerLift_range_eq : (kerLift f).mrange = f.mrange :=
 #align add_con.ker_lift_range_eq AddCon.kerLift_range_eq
 -/
 
-/- warning: con.ker_lift_injective -> Con.kerLift_injective is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f))
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3), Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u2, u1} M P _inst_1 _inst_3 f))
-Case conversion may be inaccurate. Consider using '#align con.ker_lift_injective Con.kerLift_injectiveₓ'. -/
 /-- A monoid homomorphism `f` induces an injective homomorphism on the quotient by `f`'s kernel. -/
 @[to_additive
       "An `add_monoid` homomorphism `f` induces an injective homomorphism on the quotient\nby `f`'s kernel."]
@@ -1346,12 +1100,6 @@ theorem kerLift_injective (f : M →* P) : Injective (kerLift f) := fun x y =>
 #align con.ker_lift_injective Con.kerLift_injective
 #align add_con.ker_lift_injective AddCon.kerLift_injective
 
-/- warning: con.map -> Con.map is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)), (LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) -> (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)), (LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) -> (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d))
-Case conversion may be inaccurate. Consider using '#align con.map Con.mapₓ'. -/
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, `d`'s quotient
     map induces a homomorphism from the quotient by `c` to the quotient by `d`. -/
 @[to_additive
@@ -1361,12 +1109,6 @@ def map (c d : Con M) (h : c ≤ d) : c.Quotient →* d.Quotient :=
 #align con.map Con.map
 #align add_con.map AddCon.map
 
-/- warning: con.map_apply -> Con.map_apply is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c), Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.map.{u1} M _inst_1 c d h) x) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d x y) (h x y hc))) x)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.map.{u1} M _inst_1 c d h) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d y)) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x y) (h x y hc))) x)
-Case conversion may be inaccurate. Consider using '#align con.map_apply Con.map_applyₓ'. -/
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, the definition of
     the homomorphism from the quotient by `c` to the quotient by `d` induced by `d`'s quotient
     map. -/
@@ -1380,12 +1122,6 @@ theorem map_apply {c d : Con M} (h : c ≤ d) (x) :
 
 variable (c)
 
-/- warning: con.quotient_ker_equiv_range -> Con.quotientKerEquivRange is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (coeSort.{succ u2, succ (succ u2)} (Submonoid.{u2} P _inst_3) Type.{u2} (SetLike.hasCoeToSort.{u2, u2} (Submonoid.{u2} P _inst_3) P (Submonoid.setLike.{u2} P _inst_3)) (MonoidHom.mrange.{u1, u2, max u2 u1} M P _inst_1 _inst_3 (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3) f)) (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Submonoid.mul.{u2} P _inst_3 (MonoidHom.mrange.{u1, u2, max u2 u1} M P _inst_1 _inst_3 (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3) f))
-but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Subtype.{succ u2} P (fun (x : P) => Membership.mem.{u2, u2} P (Submonoid.{u2} P _inst_3) (SetLike.instMembership.{u2, u2} (Submonoid.{u2} P _inst_3) P (Submonoid.instSetLikeSubmonoid.{u2} P _inst_3)) x (MonoidHom.mrange.{u1, u2, max u1 u2} M P _inst_1 _inst_3 (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3) f))) (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Submonoid.mul.{u2} P _inst_3 (MonoidHom.mrange.{u1, u2, max u1 u2} M P _inst_1 _inst_3 (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3) f))
-Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_range Con.quotientKerEquivRangeₓ'. -/
 /-- The first isomorphism theorem for monoids. -/
 @[to_additive "The first isomorphism theorem for `add_monoid`s."]
 noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* f.mrange :=
@@ -1402,12 +1138,6 @@ noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* f
 #align con.quotient_ker_equiv_range Con.quotientKerEquivRange
 #align add_con.quotient_ker_equiv_range AddCon.quotientKerEquivRange
 
-/- warning: con.quotient_ker_equiv_of_right_inverse -> Con.quotientKerEquivOfRightInverse is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
-but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
-Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverseₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a homomorphism with right inverse. -/
 @[to_additive
       "The first isomorphism theorem for `add_monoid`s in the case of a homomorphism\nwith right inverse.",
@@ -1422,12 +1152,6 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
 #align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverse
 #align add_con.quotient_ker_equiv_of_right_inverse AddCon.quotientKerEquivOfRightInverse
 
-/- warning: con.quotient_ker_equiv_of_surjective -> Con.quotientKerEquivOfSurjective is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
-but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
-Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjectiveₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a surjective homomorphism.
 
 For a `computable` version, see `con.quotient_ker_equiv_of_right_inverse`.
@@ -1440,12 +1164,6 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
 #align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjective
 #align add_con.quotient_ker_equiv_of_surjective AddCon.quotientKerEquivOfSurjective
 
-/- warning: con.comap_quotient_equiv -> Con.comapQuotientEquiv is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (coeSort.{succ u1, succ (succ u1)} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Submonoid.setLike.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))) (Con.hasMul.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
-but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Subtype.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Membership.mem.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.instSetLikeSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) x (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))) (Con.hasMul.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
-Case conversion may be inaccurate. Consider using '#align con.comap_quotient_equiv Con.comapQuotientEquivₓ'. -/
 /-- The second isomorphism theorem for monoids. -/
 @[to_additive "The second isomorphism theorem for `add_monoid`s."]
 noncomputable def comapQuotientEquiv (f : N →* M) :
@@ -1454,12 +1172,6 @@ noncomputable def comapQuotientEquiv (f : N →* M) :
 #align con.comap_quotient_equiv Con.comapQuotientEquiv
 #align add_con.comap_quotient_equiv AddCon.comapQuotientEquiv
 
-/- warning: con.quotient_quotient_equiv_quotient -> Con.quotientQuotientEquivQuotient is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d), MulEquiv.{u1, u1} (Con.Quotient.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (MulOneClass.toHasMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.ker.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (Con.map.{u1} M _inst_1 c d h))) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.hasMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (MulOneClass.toHasMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.ker.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (Con.map.{u1} M _inst_1 c d h))) (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d), MulEquiv.{u1, u1} (Con.Quotient.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.ker.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (Con.map.{u1} M _inst_1 c d h))) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.hasMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.ker.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (Con.map.{u1} M _inst_1 c d h))) (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d)
-Case conversion may be inaccurate. Consider using '#align con.quotient_quotient_equiv_quotient Con.quotientQuotientEquivQuotientₓ'. -/
 /-- The third isomorphism theorem for monoids. -/
 @[to_additive "The third isomorphism theorem for `add_monoid`s."]
 def quotientQuotientEquivQuotient (c d : Con M) (h : c ≤ d) :
@@ -1476,12 +1188,6 @@ end MulOneClass
 
 section Monoids
 
-/- warning: con.pow -> Con.pow is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (n : Nat) {w : M} {x : M}, (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c w x) -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HPow.hPow.{u1, 0, u1} M Nat M (instHPow.{u1, 0} M Nat (Monoid.Pow.{u1} M _inst_1)) w n) (HPow.hPow.{u1, 0, u1} M Nat M (instHPow.{u1, 0} M Nat (Monoid.Pow.{u1} M _inst_1)) x n))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (n : Nat) {w : M} {x : M}, (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c w x) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HPow.hPow.{u1, 0, u1} M Nat M (instHPow.{u1, 0} M Nat (Monoid.Pow.{u1} M _inst_1)) w n) (HPow.hPow.{u1, 0, u1} M Nat M (instHPow.{u1, 0} M Nat (Monoid.Pow.{u1} M _inst_1)) x n))
-Case conversion may be inaccurate. Consider using '#align con.pow Con.powₓ'. -/
 /-- Multiplicative congruence relations preserve natural powers. -/
 @[to_additive AddCon.nsmul "Additive congruence relations preserve natural scaling."]
 protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
@@ -1495,12 +1201,6 @@ protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
 instance {M : Type _} [MulOneClass M] (c : Con M) : One c.Quotient
     where one := ((1 : M) : c.Quotient)
 
-/- warning: con.smul -> Con.smul is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : MulOneClass.{u2} M] [_inst_2 : SMul.{u1, u2} α M] [_inst_3 : IsScalarTower.{u1, u2, u2} α M M _inst_2 (Mul.toSMul.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) _inst_2] (c : Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) (a : α) {w : M} {x : M}, (coeFn.{succ u2, succ u2} (Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) (fun (_x : Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) c w x) -> (coeFn.{succ u2, succ u2} (Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) (fun (_x : Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) c (SMul.smul.{u1, u2} α M _inst_2 a w) (SMul.smul.{u1, u2} α M _inst_2 a x))
-but is expected to have type
-  forall {α : Type.{u2}} {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : SMul.{u2, u1} α M] [_inst_3 : IsScalarTower.{u2, u1, u1} α M M _inst_2 (Mul.toSMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) _inst_2] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (a : α) {w : M} {x : M}, (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c w x) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c (HSMul.hSMul.{u2, u1, u1} α M M (instHSMul.{u2, u1} α M _inst_2) a w) (HSMul.hSMul.{u2, u1, u1} α M M (instHSMul.{u2, u1} α M _inst_2) a x))
-Case conversion may be inaccurate. Consider using '#align con.smul Con.smulₓ'. -/
 @[to_additive]
 theorem smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α)
     {w x : M} (h : c w x) : c (a • w) (a • x) := by
@@ -1508,12 +1208,6 @@ theorem smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M]
 #align con.smul Con.smul
 #align add_con.vadd AddCon.vadd
 
-/- warning: add_con.quotient.has_nsmul -> AddCon.Quotient.nsmul is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : AddMonoid.{u1} M] (c : AddCon.{u1} M (AddZeroClass.toHasAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M _inst_1))), SMul.{0, u1} Nat (AddCon.Quotient.{u1} M (AddZeroClass.toHasAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M _inst_1)) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : AddMonoid.{u1} M] (c : AddCon.{u1} M (AddZeroClass.toAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M _inst_1))), SMul.{0, u1} Nat (AddCon.Quotient.{u1} M (AddZeroClass.toAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M _inst_1)) c)
-Case conversion may be inaccurate. Consider using '#align add_con.quotient.has_nsmul AddCon.Quotient.nsmulₓ'. -/
 instance AddCon.Quotient.nsmul {M : Type _} [AddMonoid M] (c : AddCon M) : SMul ℕ c.Quotient
     where smul n := Quotient.map' ((· • ·) n) fun x y => c.nsmul n
 #align add_con.quotient.has_nsmul AddCon.Quotient.nsmul
@@ -1522,12 +1216,6 @@ instance AddCon.Quotient.nsmul {M : Type _} [AddMonoid M] (c : AddCon M) : SMul
 instance {M : Type _} [Monoid M] (c : Con M) : Pow c.Quotient ℕ
     where pow x n := Quotient.map' (fun x => x ^ n) (fun x y => c.pow n) x
 
-/- warning: con.semigroup -> Con.semigroup is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Semigroup.{u1} M] (c : Con.{u1} M (Semigroup.toHasMul.{u1} M _inst_1)), Semigroup.{u1} (Con.Quotient.{u1} M (Semigroup.toHasMul.{u1} M _inst_1) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Semigroup.{u1} M] (c : Con.{u1} M (Semigroup.toMul.{u1} M _inst_1)), Semigroup.{u1} (Con.Quotient.{u1} M (Semigroup.toMul.{u1} M _inst_1) c)
-Case conversion may be inaccurate. Consider using '#align con.semigroup Con.semigroupₓ'. -/
 /-- The quotient of a semigroup by a congruence relation is a semigroup. -/
 @[to_additive
       "The quotient of an `add_semigroup` by an additive congruence relation is\nan `add_semigroup`."]
@@ -1536,12 +1224,6 @@ instance semigroup {M : Type _} [Semigroup M] (c : Con M) : Semigroup c.Quotient
 #align con.semigroup Con.semigroup
 #align add_con.add_semigroup AddCon.addSemigroup
 
-/- warning: con.comm_semigroup -> Con.commSemigroup is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : CommSemigroup.{u1} M] (c : Con.{u1} M (Semigroup.toHasMul.{u1} M (CommSemigroup.toSemigroup.{u1} M _inst_1))), CommSemigroup.{u1} (Con.Quotient.{u1} M (Semigroup.toHasMul.{u1} M (CommSemigroup.toSemigroup.{u1} M _inst_1)) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : CommSemigroup.{u1} M] (c : Con.{u1} M (Semigroup.toMul.{u1} M (CommSemigroup.toSemigroup.{u1} M _inst_1))), CommSemigroup.{u1} (Con.Quotient.{u1} M (Semigroup.toMul.{u1} M (CommSemigroup.toSemigroup.{u1} M _inst_1)) c)
-Case conversion may be inaccurate. Consider using '#align con.comm_semigroup Con.commSemigroupₓ'. -/
 /-- The quotient of a commutative semigroup by a congruence relation is a semigroup. -/
 @[to_additive
       "The quotient of an `add_comm_semigroup` by an additive congruence relation is\nan `add_semigroup`."]
@@ -1550,12 +1232,6 @@ instance commSemigroup {M : Type _} [CommSemigroup M] (c : Con M) : CommSemigrou
 #align con.comm_semigroup Con.commSemigroup
 #align add_con.add_comm_semigroup AddCon.addCommSemigroup
 
-/- warning: con.monoid -> Con.monoid is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))), Monoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))), Monoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c)
-Case conversion may be inaccurate. Consider using '#align con.monoid Con.monoidₓ'. -/
 /-- The quotient of a monoid by a congruence relation is a monoid. -/
 @[to_additive
       "The quotient of an `add_monoid` by an additive congruence relation is\nan `add_monoid`."]
@@ -1564,12 +1240,6 @@ instance monoid {M : Type _} [Monoid M] (c : Con M) : Monoid c.Quotient :=
 #align con.monoid Con.monoid
 #align add_con.add_monoid AddCon.addMonoid
 
-/- warning: con.comm_monoid -> Con.commMonoid is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : CommMonoid.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (CommMonoid.toMonoid.{u1} M _inst_1)))), CommMonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (CommMonoid.toMonoid.{u1} M _inst_1))) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : CommMonoid.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (CommMonoid.toMonoid.{u1} M _inst_1)))), CommMonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (CommMonoid.toMonoid.{u1} M _inst_1))) c)
-Case conversion may be inaccurate. Consider using '#align con.comm_monoid Con.commMonoidₓ'. -/
 /-- The quotient of a `comm_monoid` by a congruence relation is a `comm_monoid`. -/
 @[to_additive
       "The quotient of an `add_comm_monoid` by an additive congruence\nrelation is an `add_comm_monoid`."]
@@ -1585,12 +1255,6 @@ section Groups
 
 variable {M} [Group M] [Group N] [Group P] (c : Con M)
 
-/- warning: con.inv -> Con.inv is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) {w : M} {x : M}, (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c w x) -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c (Inv.inv.{u1} M (DivInvMonoid.toHasInv.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)) w) (Inv.inv.{u1} M (DivInvMonoid.toHasInv.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)) x))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) {w : M} {x : M}, (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c w x) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c (Inv.inv.{u1} M (InvOneClass.toInv.{u1} M (DivInvOneMonoid.toInvOneClass.{u1} M (DivisionMonoid.toDivInvOneMonoid.{u1} M (Group.toDivisionMonoid.{u1} M _inst_1)))) w) (Inv.inv.{u1} M (InvOneClass.toInv.{u1} M (DivInvOneMonoid.toInvOneClass.{u1} M (DivisionMonoid.toDivInvOneMonoid.{u1} M (Group.toDivisionMonoid.{u1} M _inst_1)))) x))
-Case conversion may be inaccurate. Consider using '#align con.inv Con.invₓ'. -/
 /-- Multiplicative congruence relations preserve inversion. -/
 @[to_additive "Additive congruence relations preserve negation."]
 protected theorem inv : ∀ {w x}, c w x → c w⁻¹ x⁻¹ := fun x y h => by
@@ -1598,12 +1262,6 @@ protected theorem inv : ∀ {w x}, c w x → c w⁻¹ x⁻¹ := fun x y h => by
 #align con.inv Con.inv
 #align add_con.neg AddCon.neg
 
-/- warning: con.div -> Con.div is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) {w : M} {x : M} {y : M} {z : M}, (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c w x) -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c y z) -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toHasDiv.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) w y) (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toHasDiv.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) x z))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) {w : M} {x : M} {y : M} {z : M}, (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c w x) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c y z) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toDiv.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) w y) (HDiv.hDiv.{u1, u1, u1} M M M (instHDiv.{u1} M (DivInvMonoid.toDiv.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) x z))
-Case conversion may be inaccurate. Consider using '#align con.div Con.divₓ'. -/
 /-- Multiplicative congruence relations preserve division. -/
 @[to_additive "Additive congruence relations preserve subtraction."]
 protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) := fun w x y z h1 h2 => by
@@ -1611,12 +1269,6 @@ protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) :=
 #align con.div Con.div
 #align add_con.sub AddCon.sub
 
-/- warning: con.zpow -> Con.zpow is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (n : Int) {w : M} {x : M}, (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c w x) -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c (HPow.hPow.{u1, 0, u1} M Int M (instHPow.{u1, 0} M Int (DivInvMonoid.Pow.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) w n) (HPow.hPow.{u1, 0, u1} M Int M (instHPow.{u1, 0} M Int (DivInvMonoid.Pow.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) x n))
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) (n : Int) {w : M} {x : M}, (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c w x) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))) c (HPow.hPow.{u1, 0, u1} M Int M (instHPow.{u1, 0} M Int (DivInvMonoid.Pow.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) w n) (HPow.hPow.{u1, 0, u1} M Int M (instHPow.{u1, 0} M Int (DivInvMonoid.Pow.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))) x n))
-Case conversion may be inaccurate. Consider using '#align con.zpow Con.zpowₓ'. -/
 /-- Multiplicative congruence relations preserve integer powers. -/
 @[to_additive AddCon.zsmul "Additive congruence relations preserve integer scaling."]
 protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
@@ -1625,12 +1277,6 @@ protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
 #align con.zpow Con.zpow
 #align add_con.zsmul AddCon.zsmul
 
-/- warning: con.has_inv -> Con.hasInv is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Inv.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Inv.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c)
-Case conversion may be inaccurate. Consider using '#align con.has_inv Con.hasInvₓ'. -/
 /-- The inversion induced on the quotient by a congruence relation on a type with a
     inversion. -/
 @[to_additive
@@ -1640,12 +1286,6 @@ instance hasInv : Inv c.Quotient :=
 #align con.has_inv Con.hasInv
 #align add_con.has_neg AddCon.hasNeg
 
-/- warning: con.has_div -> Con.hasDiv is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Div.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Div.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c)
-Case conversion may be inaccurate. Consider using '#align con.has_div Con.hasDivₓ'. -/
 /-- The division induced on the quotient by a congruence relation on a type with a
     division. -/
 @[to_additive
@@ -1655,24 +1295,12 @@ instance hasDiv : Div c.Quotient :=
 #align con.has_div Con.hasDiv
 #align add_con.has_sub AddCon.hasSub
 
-/- warning: add_con.quotient.has_zsmul -> AddCon.Quotient.zsmul is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_4 : AddGroup.{u1} M] (c : AddCon.{u1} M (AddZeroClass.toHasAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M _inst_4))))), SMul.{0, u1} Int (AddCon.Quotient.{u1} M (AddZeroClass.toHasAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M _inst_4)))) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_4 : AddGroup.{u1} M] (c : AddCon.{u1} M (AddZeroClass.toAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M _inst_4))))), SMul.{0, u1} Int (AddCon.Quotient.{u1} M (AddZeroClass.toAdd.{u1} M (AddMonoid.toAddZeroClass.{u1} M (SubNegMonoid.toAddMonoid.{u1} M (AddGroup.toSubNegMonoid.{u1} M _inst_4)))) c)
-Case conversion may be inaccurate. Consider using '#align add_con.quotient.has_zsmul AddCon.Quotient.zsmulₓ'. -/
 /-- The integer scaling induced on the quotient by a congruence relation on a type with a
     subtraction. -/
 instance AddCon.Quotient.zsmul {M : Type _} [AddGroup M] (c : AddCon M) : SMul ℤ c.Quotient :=
   ⟨fun z => Quotient.map' ((· • ·) z) fun x y => c.zsmul z⟩
 #align add_con.quotient.has_zsmul AddCon.Quotient.zsmul
 
-/- warning: con.has_zpow -> Con.zpowinst is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Pow.{u1, 0} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c) Int
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Pow.{u1, 0} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c) Int
-Case conversion may be inaccurate. Consider using '#align con.has_zpow Con.zpowinstₓ'. -/
 /-- The integer power induced on the quotient by a congruence relation on a type with a
     division. -/
 @[to_additive AddCon.Quotient.zsmul]
@@ -1681,12 +1309,6 @@ instance zpowinst : Pow c.Quotient ℤ :=
 #align con.has_zpow Con.zpowinst
 #align add_con.quotient.has_zsmul AddCon.Quotient.zsmul
 
-/- warning: con.group -> Con.group is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Group.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Group.{u1} M] (c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1))))), Group.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M (DivInvMonoid.toMonoid.{u1} M (Group.toDivInvMonoid.{u1} M _inst_1)))) c)
-Case conversion may be inaccurate. Consider using '#align con.group Con.groupₓ'. -/
 /-- The quotient of a group by a congruence relation is a group. -/
 @[to_additive
       "The quotient of an `add_group` by an additive congruence relation is\nan `add_group`."]
@@ -1702,12 +1324,6 @@ section Units
 
 variable {α : Type _} [Monoid M] {c : Con M}
 
-/- warning: con.lift_on_units -> Con.liftOnUnits is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {α : Type.{u2}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))}, (Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)) -> (forall (f : forall (x : M) (y : M), (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) -> α), (forall (x : M) (y : M) (hxy : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (hyx : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (x' : M) (y' : M) (hxy' : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x' y') (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (hyx' : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y' x') (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))), (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c x x') -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c y y') -> (Eq.{succ u2} α (f x y hxy hyx) (f x' y' hxy' hyx'))) -> α)
-but is expected to have type
-  forall {M : Type.{u1}} {α : Type.{u2}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))}, (Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)) -> (forall (f : forall (x : M) (y : M), (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) -> α), (forall (x : M) (y : M) (hxy : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) (hyx : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) (x' : M) (y' : M) (hxy' : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x' y') (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) (hyx' : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y' x') (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))), (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c x x') -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c y y') -> (Eq.{succ u2} α (f x y hxy hyx) (f x' y' hxy' hyx'))) -> α)
-Case conversion may be inaccurate. Consider using '#align con.lift_on_units Con.liftOnUnitsₓ'. -/
 /-- In order to define a function `(con.quotient c)ˣ → α` on the units of `con.quotient c`,
 where `c : con M` is a multiplicative congruence on a monoid, it suffices to define a function `f`
 that takes elements `x y : M` with proofs of `c (x * y) 1` and `c (y * x) 1`, and returns an element
@@ -1736,9 +1352,6 @@ that takes elements `x y : M` with proofs of `c (x * y) 1` and `c (y * x) 1`, an
 of `α` provided that `f x y _ _ = f x' y' _ _` whenever `c x x'` and `c y y'`. -/
 add_decl_doc AddCon.liftOnAddUnits
 
-/- warning: con.lift_on_units_mk -> Con.liftOnUnits_mk is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align con.lift_on_units_mk Con.liftOnUnits_mkₓ'. -/
 @[simp, to_additive]
 theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
     (Hf : ∀ x y hxy hyx x' y' hxy' hyx', c x x' → c y y' → f x y hxy hyx = f x' y' hxy' hyx')
@@ -1748,9 +1361,6 @@ theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
 #align con.lift_on_units_mk Con.liftOnUnits_mk
 #align add_con.lift_on_add_units_mk AddCon.liftOnAddUnits_mk
 
-/- warning: con.induction_on_units -> Con.induction_on_units is a dubious translation:
-<too large>
-Case conversion may be inaccurate. Consider using '#align con.induction_on_units Con.induction_on_unitsₓ'. -/
 @[elab_as_elim, to_additive]
 theorem induction_on_units {p : Units c.Quotient → Prop} (u : Units c.Quotient)
     (H : ∀ (x y : M) (hxy : c (x * y) 1) (hyx : c (y * x) 1), p ⟨x, y, c.Eq.2 hxy, c.Eq.2 hyx⟩) :
@@ -1764,24 +1374,12 @@ end Units
 
 section Actions
 
-/- warning: con.has_smul -> Con.smulinst is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : MulOneClass.{u2} M] [_inst_2 : SMul.{u1, u2} α M] [_inst_3 : IsScalarTower.{u1, u2, u2} α M M _inst_2 (Mul.toSMul.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) _inst_2] (c : Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)), SMul.{u1, u2} α (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c)
-but is expected to have type
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : MulOneClass.{u2} M] [_inst_2 : SMul.{u1, u2} α M] [_inst_3 : IsScalarTower.{u1, u2, u2} α M M _inst_2 (Mul.toSMul.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) _inst_2] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)), SMul.{u1, u2} α (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c)
-Case conversion may be inaccurate. Consider using '#align con.has_smul Con.smulinstₓ'. -/
 @[to_additive]
 instance smulinst {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
     SMul α c.Quotient where smul a := Quotient.map' ((· • ·) a) fun x y => c.smul a
 #align con.has_smul Con.smulinst
 #align add_con.has_vadd AddCon.smulinst
 
-/- warning: con.coe_smul -> Con.coe_smul is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : MulOneClass.{u2} M] [_inst_2 : SMul.{u1, u2} α M] [_inst_3 : IsScalarTower.{u1, u2, u2} α M M _inst_2 (Mul.toSMul.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) _inst_2] (c : Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1)) (a : α) (x : M), Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) ((fun (a : Type.{u2}) (b : Type.{u2}) [self : HasLiftT.{succ u2, succ u2} a b] => self.0) M (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) (HasLiftT.mk.{succ u2, succ u2} M (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) (CoeTCₓ.coe.{succ u2, succ u2} M (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) (Con.Quotient.hasCoeT.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c))) (SMul.smul.{u1, u2} α M _inst_2 a x)) (SMul.smul.{u1, u2} α (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) (Con.smulinst.{u1, u2} α M _inst_1 _inst_2 _inst_3 c) a ((fun (a : Type.{u2}) (b : Type.{u2}) [self : HasLiftT.{succ u2, succ u2} a b] => self.0) M (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) (HasLiftT.mk.{succ u2, succ u2} M (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) (CoeTCₓ.coe.{succ u2, succ u2} M (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c) (Con.Quotient.hasCoeT.{u2} M (MulOneClass.toHasMul.{u2} M _inst_1) c))) x))
-but is expected to have type
-  forall {α : Type.{u2}} {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : SMul.{u2, u1} α M] [_inst_3 : IsScalarTower.{u2, u1, u1} α M M _inst_2 (Mul.toSMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) _inst_2] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (a : α) (x : M), Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c (HSMul.hSMul.{u2, u1, u1} α M M (instHSMul.{u2, u1} α M _inst_2) a x)) (HSMul.hSMul.{u2, u1, u1} α (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (instHSMul.{u2, u1} α (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.smulinst.{u2, u1} α M _inst_1 _inst_2 _inst_3 c)) a (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c x))
-Case conversion may be inaccurate. Consider using '#align con.coe_smul Con.coe_smulₓ'. -/
 @[to_additive]
 theorem coe_smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α)
     (x : M) : (↑(a • x) : c.Quotient) = a • ↑x :=
@@ -1789,12 +1387,6 @@ theorem coe_smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M
 #align con.coe_smul Con.coe_smul
 #align add_con.coe_vadd AddCon.coe_vadd
 
-/- warning: con.mul_action -> Con.mulAction is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : Monoid.{u1} α] [_inst_2 : MulOneClass.{u2} M] [_inst_3 : MulAction.{u1, u2} α M _inst_1] [_inst_4 : IsScalarTower.{u1, u2, u2} α M M (MulAction.toHasSmul.{u1, u2} α M _inst_1 _inst_3) (Mul.toSMul.{u2} M (MulOneClass.toHasMul.{u2} M _inst_2)) (MulAction.toHasSmul.{u1, u2} α M _inst_1 _inst_3)] (c : Con.{u2} M (MulOneClass.toHasMul.{u2} M _inst_2)), MulAction.{u1, u2} α (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M _inst_2) c) _inst_1
-but is expected to have type
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : Monoid.{u1} α] [_inst_2 : MulOneClass.{u2} M] [_inst_3 : MulAction.{u1, u2} α M _inst_1] [_inst_4 : IsScalarTower.{u1, u2, u2} α M M (MulAction.toSMul.{u1, u2} α M _inst_1 _inst_3) (Mul.toSMul.{u2} M (MulOneClass.toMul.{u2} M _inst_2)) (MulAction.toSMul.{u1, u2} α M _inst_1 _inst_3)] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_2)), MulAction.{u1, u2} α (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_2) c) _inst_1
-Case conversion may be inaccurate. Consider using '#align con.mul_action Con.mulActionₓ'. -/
 @[to_additive]
 instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M] [IsScalarTower α M M]
     (c : Con M) : MulAction α c.Quotient
@@ -1805,12 +1397,6 @@ instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M]
 #align con.mul_action Con.mulAction
 #align add_con.add_action AddCon.addAction
 
-/- warning: con.mul_distrib_mul_action -> Con.mulDistribMulAction is a dubious translation:
-lean 3 declaration is
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : Monoid.{u1} α] [_inst_2 : Monoid.{u2} M] [_inst_3 : MulDistribMulAction.{u1, u2} α M _inst_1 _inst_2] [_inst_4 : IsScalarTower.{u1, u2, u2} α M M (MulAction.toHasSmul.{u1, u2} α M _inst_1 (MulDistribMulAction.toMulAction.{u1, u2} α M _inst_1 _inst_2 _inst_3)) (Mul.toSMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_2))) (MulAction.toHasSmul.{u1, u2} α M _inst_1 (MulDistribMulAction.toMulAction.{u1, u2} α M _inst_1 _inst_2 _inst_3))] (c : Con.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_2))), MulDistribMulAction.{u1, u2} α (Con.Quotient.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_2)) c) _inst_1 (Con.monoid.{u2} M _inst_2 c)
-but is expected to have type
-  forall {α : Type.{u1}} {M : Type.{u2}} [_inst_1 : Monoid.{u1} α] [_inst_2 : Monoid.{u2} M] [_inst_3 : MulDistribMulAction.{u1, u2} α M _inst_1 _inst_2] [_inst_4 : IsScalarTower.{u1, u2, u2} α M M (MulAction.toSMul.{u1, u2} α M _inst_1 (MulDistribMulAction.toMulAction.{u1, u2} α M _inst_1 _inst_2 _inst_3)) (MulAction.toSMul.{u2, u2} M M _inst_2 (Monoid.toMulAction.{u2} M _inst_2)) (MulAction.toSMul.{u1, u2} α M _inst_1 (MulDistribMulAction.toMulAction.{u1, u2} α M _inst_1 _inst_2 _inst_3))] (c : Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_2))), MulDistribMulAction.{u1, u2} α (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_2)) c) _inst_1 (Con.monoid.{u2} M _inst_2 c)
-Case conversion may be inaccurate. Consider using '#align con.mul_distrib_mul_action Con.mulDistribMulActionₓ'. -/
 instance mulDistribMulAction {α M : Type _} [Monoid α] [Monoid M] [MulDistribMulAction α M]
     [IsScalarTower α M M] (c : Con M) : MulDistribMulAction α c.Quotient :=
   { c.MulAction with
Diff
@@ -202,12 +202,8 @@ variable {c}
 /-- The map sending a congruence relation to its underlying binary relation is injective. -/
 @[to_additive
       "The map sending an additive congruence relation to its underlying binary relation\nis injective."]
-theorem ext' {c d : Con M} (H : c.R = d.R) : c = d :=
-  by
-  rcases c with ⟨⟨⟩⟩
-  rcases d with ⟨⟨⟩⟩
-  cases H
-  congr
+theorem ext' {c d : Con M} (H : c.R = d.R) : c = d := by rcases c with ⟨⟨⟩⟩; rcases d with ⟨⟨⟩⟩;
+  cases H; congr
 #align con.ext' Con.ext'
 #align add_con.ext' AddCon.ext'
 -/
@@ -256,9 +252,7 @@ theorem ext'_iff {c d : Con M} : c.R = d.R ↔ c = d :=
 def mulKer (f : M → P) (h : ∀ x y, f (x * y) = f x * f y) : Con M
     where
   toSetoid := Setoid.ker f
-  mul' _ _ _ _ h1 h2 := by
-    dsimp [Setoid.ker, on_fun] at *
-    rw [h, h1, h2, h]
+  mul' _ _ _ _ h1 h2 := by dsimp [Setoid.ker, on_fun] at *; rw [h, h1, h2, h]
 #align con.mul_ker Con.mulKer
 #align add_con.add_ker AddCon.addKer
 -/
@@ -524,10 +518,7 @@ Case conversion may be inaccurate. Consider using '#align con.Inf_def Con.sInf_d
 @[to_additive
       "The infimum of a set of additive congruence relations is the same as the infimum\nof the set's image under the map to the underlying binary relation."]
 theorem sInf_def (S : Set (Con M)) : ⇑(sInf S) = sInf (@Set.image (Con M) (M → M → Prop) coeFn S) :=
-  by
-  ext
-  simp only [sInf_image, iInf_apply, iInf_Prop_eq]
-  rfl
+  by ext; simp only [sInf_image, iInf_apply, iInf_Prop_eq]; rfl
 #align con.Inf_def Con.sInf_def
 #align add_con.Inf_def AddCon.sInf_def
 
@@ -1247,9 +1238,7 @@ Case conversion may be inaccurate. Consider using '#align con.lift_unique Con.li
 @[to_additive "The uniqueness part of the universal property for quotients of `add_monoid`s."]
 theorem lift_unique (H : c ≤ ker f) (g : c.Quotient →* P) (Hg : g.comp c.mk' = f) :
     g = c.lift f H :=
-  lift_funext g (c.lift f H) fun x => by
-    subst f
-    rfl
+  lift_funext g (c.lift f H) fun x => by subst f; rfl
 #align con.lift_unique Con.lift_unique
 #align add_con.lift_unique AddCon.lift_unique
 
Diff
@@ -359,10 +359,7 @@ protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quoti
 -/
 
 /- warning: con.hrec_on₂_coe -> Con.hrec_on₂_coe is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : Mul.{u1} M] [_inst_2 : Mul.{u2} N] {cM : Con.{u1} M _inst_1} {cN : Con.{u2} N _inst_2} {φ : (Con.Quotient.{u1} M _inst_1 cM) -> (Con.Quotient.{u2} N _inst_2 cN) -> Sort.{u3}} (a : M) (b : N) (f : forall (x : M) (y : N), φ ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M _inst_1 cM) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (Con.Quotient.hasCoeT.{u1} M _inst_1 cM))) x) ((fun (a : Type.{u2}) (b : Type.{u2}) [self : HasLiftT.{succ u2, succ u2} a b] => self.0) N (Con.Quotient.{u2} N _inst_2 cN) (HasLiftT.mk.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (CoeTCₓ.coe.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (Con.Quotient.hasCoeT.{u2} N _inst_2 cN))) y)) (h : forall (x : M) (y : N) (x' : M) (y' : N), (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) cM x x') -> (coeFn.{succ u2, succ u2} (Con.{u2} N _inst_2) (fun (_x : Con.{u2} N _inst_2) => N -> N -> Prop) (Con.hasCoeToFun.{u2} N _inst_2) cN y y') -> (HEq.{u3} (φ ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M _inst_1 cM) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (Con.Quotient.hasCoeT.{u1} M _inst_1 cM))) x) ((fun (a : Type.{u2}) (b : Type.{u2}) [self : HasLiftT.{succ u2, succ u2} a b] => self.0) N (Con.Quotient.{u2} N _inst_2 cN) (HasLiftT.mk.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (CoeTCₓ.coe.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (Con.Quotient.hasCoeT.{u2} N _inst_2 cN))) y)) (f x y) (φ ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M _inst_1 cM) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (Con.Quotient.hasCoeT.{u1} M _inst_1 cM))) x') ((fun (a : Type.{u2}) (b : Type.{u2}) [self : HasLiftT.{succ u2, succ u2} a b] => self.0) N (Con.Quotient.{u2} N _inst_2 cN) (HasLiftT.mk.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (CoeTCₓ.coe.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (Con.Quotient.hasCoeT.{u2} N _inst_2 cN))) y')) (f x' y'))), Eq.{u3} (φ ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M _inst_1 cM) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (Con.Quotient.hasCoeT.{u1} M _inst_1 cM))) a) ((fun (a : Type.{u2}) (b : Type.{u2}) [self : HasLiftT.{succ u2, succ u2} a b] => self.0) N (Con.Quotient.{u2} N _inst_2 cN) (HasLiftT.mk.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (CoeTCₓ.coe.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (Con.Quotient.hasCoeT.{u2} N _inst_2 cN))) b)) (Con.hrecOn₂.{u1, u2, u3} M N _inst_1 _inst_2 cM cN φ ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M _inst_1 cM) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M _inst_1 cM) (Con.Quotient.hasCoeT.{u1} M _inst_1 cM))) a) ((fun (a : Type.{u2}) (b : Type.{u2}) [self : HasLiftT.{succ u2, succ u2} a b] => self.0) N (Con.Quotient.{u2} N _inst_2 cN) (HasLiftT.mk.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (CoeTCₓ.coe.{succ u2, succ u2} N (Con.Quotient.{u2} N _inst_2 cN) (Con.Quotient.hasCoeT.{u2} N _inst_2 cN))) b) f h) (f a b)
-but is expected to have type
-  forall {M : Type.{u3}} {N : Type.{u2}} [_inst_1 : Mul.{u3} M] [_inst_2 : Mul.{u2} N] {cM : Con.{u3} M _inst_1} {cN : Con.{u2} N _inst_2} {φ : (Con.Quotient.{u3} M _inst_1 cM) -> (Con.Quotient.{u2} N _inst_2 cN) -> Sort.{u1}} (a : M) (b : N) (f : forall (x : M) (y : N), φ (Con.toQuotient.{u3} M _inst_1 cM x) (Con.toQuotient.{u2} N _inst_2 cN y)) (h : forall (x : M) (y : N) (x' : M) (y' : N), (FunLike.coe.{succ u3, succ u3, succ u3} (Con.{u3} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u3} M _inst_1) cM x x') -> (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} N _inst_2) N (fun (_x : N) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : N) => N -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} N _inst_2) cN y y') -> (HEq.{u1} (φ (Con.toQuotient.{u3} M _inst_1 cM x) (Con.toQuotient.{u2} N _inst_2 cN y)) (f x y) (φ (Con.toQuotient.{u3} M _inst_1 cM x') (Con.toQuotient.{u2} N _inst_2 cN y')) (f x' y'))), Eq.{u1} (φ (Con.toQuotient.{u3} M _inst_1 cM a) (Con.toQuotient.{u2} N _inst_2 cN b)) (Con.hrecOn₂.{u3, u2, u1} M N _inst_1 _inst_2 cM cN φ (Con.toQuotient.{u3} M _inst_1 cM a) (Con.toQuotient.{u2} N _inst_2 cN b) f h) (f a b)
+<too large>
 Case conversion may be inaccurate. Consider using '#align con.hrec_on₂_coe Con.hrec_on₂_coeₓ'. -/
 @[simp, to_additive]
 theorem hrec_on₂_coe {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort _} (a : M)
@@ -1208,10 +1205,7 @@ theorem lift_comp_mk' (H : c ≤ ker f) : (c.lift f H).comp c.mk' = f := by ext
 #align add_con.lift_comp_mk' AddCon.lift_comp_mk'
 
 /- warning: con.lift_apply_mk' -> Con.lift_apply_mk' is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c (MonoidHom.comp.{u1, u1, u2} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) _inst_3 f (Con.mk'.{u1} M _inst_1 c)) (fun (x : M) (y : M) (h : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => (fun (this : Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) => this) (Eq.mpr.{0} (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (id_tag Tactic.IdTag.rw (Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (Eq.ndrec.{0, succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) (fun (_a : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f _a) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (rfl.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c x y) h))) (rfl.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))))) f
-but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 f (Con.mk'.{u2} M _inst_1 c)) (fun (x : M) (y : M) (h : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) => [mdata let_fun:1 (fun (this : Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) => this) (Eq.mpr.{0} (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (id.{0} (Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.ndrec.{0, succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (fun (_a : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.refl.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y) (Iff.mpr (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x y) h))) (Eq.refl.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))))])) f
+<too large>
 Case conversion may be inaccurate. Consider using '#align con.lift_apply_mk' Con.lift_apply_mk'ₓ'. -/
 /-- Given a homomorphism `f` from the quotient of a monoid by a congruence relation, `f` equals the
     homomorphism on the quotient induced by `f` composed with the natural map from the monoid to
@@ -1754,10 +1748,7 @@ of `α` provided that `f x y _ _ = f x' y' _ _` whenever `c x x'` and `c y y'`.
 add_decl_doc AddCon.liftOnAddUnits
 
 /- warning: con.lift_on_units_mk -> Con.liftOnUnits_mk is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} {α : Type.{u2}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))} (f : forall (x : M) (y : M), (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) -> α) (Hf : forall (x : M) (y : M) (hxy : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (hyx : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (x' : M) (y' : M) (hxy' : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x' y') (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (hyx' : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y' x') (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))), (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c x x') -> (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c y y') -> (Eq.{succ u2} α (f x y hxy hyx) (f x' y' hxy' hyx'))) (x : M) (y : M) (hxy : Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HMul.hMul.{u1, u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (instHMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (MulOneClass.toHasMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Monoid.toMulOneClass.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) y)) (OfNat.ofNat.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) 1 (OfNat.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) 1 (One.one.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (MulOneClass.toHasOne.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Monoid.toMulOneClass.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c))))))) (hyx : Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HMul.hMul.{u1, u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (instHMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (MulOneClass.toHasMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Monoid.toMulOneClass.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) y) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) x)) (OfNat.ofNat.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) 1 (OfNat.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) 1 (One.one.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (MulOneClass.toHasOne.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Monoid.toMulOneClass.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c))))))), Eq.{succ u2} α (Con.liftOnUnits.{u1, u2} M α _inst_1 c (Units.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) y) hxy hyx) f Hf) (f x y (Iff.mp (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))))) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) hxy) (Iff.mp (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))))) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) hyx))
-but is expected to have type
-  forall {M : Type.{u2}} {α : Type.{u1}} [_inst_1 : Monoid.{u2} M] {c : Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))} (f : forall (x : M) (y : M), (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) x y) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) -> (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) y x) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) -> α) (Hf : forall (x : M) (y : M) (hxy : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) x y) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) (hyx : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) y x) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) (x' : M) (y' : M) (hxy' : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) x' y') (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) (hyx' : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) y' x') (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))), (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c x x') -> (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c y y') -> (Eq.{succ u1} α (f x y hxy hyx) (f x' y' hxy' hyx'))) (x : M) (y : M) (hxy : Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (HMul.hMul.{u2, u2, u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (instHMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Monoid.toMulOneClass.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.monoid.{u2} M _inst_1 c)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c y)) (OfNat.ofNat.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) 1 (One.toOfNat1.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Monoid.toOne.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.monoid.{u2} M _inst_1 c))))) (hyx : Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (HMul.hMul.{u2, u2, u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (instHMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Monoid.toMulOneClass.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.monoid.{u2} M _inst_1 c)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c y) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c x)) (OfNat.ofNat.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) 1 (One.toOfNat1.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Monoid.toOne.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.monoid.{u2} M _inst_1 c))))), Eq.{succ u1} α (Con.liftOnUnits.{u2, u1} M α _inst_1 c (Units.mk.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.monoid.{u2} M _inst_1 c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c y) hxy hyx) f Hf) (f x y (Iff.mp (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) x y)) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1))))) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) x y) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) x y) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) hxy) (Iff.mp (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) y x)) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1))))) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) y x) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1)) c (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M _inst_1))) y x) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M _inst_1)))) hyx))
+<too large>
 Case conversion may be inaccurate. Consider using '#align con.lift_on_units_mk Con.liftOnUnits_mkₓ'. -/
 @[simp, to_additive]
 theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
@@ -1769,10 +1760,7 @@ theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
 #align add_con.lift_on_add_units_mk AddCon.liftOnAddUnits_mk
 
 /- warning: con.induction_on_units -> Con.induction_on_units is a dubious translation:
-lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))} {p : (Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)) -> Prop} (u : Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)), (forall (x : M) (y : M) (hxy : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (hyx : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))), p (Units.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))))) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) hxy) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))))) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) hyx))) -> (p u)
-but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))} {p : (Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)) -> Prop} (u : Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)), (forall (x : M) (y : M) (hxy : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) (hyx : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))), p (Units.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) x y)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) hxy) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) y x)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) hyx))) -> (p u)
+<too large>
 Case conversion may be inaccurate. Consider using '#align con.induction_on_units Con.induction_on_unitsₓ'. -/
 @[elab_as_elim, to_additive]
 theorem induction_on_units {p : Units c.Quotient → Prop} (u : Units c.Quotient)
Diff
@@ -1009,7 +1009,7 @@ def ker (f : M →* P) : Con M :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x y) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f y))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x y) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f y))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x y) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f y))
 Case conversion may be inaccurate. Consider using '#align con.ker_rel Con.ker_relₓ'. -/
 /-- The definition of the congruence relation defined by a monoid homomorphism's kernel. -/
 @[simp,
@@ -1074,7 +1074,7 @@ variable {c}
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c))
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c))
 Case conversion may be inaccurate. Consider using '#align con.mk'_surjective Con.mk'_surjectiveₓ'. -/
 /-- The natural homomorphism from a monoid to its quotient by a congruence relation is
     surjective. -/
@@ -1089,7 +1089,7 @@ theorem mk'_surjective : Surjective c.mk' :=
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Eq.{succ u1} ((fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (Con.mk'.{u1} M _inst_1 c)) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (forall (a : M), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) a) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (forall (a : M), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) a) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
 Case conversion may be inaccurate. Consider using '#align con.coe_mk' Con.coe_mk'ₓ'. -/
 @[simp, to_additive]
 theorem coe_mk' : (c.mk' : M → c.Quotient) = coe :=
@@ -1113,7 +1113,7 @@ theorem mrange_mk' : c.mk'.mrange = ⊤ :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u1} (M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x) (Set.preimage.{u1, u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f) (Singleton.singleton.{u2, u2} P (Set.{u2} P) (Set.hasSingleton.{u2} P) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) x) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x) (Set.preimage.{u2, u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f) (Singleton.singleton.{u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) x) (Set.{u1} P) (Set.instSingletonSet.{u1} P) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) x) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x) (Set.preimage.{u2, u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f) (Singleton.singleton.{u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) x) (Set.{u1} P) (Set.instSingletonSet.{u1} P) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)))
 Case conversion may be inaccurate. Consider using '#align con.ker_apply_eq_preimage Con.ker_apply_eq_preimageₓ'. -/
 /-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
     those in the preimage of `f(x)` under `f`. -/
@@ -1130,7 +1130,7 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
 lean 3 declaration is
   forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
 but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
+  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
 Case conversion may be inaccurate. Consider using '#align con.comap_eq Con.comap_eqₓ'. -/
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
     relation induced on `N` by `f` equals the kernel of `c`'s quotient homomorphism composed with
@@ -1168,7 +1168,7 @@ variable {c f}
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (a : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) a) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _x) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (a : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) a) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _x) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.lift_mk' Con.lift_mk'ₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[to_additive
@@ -1182,7 +1182,7 @@ theorem lift_mk' (H : c ≤ ker f) (x) : c.lift f H (c.mk' x) = f x :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.lift_coe Con.lift_coeₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[simp,
@@ -1211,7 +1211,7 @@ theorem lift_comp_mk' (H : c ≤ ker f) : (c.lift f H).comp c.mk' = f := by ext
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c (MonoidHom.comp.{u1, u1, u2} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) _inst_3 f (Con.mk'.{u1} M _inst_1 c)) (fun (x : M) (y : M) (h : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => (fun (this : Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) => this) (Eq.mpr.{0} (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (id_tag Tactic.IdTag.rw (Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (Eq.ndrec.{0, succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) (fun (_a : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f _a) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (rfl.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c x y) h))) (rfl.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))))) f
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 f (Con.mk'.{u2} M _inst_1 c)) (fun (x : M) (y : M) (h : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) => [mdata let_fun:1 (fun (this : Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) => this) (Eq.mpr.{0} (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (id.{0} (Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.ndrec.{0, succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (fun (_a : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.refl.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y) (Iff.mpr (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x y) h))) (Eq.refl.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))))])) f
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 f (Con.mk'.{u2} M _inst_1 c)) (fun (x : M) (y : M) (h : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) => [mdata let_fun:1 (fun (this : Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) => this) (Eq.mpr.{0} (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (id.{0} (Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.ndrec.{0, succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (fun (_a : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.refl.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y) (Iff.mpr (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x y) h))) (Eq.refl.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))))])) f
 Case conversion may be inaccurate. Consider using '#align con.lift_apply_mk' Con.lift_apply_mk'ₓ'. -/
 /-- Given a homomorphism `f` from the quotient of a monoid by a congruence relation, `f` equals the
     homomorphism on the quotient induced by `f` composed with the natural map from the monoid to
@@ -1229,7 +1229,7 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (g : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) g ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f g)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) g (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) f g)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) g (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) f g)
 Case conversion may be inaccurate. Consider using '#align con.lift_funext Con.lift_funextₓ'. -/
 /-- Homomorphisms on the quotient of a monoid by a congruence relation are equal if they
     are equal on elements that are coercions from the monoid. -/
@@ -1279,7 +1279,7 @@ theorem lift_range (H : c ≤ ker f) : (c.lift f H).mrange = f.mrange :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (Function.Surjective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f h)))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (h : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u2, succ u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f)) -> (Function.Surjective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f h)))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (h : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u2, succ u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f)) -> (Function.Surjective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f h)))
 Case conversion may be inaccurate. Consider using '#align con.lift_surjective_of_surjective Con.lift_surjective_of_surjectiveₓ'. -/
 /-- Surjective monoid homomorphisms constant on a congruence relation `c`'s equivalence classes
     induce a surjective homomorphism on `c`'s quotient. -/
@@ -1296,7 +1296,7 @@ variable (c f)
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) c)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) c)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) c)
 Case conversion may be inaccurate. Consider using '#align con.ker_eq_lift_of_injective Con.ker_eq_lift_of_injectiveₓ'. -/
 /-- Given a monoid homomorphism `f` from `M` to `P`, the kernel of `f` is the unique congruence
     relation on `M` whose induced map from the quotient of `M` to `P` is injective. -/
@@ -1325,7 +1325,7 @@ variable {f}
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.ker_lift_mk Con.kerLift_mkₓ'. -/
 /-- The diagram described by the universal property for quotients of monoids, when the congruence
     relation is the kernel of the homomorphism, commutes. -/
@@ -1353,7 +1353,7 @@ theorem kerLift_range_eq : (kerLift f).mrange = f.mrange :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3), Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u2, u1} M P _inst_1 _inst_3 f))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3), Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u2, u1} M P _inst_1 _inst_3 f))
 Case conversion may be inaccurate. Consider using '#align con.ker_lift_injective Con.kerLift_injectiveₓ'. -/
 /-- A monoid homomorphism `f` induces an injective homomorphism on the quotient by `f`'s kernel. -/
 @[to_additive
@@ -1382,7 +1382,7 @@ def map (c d : Con M) (h : c ≤ d) : c.Quotient →* d.Quotient :=
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c), Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.map.{u1} M _inst_1 c d h) x) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d x y) (h x y hc))) x)
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.map.{u1} M _inst_1 c d h) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d y)) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x y) (h x y hc))) x)
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.map.{u1} M _inst_1 c d h) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d y)) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x y) (h x y hc))) x)
 Case conversion may be inaccurate. Consider using '#align con.map_apply Con.map_applyₓ'. -/
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, the definition of
     the homomorphism from the quotient by `c` to the quotient by `d` induced by `d`'s quotient
@@ -1423,7 +1423,7 @@ noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* f
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
 Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverseₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a homomorphism with right inverse. -/
 @[to_additive
@@ -1443,7 +1443,7 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
 Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjectiveₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a surjective homomorphism.
 
@@ -1461,7 +1461,7 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
 lean 3 declaration is
   forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (coeSort.{succ u1, succ (succ u1)} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Submonoid.setLike.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))) (Con.hasMul.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
 but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Subtype.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Membership.mem.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.instSetLikeSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) x (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))) (Con.hasMul.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
+  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Subtype.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Membership.mem.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.instSetLikeSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) x (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))) (Con.hasMul.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2397 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
 Case conversion may be inaccurate. Consider using '#align con.comap_quotient_equiv Con.comapQuotientEquivₓ'. -/
 /-- The second isomorphism theorem for monoids. -/
 @[to_additive "The second isomorphism theorem for `add_monoid`s."]
Diff
@@ -982,7 +982,7 @@ theorem to_submonoid_inj (c d : Con M) (H : (c : Submonoid (M × M)) = d) : c =
 
 /- warning: con.le_iff -> Con.le_iff is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Iff (LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) (LE.le.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Preorder.toLE.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (PartialOrder.toPreorder.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (SetLike.partialOrder.{u1, u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Prod.{u1, u1} M M) (Submonoid.setLike.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1))))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) d))
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Iff (LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) (LE.le.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Preorder.toHasLe.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (PartialOrder.toPreorder.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (SetLike.partialOrder.{u1, u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Prod.{u1, u1} M M) (Submonoid.setLike.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1))))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (HasLiftT.mk.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (CoeTCₓ.coe.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (coeBase.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.mulOneClass.{u1, u1} M M _inst_1 _inst_1)) (Con.toSubmonoid.{u1} M _inst_1)))) d))
 but is expected to have type
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Iff (LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (LE.le.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (Preorder.toLE.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (PartialOrder.toPreorder.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (CompleteSemilatticeInf.toPartialOrder.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (CompleteLattice.toCompleteSemilatticeInf.{u1} (Submonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)) (Submonoid.instCompleteLatticeSubmonoid.{u1} (Prod.{u1, u1} M M) (Prod.instMulOneClassProd.{u1, u1} M M _inst_1 _inst_1)))))) (Con.submonoid.{u1} M _inst_1 c) (Con.submonoid.{u1} M _inst_1 d))
 Case conversion may be inaccurate. Consider using '#align con.le_iff Con.le_iffₓ'. -/
Diff
@@ -500,39 +500,39 @@ instance : InfSet (Con M) :=
           c.trans (h1 c hc) <| h2 c hc⟩⟩,
       fun _ _ _ _ h1 h2 c hc => c.mul (h1 c hc) <| h2 c hc⟩⟩
 
-/- warning: con.Inf_to_setoid -> Con.infₛ_toSetoid is a dubious translation:
+/- warning: con.Inf_to_setoid -> Con.sInf_toSetoid is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1 (InfSet.infₛ.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) S)) (InfSet.infₛ.{u1} (Setoid.{succ u1} M) (Setoid.hasInf.{u1} M) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1) S))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1 (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (Setoid.{succ u1} M) (Setoid.hasInf.{u1} M) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1) S))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1 (InfSet.infₛ.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) S)) (InfSet.infₛ.{u1} (Setoid.{succ u1} M) (Setoid.instInfSetSetoid.{u1} M) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1) S))
-Case conversion may be inaccurate. Consider using '#align con.Inf_to_setoid Con.infₛ_toSetoidₓ'. -/
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1 (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (Setoid.{succ u1} M) (Setoid.instInfSetSetoid.{u1} M) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (Setoid.{succ u1} M) (Con.toSetoid.{u1} M _inst_1) S))
+Case conversion may be inaccurate. Consider using '#align con.Inf_to_setoid Con.sInf_toSetoidₓ'. -/
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying equivalence relation. -/
 @[to_additive
       "The infimum of a set of additive congruence relations is the same as the infimum of\nthe set's image under the map to the underlying equivalence relation."]
-theorem infₛ_toSetoid (S : Set (Con M)) : (infₛ S).toSetoid = infₛ (toSetoid '' S) :=
+theorem sInf_toSetoid (S : Set (Con M)) : (sInf S).toSetoid = sInf (toSetoid '' S) :=
   Setoid.ext' fun x y =>
     ⟨fun h r ⟨c, hS, hr⟩ => by rw [← hr] <;> exact h c hS, fun h c hS => h c.toSetoid ⟨c, hS, rfl⟩⟩
-#align con.Inf_to_setoid Con.infₛ_toSetoid
-#align add_con.Inf_to_setoid AddCon.infₛ_toSetoid
+#align con.Inf_to_setoid Con.sInf_toSetoid
+#align add_con.Inf_to_setoid AddCon.sInf_toSetoid
 
-/- warning: con.Inf_def -> Con.infₛ_def is a dubious translation:
+/- warning: con.Inf_def -> Con.sInf_def is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) (InfSet.infₛ.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) S)) (InfSet.infₛ.{u1} (M -> M -> Prop) (Pi.infSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.infSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteSemilatticeInf.toHasInf.{0} Prop (CompleteLattice.toCompleteSemilatticeInf.{0} Prop Prop.completeLattice)))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (ᾰ : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1)) S))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (M -> M -> Prop) (Pi.infSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.infSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteSemilatticeInf.toHasInf.{0} Prop (CompleteLattice.toCompleteSemilatticeInf.{0} Prop Prop.completeLattice)))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (ᾰ : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1)) S))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (forall (ᾰ : M), (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) (InfSet.infₛ.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) S)) (InfSet.infₛ.{u1} (M -> M -> Prop) (Pi.infSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.infSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteBooleanAlgebra.toInfSet.{0} Prop Prop.completeBooleanAlgebra))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (ᾰ : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (Con.instFunLikeConForAllProp.{u1} M _inst_1)) S))
-Case conversion may be inaccurate. Consider using '#align con.Inf_def Con.infₛ_defₓ'. -/
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (forall (ᾰ : M), (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) S)) (InfSet.sInf.{u1} (M -> M -> Prop) (Pi.infSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.infSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteBooleanAlgebra.toInfSet.{0} Prop Prop.completeBooleanAlgebra))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (ᾰ : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (Con.instFunLikeConForAllProp.{u1} M _inst_1)) S))
+Case conversion may be inaccurate. Consider using '#align con.Inf_def Con.sInf_defₓ'. -/
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying binary relation. -/
 @[to_additive
       "The infimum of a set of additive congruence relations is the same as the infimum\nof the set's image under the map to the underlying binary relation."]
-theorem infₛ_def (S : Set (Con M)) : ⇑(infₛ S) = infₛ (@Set.image (Con M) (M → M → Prop) coeFn S) :=
+theorem sInf_def (S : Set (Con M)) : ⇑(sInf S) = sInf (@Set.image (Con M) (M → M → Prop) coeFn S) :=
   by
   ext
-  simp only [infₛ_image, infᵢ_apply, infᵢ_Prop_eq]
+  simp only [sInf_image, iInf_apply, iInf_Prop_eq]
   rfl
-#align con.Inf_def Con.infₛ_def
-#align add_con.Inf_def AddCon.infₛ_def
+#align con.Inf_def Con.sInf_def
+#align add_con.Inf_def AddCon.sInf_def
 
 @[to_additive]
 instance : PartialOrder (Con M) where
@@ -592,20 +592,20 @@ theorem inf_iff_and {c d : Con M} {x y} : (c ⊓ d) x y ↔ c x y ∧ d x y :=
 
 /- warning: con.con_gen_eq -> Con.conGen_eq is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (r : M -> M -> Prop), Eq.{succ u1} (Con.{u1} M _inst_1) (conGen.{u1} M _inst_1 r) (InfSet.infₛ.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) (setOf.{u1} (Con.{u1} M _inst_1) (fun (s : Con.{u1} M _inst_1) => forall (x : M) (y : M), (r x y) -> (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) s x y))))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (r : M -> M -> Prop), Eq.{succ u1} (Con.{u1} M _inst_1) (conGen.{u1} M _inst_1 r) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.hasInf.{u1} M _inst_1) (setOf.{u1} (Con.{u1} M _inst_1) (fun (s : Con.{u1} M _inst_1) => forall (x : M) (y : M), (r x y) -> (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) s x y))))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (r : M -> M -> Prop), Eq.{succ u1} (Con.{u1} M _inst_1) (conGen.{u1} M _inst_1 r) (InfSet.infₛ.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) (setOf.{u1} (Con.{u1} M _inst_1) (fun (s : Con.{u1} M _inst_1) => forall (x : M) (y : M), (r x y) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) s x y))))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (r : M -> M -> Prop), Eq.{succ u1} (Con.{u1} M _inst_1) (conGen.{u1} M _inst_1 r) (InfSet.sInf.{u1} (Con.{u1} M _inst_1) (Con.instInfSetCon.{u1} M _inst_1) (setOf.{u1} (Con.{u1} M _inst_1) (fun (s : Con.{u1} M _inst_1) => forall (x : M) (y : M), (r x y) -> (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) s x y))))
 Case conversion may be inaccurate. Consider using '#align con.con_gen_eq Con.conGen_eqₓ'. -/
 /-- The inductively defined smallest congruence relation containing a binary relation `r` equals
     the infimum of the set of congruence relations containing `r`. -/
 @[to_additive add_con_gen_eq
       "The inductively defined smallest additive congruence relation\ncontaining a binary relation `r` equals the infimum of the set of additive congruence relations\ncontaining `r`."]
-theorem conGen_eq (r : M → M → Prop) : conGen r = infₛ { s : Con M | ∀ x y, r x y → s x y } :=
+theorem conGen_eq (r : M → M → Prop) : conGen r = sInf { s : Con M | ∀ x y, r x y → s x y } :=
   le_antisymm
     (fun x y H =>
       ConGen.Rel.rec_on H (fun _ _ h _ hs => hs _ _ h) (Con.refl _) (fun _ _ _ => Con.symm _)
         (fun _ _ _ _ _ => Con.trans _) fun w x y z _ _ h1 h2 c hc => c.mul (h1 c hc) <| h2 c hc)
-    (infₛ_le fun _ _ => ConGen.Rel.of _ _)
+    (sInf_le fun _ _ => ConGen.Rel.of _ _)
 #align con.con_gen_eq Con.conGen_eq
 #align add_con.add_con_gen_eq AddCon.addConGen_eq
 
@@ -615,7 +615,7 @@ theorem conGen_eq (r : M → M → Prop) : conGen r = infₛ { s : Con M | ∀ x
 @[to_additive add_con_gen_le
       "The smallest additive congruence relation containing a binary\nrelation `r` is contained in any additive congruence relation containing `r`."]
 theorem conGen_le {r : M → M → Prop} {c : Con M} (h : ∀ x y, r x y → @Setoid.r _ c.toSetoid x y) :
-    conGen r ≤ c := by rw [con_gen_eq] <;> exact infₛ_le h
+    conGen r ≤ c := by rw [con_gen_eq] <;> exact sInf_le h
 #align con.con_gen_le Con.conGen_le
 #align add_con.add_con_gen_le AddCon.addConGen_le
 -/
@@ -637,7 +637,7 @@ theorem conGen_mono {r s : M → M → Prop} (h : ∀ x y, r x y → s x y) : co
   to_additive add_con_gen_of_add_con
       "Additive congruence relations equal the smallest\nadditive congruence relation in which they are contained."]
 theorem conGen_of_con (c : Con M) : conGen c = c :=
-  le_antisymm (by rw [con_gen_eq] <;> exact infₛ_le fun _ _ => id) ConGen.Rel.of
+  le_antisymm (by rw [con_gen_eq] <;> exact sInf_le fun _ _ => id) ConGen.Rel.of
 #align con.con_gen_of_con Con.conGen_of_con
 #align add_con.add_con_gen_of_con AddCon.addConGen_of_addCon
 -/
@@ -686,44 +686,44 @@ theorem sup_def {c d : Con M} : c ⊔ d = conGen (c.R ⊔ d.R) := by rw [sup_eq_
 #align con.sup_def Con.sup_def
 #align add_con.sup_def AddCon.sup_def
 
-/- warning: con.Sup_eq_con_gen -> Con.supₛ_eq_conGen is a dubious translation:
+/- warning: con.Sup_eq_con_gen -> Con.sSup_eq_conGen is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.supₛ.{u1} (Con.{u1} M _inst_1) (CompleteSemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toCompleteSemilatticeSup.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1))) S) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Exists.{succ u1} (Con.{u1} M _inst_1) (fun (c : Con.{u1} M _inst_1) => And (Membership.Mem.{u1, u1} (Con.{u1} M _inst_1) (Set.{u1} (Con.{u1} M _inst_1)) (Set.hasMem.{u1} (Con.{u1} M _inst_1)) c S) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y))))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteSemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toCompleteSemilatticeSup.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1))) S) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Exists.{succ u1} (Con.{u1} M _inst_1) (fun (c : Con.{u1} M _inst_1) => And (Membership.Mem.{u1, u1} (Con.{u1} M _inst_1) (Set.{u1} (Con.{u1} M _inst_1)) (Set.hasMem.{u1} (Con.{u1} M _inst_1)) c S) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y))))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.supₛ.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toSupSet.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)) S) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Exists.{succ u1} (Con.{u1} M _inst_1) (fun (c : Con.{u1} M _inst_1) => And (Membership.mem.{u1, u1} (Con.{u1} M _inst_1) (Set.{u1} (Con.{u1} M _inst_1)) (Set.instMembershipSet.{u1} (Con.{u1} M _inst_1)) c S) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y))))
-Case conversion may be inaccurate. Consider using '#align con.Sup_eq_con_gen Con.supₛ_eq_conGenₓ'. -/
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (S : Set.{u1} (Con.{u1} M _inst_1)), Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toSupSet.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)) S) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Exists.{succ u1} (Con.{u1} M _inst_1) (fun (c : Con.{u1} M _inst_1) => And (Membership.mem.{u1, u1} (Con.{u1} M _inst_1) (Set.{u1} (Con.{u1} M _inst_1)) (Set.instMembershipSet.{u1} (Con.{u1} M _inst_1)) c S) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y))))
+Case conversion may be inaccurate. Consider using '#align con.Sup_eq_con_gen Con.sSup_eq_conGenₓ'. -/
 /-- The supremum of a set of congruence relations `S` equals the smallest congruence relation
     containing the binary relation 'there exists `c ∈ S` such that `x` is related to `y` by
     `c`'. -/
 @[to_additive Sup_eq_add_con_gen
       "The supremum of a set of additive congruence relations `S` equals\nthe smallest additive congruence relation containing the binary relation 'there exists `c ∈ S`\nsuch that `x` is related to `y` by `c`'."]
-theorem supₛ_eq_conGen (S : Set (Con M)) : supₛ S = conGen fun x y => ∃ c : Con M, c ∈ S ∧ c x y :=
+theorem sSup_eq_conGen (S : Set (Con M)) : sSup S = conGen fun x y => ∃ c : Con M, c ∈ S ∧ c x y :=
   by
   rw [con_gen_eq]
   apply congr_arg Inf
   ext
   exact ⟨fun h _ _ ⟨r, hr⟩ => h hr.1 hr.2, fun h r hS _ _ hr => h _ _ ⟨r, hS, hr⟩⟩
-#align con.Sup_eq_con_gen Con.supₛ_eq_conGen
-#align add_con.Sup_eq_add_con_gen AddCon.supₛ_eq_addConGen
+#align con.Sup_eq_con_gen Con.sSup_eq_conGen
+#align add_con.Sup_eq_add_con_gen AddCon.sSup_eq_addConGen
 
-/- warning: con.Sup_def -> Con.supₛ_def is a dubious translation:
+/- warning: con.Sup_def -> Con.sSup_def is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {S : Set.{u1} (Con.{u1} M _inst_1)}, Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.supₛ.{u1} (Con.{u1} M _inst_1) (CompleteSemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toCompleteSemilatticeSup.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1))) S) (conGen.{u1} M _inst_1 (SupSet.supₛ.{u1} (M -> M -> Prop) (Pi.supSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.supSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteSemilatticeSup.toHasSup.{0} Prop (CompleteLattice.toCompleteSemilatticeSup.{0} Prop Prop.completeLattice)))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (ᾰ : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1)) S)))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {S : Set.{u1} (Con.{u1} M _inst_1)}, Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteSemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toCompleteSemilatticeSup.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1))) S) (conGen.{u1} M _inst_1 (SupSet.sSup.{u1} (M -> M -> Prop) (Pi.supSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.supSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteSemilatticeSup.toHasSup.{0} Prop (CompleteLattice.toCompleteSemilatticeSup.{0} Prop Prop.completeLattice)))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (ᾰ : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1)) S)))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {S : Set.{u1} (Con.{u1} M _inst_1)}, Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.supₛ.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toSupSet.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)) S) (conGen.{u1} M _inst_1 (SupSet.supₛ.{u1} (M -> M -> Prop) (Pi.supSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.supSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteBooleanAlgebra.toSupSet.{0} Prop Prop.completeBooleanAlgebra))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (ᾰ : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (Con.instFunLikeConForAllProp.{u1} M _inst_1)) S)))
-Case conversion may be inaccurate. Consider using '#align con.Sup_def Con.supₛ_defₓ'. -/
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {S : Set.{u1} (Con.{u1} M _inst_1)}, Eq.{succ u1} (Con.{u1} M _inst_1) (SupSet.sSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toSupSet.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)) S) (conGen.{u1} M _inst_1 (SupSet.sSup.{u1} (M -> M -> Prop) (Pi.supSet.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.supSet.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => CompleteBooleanAlgebra.toSupSet.{0} Prop Prop.completeBooleanAlgebra))) (Set.image.{u1, u1} (Con.{u1} M _inst_1) (M -> M -> Prop) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (ᾰ : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) ᾰ) (Con.instFunLikeConForAllProp.{u1} M _inst_1)) S)))
+Case conversion may be inaccurate. Consider using '#align con.Sup_def Con.sSup_defₓ'. -/
 /-- The supremum of a set of congruence relations is the same as the smallest congruence relation
     containing the supremum of the set's image under the map to the underlying binary relation. -/
 @[to_additive
       "The supremum of a set of additive congruence relations is the same as the smallest\nadditive congruence relation containing the supremum of the set's image under the map to the\nunderlying binary relation."]
-theorem supₛ_def {S : Set (Con M)} :
-    supₛ S = conGen (supₛ (@Set.image (Con M) (M → M → Prop) coeFn S)) :=
+theorem sSup_def {S : Set (Con M)} :
+    sSup S = conGen (sSup (@Set.image (Con M) (M → M → Prop) coeFn S)) :=
   by
-  rw [Sup_eq_con_gen, supₛ_image]
+  rw [Sup_eq_con_gen, sSup_image]
   congr with (x y)
-  simp only [supₛ_image, supᵢ_apply, supᵢ_Prop_eq, exists_prop, rel_eq_coe]
-#align con.Sup_def Con.supₛ_def
-#align add_con.Sup_def AddCon.supₛ_def
+  simp only [sSup_image, iSup_apply, iSup_Prop_eq, exists_prop, rel_eq_coe]
+#align con.Sup_def Con.sSup_def
+#align add_con.Sup_def AddCon.sSup_def
 
 variable (M)
 
Diff
@@ -1009,7 +1009,7 @@ def ker (f : M →* P) : Con M :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x y) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f y))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x y) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f y))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x y) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f y))
 Case conversion may be inaccurate. Consider using '#align con.ker_rel Con.ker_relₓ'. -/
 /-- The definition of the congruence relation defined by a monoid homomorphism's kernel. -/
 @[simp,
@@ -1074,7 +1074,7 @@ variable {c}
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c))
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c))
 Case conversion may be inaccurate. Consider using '#align con.mk'_surjective Con.mk'_surjectiveₓ'. -/
 /-- The natural homomorphism from a monoid to its quotient by a congruence relation is
     surjective. -/
@@ -1089,7 +1089,7 @@ theorem mk'_surjective : Surjective c.mk' :=
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Eq.{succ u1} ((fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (Con.mk'.{u1} M _inst_1 c)) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (forall (a : M), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) a) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (forall (a : M), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) a) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
 Case conversion may be inaccurate. Consider using '#align con.coe_mk' Con.coe_mk'ₓ'. -/
 @[simp, to_additive]
 theorem coe_mk' : (c.mk' : M → c.Quotient) = coe :=
@@ -1113,7 +1113,7 @@ theorem mrange_mk' : c.mk'.mrange = ⊤ :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u1} (M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x) (Set.preimage.{u1, u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f) (Singleton.singleton.{u2, u2} P (Set.{u2} P) (Set.hasSingleton.{u2} P) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) x) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x) (Set.preimage.{u2, u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f) (Singleton.singleton.{u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) x) (Set.{u1} P) (Set.instSingletonSet.{u1} P) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) x) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x) (Set.preimage.{u2, u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f) (Singleton.singleton.{u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) x) (Set.{u1} P) (Set.instSingletonSet.{u1} P) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)))
 Case conversion may be inaccurate. Consider using '#align con.ker_apply_eq_preimage Con.ker_apply_eq_preimageₓ'. -/
 /-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
     those in the preimage of `f(x)` under `f`. -/
@@ -1130,7 +1130,7 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
 lean 3 declaration is
   forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
 but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
+  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
 Case conversion may be inaccurate. Consider using '#align con.comap_eq Con.comap_eqₓ'. -/
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
     relation induced on `N` by `f` equals the kernel of `c`'s quotient homomorphism composed with
@@ -1168,7 +1168,7 @@ variable {c f}
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (a : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) a) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _x) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (a : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) a) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _x) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.lift_mk' Con.lift_mk'ₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[to_additive
@@ -1182,7 +1182,7 @@ theorem lift_mk' (H : c ≤ ker f) (x) : c.lift f H (c.mk' x) = f x :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.lift_coe Con.lift_coeₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[simp,
@@ -1211,7 +1211,7 @@ theorem lift_comp_mk' (H : c ≤ ker f) : (c.lift f H).comp c.mk' = f := by ext
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c (MonoidHom.comp.{u1, u1, u2} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) _inst_3 f (Con.mk'.{u1} M _inst_1 c)) (fun (x : M) (y : M) (h : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => (fun (this : Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) => this) (Eq.mpr.{0} (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (id_tag Tactic.IdTag.rw (Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (Eq.ndrec.{0, succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) (fun (_a : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f _a) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (rfl.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c x y) h))) (rfl.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))))) f
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 f (Con.mk'.{u2} M _inst_1 c)) (fun (x : M) (y : M) (h : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) => [mdata let_fun:1 (fun (this : Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) => this) (Eq.mpr.{0} (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (id.{0} (Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.ndrec.{0, succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (fun (_a : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.refl.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y) (Iff.mpr (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x y) h))) (Eq.refl.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))))])) f
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 f (Con.mk'.{u2} M _inst_1 c)) (fun (x : M) (y : M) (h : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) => [mdata let_fun:1 (fun (this : Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) => this) (Eq.mpr.{0} (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (id.{0} (Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.ndrec.{0, succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (fun (_a : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.refl.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y) (Iff.mpr (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x y) h))) (Eq.refl.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))))])) f
 Case conversion may be inaccurate. Consider using '#align con.lift_apply_mk' Con.lift_apply_mk'ₓ'. -/
 /-- Given a homomorphism `f` from the quotient of a monoid by a congruence relation, `f` equals the
     homomorphism on the quotient induced by `f` composed with the natural map from the monoid to
@@ -1229,7 +1229,7 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (g : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) g ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f g)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) g (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) f g)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) g (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) f g)
 Case conversion may be inaccurate. Consider using '#align con.lift_funext Con.lift_funextₓ'. -/
 /-- Homomorphisms on the quotient of a monoid by a congruence relation are equal if they
     are equal on elements that are coercions from the monoid. -/
@@ -1279,7 +1279,7 @@ theorem lift_range (H : c ≤ ker f) : (c.lift f H).mrange = f.mrange :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (Function.Surjective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f h)))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (h : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u2, succ u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f)) -> (Function.Surjective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f h)))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (h : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u2, succ u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f)) -> (Function.Surjective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f h)))
 Case conversion may be inaccurate. Consider using '#align con.lift_surjective_of_surjective Con.lift_surjective_of_surjectiveₓ'. -/
 /-- Surjective monoid homomorphisms constant on a congruence relation `c`'s equivalence classes
     induce a surjective homomorphism on `c`'s quotient. -/
@@ -1296,7 +1296,7 @@ variable (c f)
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) c)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) c)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) c)
 Case conversion may be inaccurate. Consider using '#align con.ker_eq_lift_of_injective Con.ker_eq_lift_of_injectiveₓ'. -/
 /-- Given a monoid homomorphism `f` from `M` to `P`, the kernel of `f` is the unique congruence
     relation on `M` whose induced map from the quotient of `M` to `P` is injective. -/
@@ -1325,7 +1325,7 @@ variable {f}
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.ker_lift_mk Con.kerLift_mkₓ'. -/
 /-- The diagram described by the universal property for quotients of monoids, when the congruence
     relation is the kernel of the homomorphism, commutes. -/
@@ -1353,7 +1353,7 @@ theorem kerLift_range_eq : (kerLift f).mrange = f.mrange :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3), Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u2, u1} M P _inst_1 _inst_3 f))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3), Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u2, u1} M P _inst_1 _inst_3 f))
 Case conversion may be inaccurate. Consider using '#align con.ker_lift_injective Con.kerLift_injectiveₓ'. -/
 /-- A monoid homomorphism `f` induces an injective homomorphism on the quotient by `f`'s kernel. -/
 @[to_additive
@@ -1382,7 +1382,7 @@ def map (c d : Con M) (h : c ≤ d) : c.Quotient →* d.Quotient :=
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c), Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.map.{u1} M _inst_1 c d h) x) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d x y) (h x y hc))) x)
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.map.{u1} M _inst_1 c d h) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d y)) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x y) (h x y hc))) x)
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.map.{u1} M _inst_1 c d h) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d y)) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x y) (h x y hc))) x)
 Case conversion may be inaccurate. Consider using '#align con.map_apply Con.map_applyₓ'. -/
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, the definition of
     the homomorphism from the quotient by `c` to the quotient by `d` induced by `d`'s quotient
@@ -1423,7 +1423,7 @@ noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* f
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
 Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverseₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a homomorphism with right inverse. -/
 @[to_additive
@@ -1443,7 +1443,7 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
 Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjectiveₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a surjective homomorphism.
 
@@ -1461,7 +1461,7 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
 lean 3 declaration is
   forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (coeSort.{succ u1, succ (succ u1)} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Submonoid.setLike.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))) (Con.hasMul.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
 but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Subtype.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Membership.mem.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.instSetLikeSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) x (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))) (Con.hasMul.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
+  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Subtype.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Membership.mem.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.instSetLikeSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) x (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))) (Con.hasMul.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2391 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
 Case conversion may be inaccurate. Consider using '#align con.comap_quotient_equiv Con.comapQuotientEquivₓ'. -/
 /-- The second isomorphism theorem for monoids. -/
 @[to_additive "The second isomorphism theorem for `add_monoid`s."]
@@ -1772,7 +1772,7 @@ theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))} {p : (Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)) -> Prop} (u : Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)), (forall (x : M) (y : M) (hxy : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (hyx : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))), p (Units.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))))) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) hxy) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c))) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))))) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toHasMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (OfNat.mk.{u1} M 1 (One.one.{u1} M (MulOneClass.toHasOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) hyx))) -> (p u)
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))} {p : (Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)) -> Prop} (u : Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)), (forall (x : M) (y : M) (hxy : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) (hyx : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))), p (Units.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1889 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1891 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1889 x._@.Mathlib.GroupTheory.Congruence._hyg.1891) x y)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1889 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1891 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1889 x._@.Mathlib.GroupTheory.Congruence._hyg.1891) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1889 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1891 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1889 x._@.Mathlib.GroupTheory.Congruence._hyg.1891) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) hxy) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1889 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1891 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1889 x._@.Mathlib.GroupTheory.Congruence._hyg.1891) y x)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1889 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1891 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1889 x._@.Mathlib.GroupTheory.Congruence._hyg.1891) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1889 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1891 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1889 x._@.Mathlib.GroupTheory.Congruence._hyg.1891) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) hyx))) -> (p u)
+  forall {M : Type.{u1}} [_inst_1 : Monoid.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))} {p : (Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)) -> Prop} (u : Units.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c)), (forall (x : M) (y : M) (hxy : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))) (hyx : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c (HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M _inst_1)))), p (Units.mk.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.monoid.{u1} M _inst_1 c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) x y)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) x y) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) hxy) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) y x)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)))))) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1)) c ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.1915 : M) (x._@.Mathlib.GroupTheory.Congruence._hyg.1917 : M) => HMul.hMul.{u1, u1, u1} M M M (instHMul.{u1} M (MulOneClass.toMul.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))) x._@.Mathlib.GroupTheory.Congruence._hyg.1915 x._@.Mathlib.GroupTheory.Congruence._hyg.1917) y x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (MulOneClass.toOne.{u1} M (Monoid.toMulOneClass.{u1} M _inst_1))))) hyx))) -> (p u)
 Case conversion may be inaccurate. Consider using '#align con.induction_on_units Con.induction_on_unitsₓ'. -/
 @[elab_as_elim, to_additive]
 theorem induction_on_units {p : Units c.Quotient → Prop} (u : Units c.Quotient)
Diff
@@ -1009,7 +1009,7 @@ def ker (f : M →* P) : Con M :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x y) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f y))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x y) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f y))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) {x : M} {y : M}, Iff (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x y) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f y))
 Case conversion may be inaccurate. Consider using '#align con.ker_rel Con.ker_relₓ'. -/
 /-- The definition of the congruence relation defined by a monoid homomorphism's kernel. -/
 @[simp,
@@ -1074,7 +1074,7 @@ variable {c}
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c))
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Function.Surjective.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c))
 Case conversion may be inaccurate. Consider using '#align con.mk'_surjective Con.mk'_surjectiveₓ'. -/
 /-- The natural homomorphism from a monoid to its quotient by a congruence relation is
     surjective. -/
@@ -1089,7 +1089,7 @@ theorem mk'_surjective : Surjective c.mk' :=
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)}, Eq.{succ u1} ((fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (Con.mk'.{u1} M _inst_1 c)) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c)) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (forall (a : M), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) a) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)}, Eq.{succ u1} (forall (a : M), (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) a) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.monoidHomClass.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)))) (Con.mk'.{u1} M _inst_1 c)) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c)
 Case conversion may be inaccurate. Consider using '#align con.coe_mk' Con.coe_mk'ₓ'. -/
 @[simp, to_additive]
 theorem coe_mk' : (c.mk' : M → c.Quotient) = coe :=
@@ -1113,7 +1113,7 @@ theorem mrange_mk' : c.mk'.mrange = ⊤ :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u1} (M -> Prop) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x) (Set.preimage.{u1, u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f) (Singleton.singleton.{u2, u2} P (Set.{u2} P) (Set.hasSingleton.{u2} P) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) x) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x) (Set.preimage.{u2, u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f) (Singleton.singleton.{u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) x) (Set.{u1} P) (Set.instSingletonSet.{u1} P) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) x) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) x) (Set.preimage.{u2, u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f) (Singleton.singleton.{u1, u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) x) (Set.{u1} P) (Set.instSingletonSet.{u1} P) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)))
 Case conversion may be inaccurate. Consider using '#align con.ker_apply_eq_preimage Con.ker_apply_eq_preimageₓ'. -/
 /-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
     those in the preimage of `f(x)` under `f`. -/
@@ -1130,7 +1130,7 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
 lean 3 declaration is
   forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
 but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
+  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {f : MonoidHom.{u2, u1} N M _inst_2 _inst_1}, Eq.{succ u2} (Con.{u2} N (MulOneClass.toMul.{u2} N _inst_2)) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c) (Con.ker.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))
 Case conversion may be inaccurate. Consider using '#align con.comap_eq Con.comap_eqₓ'. -/
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
     relation induced on `N` by `f` equals the kernel of `c`'s quotient homomorphism composed with
@@ -1168,7 +1168,7 @@ variable {c f}
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (fun (_x : MonoidHom.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) => M -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c)) (MonoidHom.hasCoeToFun.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_1 (Con.mulOneClass.{u1} M _inst_1 c)) (Con.mk'.{u1} M _inst_1 c) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (a : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) a) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _x) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (a : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) a) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (FunLike.coe.{succ u2, succ u2, succ u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _x) (MulHomClass.toFunLike.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MonoidHomClass.toMulHomClass.{u2, u2, u2} (MonoidHom.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)) M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) (MonoidHom.monoidHomClass.{u2, u2} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) _inst_1 (Con.mulOneClass.{u2} M _inst_1 c)))) (Con.mk'.{u2} M _inst_1 c) x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.lift_mk' Con.lift_mk'ₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[to_additive
@@ -1182,7 +1182,7 @@ theorem lift_mk' (H : c ≤ ker f) (x) : c.lift f H (c.mk' x) = f x :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (x : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.lift_coe Con.lift_coeₓ'. -/
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[simp,
@@ -1211,7 +1211,7 @@ theorem lift_comp_mk' (H : c ≤ ker f) : (c.lift f H).comp c.mk' = f := by ext
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c (MonoidHom.comp.{u1, u1, u2} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) _inst_3 f (Con.mk'.{u1} M _inst_1 c)) (fun (x : M) (y : M) (h : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => (fun (this : Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) => this) (Eq.mpr.{0} (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (id_tag Tactic.IdTag.rw (Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (Eq.ndrec.{0, succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) (fun (_a : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y))) (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f _a) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) (rfl.{1} Prop (Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y) (Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c x y) h))) (rfl.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) y)))))) f
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 f (Con.mk'.{u2} M _inst_1 c)) (fun (x : M) (y : M) (h : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) => [mdata let_fun:1 (fun (this : Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) => this) (Eq.mpr.{0} (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (id.{0} (Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.ndrec.{0, succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (fun (_a : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.refl.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y) (Iff.mpr (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x y) h))) (Eq.refl.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))))])) f
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c (MonoidHom.comp.{u2, u2, u1} M (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P _inst_1 (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 f (Con.mk'.{u2} M _inst_1 c)) (fun (x : M) (y : M) (h : FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) => [mdata let_fun:1 (fun (this : Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) => this) (Eq.mpr.{0} (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (id.{0} (Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.ndrec.{0, succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (fun (_a : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => Eq.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))) (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f _a) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Eq.refl.{1} Prop (Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)))) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y) (Iff.mpr (Eq.{succ u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{succ u2, succ u2, succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c x y) (Con.eq.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c x y) h))) (Eq.refl.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c y))))])) f
 Case conversion may be inaccurate. Consider using '#align con.lift_apply_mk' Con.lift_apply_mk'ₓ'. -/
 /-- Given a homomorphism `f` from the quotient of a monoid by a congruence relation, `f` equals the
     homomorphism on the quotient induced by `f` composed with the natural map from the monoid to
@@ -1229,7 +1229,7 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (f : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (g : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) g ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c))) a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) f g)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) g (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) f g)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} (f : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (g : MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3), (forall (a : M), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) f (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a)) (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) g (Con.toQuotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c a))) -> (Eq.{max (succ u2) (succ u1)} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) f g)
 Case conversion may be inaccurate. Consider using '#align con.lift_funext Con.lift_funextₓ'. -/
 /-- Homomorphisms on the quotient of a monoid by a congruence relation are equal if they
     are equal on elements that are coercions from the monoid. -/
@@ -1279,7 +1279,7 @@ theorem lift_range (H : c ≤ ker f) : (c.lift f H).mrange = f.mrange :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (Function.Surjective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f h)))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (h : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u2, succ u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f)) -> (Function.Surjective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f h)))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] {c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)} {f : MonoidHom.{u2, u1} M P _inst_1 _inst_3} (h : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Surjective.{succ u2, succ u1} M P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u2} M _inst_1) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u2, u1} M P _inst_1 _inst_3))) f)) -> (Function.Surjective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f h)))
 Case conversion may be inaccurate. Consider using '#align con.lift_surjective_of_surjective Con.lift_surjective_of_surjectiveₓ'. -/
 /-- Surjective monoid homomorphisms constant on a congruence relation `c`'s equivalence classes
     induce a surjective homomorphism on `c`'s quotient. -/
@@ -1296,7 +1296,7 @@ variable (c f)
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (H : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) P (Con.mulOneClass.{u1} M _inst_1 c) _inst_3) (Con.lift.{u1, u2} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) c)
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) c)
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (c : Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3) (H : LE.le.{u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.instLECon.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) c (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)), (Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) (Con.mulOneClass.{u2} M _inst_1 c)) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) c) P (Con.mulOneClass.{u2} M _inst_1 c) _inst_3))) (Con.lift.{u2, u1} M P _inst_1 _inst_3 c f H))) -> (Eq.{succ u2} (Con.{u2} M (MulOneClass.toMul.{u2} M _inst_1)) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f) c)
 Case conversion may be inaccurate. Consider using '#align con.ker_eq_lift_of_injective Con.ker_eq_lift_of_injectiveₓ'. -/
 /-- Given a monoid homomorphism `f` from `M` to `P`, the kernel of `f` is the unique congruence
     relation on `M` whose induced map from the quotient of `M` to `P` is injective. -/
@@ -1325,7 +1325,7 @@ variable {f}
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)))) x)) (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f x)
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f x)
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] {f : MonoidHom.{u1, u2} M P _inst_1 _inst_3} (x : M), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f) x)) (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f x)
 Case conversion may be inaccurate. Consider using '#align con.ker_lift_mk Con.kerLift_mkₓ'. -/
 /-- The diagram described by the universal property for quotients of monoids, when the congruence
     relation is the kernel of the homomorphism, commutes. -/
@@ -1353,7 +1353,7 @@ theorem kerLift_range_eq : (kerLift f).mrange = f.mrange :=
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), Function.Injective.{succ u1, succ u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (fun (_x : MonoidHom.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) -> P) (MonoidHom.hasCoeToFun.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u1} M _inst_1 (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) _inst_3) (Con.kerLift.{u1, u2} M P _inst_1 _inst_3 f))
 but is expected to have type
-  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3), Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u2, u1} M P _inst_1 _inst_3 f))
+  forall {M : Type.{u2}} {P : Type.{u1}} [_inst_1 : MulOneClass.{u2} M] [_inst_3 : MulOneClass.{u1} P] (f : MonoidHom.{u2, u1} M P _inst_1 _inst_3), Function.Injective.{succ u2, succ u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (FunLike.coe.{max (succ u2) (succ u1), succ u2, succ u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (fun (_x : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) => P) _x) (MulHomClass.toFunLike.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (MulOneClass.toMul.{u2} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f))) (MulOneClass.toMul.{u1} P _inst_3) (MonoidHomClass.toMulHomClass.{max u2 u1, u2, u1} (MonoidHom.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3) (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3 (MonoidHom.monoidHomClass.{u2, u1} (Con.Quotient.{u2} M (MulOneClass.toMul.{u2} M _inst_1) (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) P (Con.mulOneClass.{u2} M _inst_1 (Con.ker.{u2, u1} M P _inst_1 _inst_3 f)) _inst_3))) (Con.kerLift.{u2, u1} M P _inst_1 _inst_3 f))
 Case conversion may be inaccurate. Consider using '#align con.ker_lift_injective Con.kerLift_injectiveₓ'. -/
 /-- A monoid homomorphism `f` induces an injective homomorphism on the quotient by `f`'s kernel. -/
 @[to_additive
@@ -1382,7 +1382,7 @@ def map (c d : Con M) (h : c ≤ d) : c.Quotient →* d.Quotient :=
 lean 3 declaration is
   forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (Con.hasLe.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c), Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.map.{u1} M _inst_1 c d h) x) (coeFn.{succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (fun (_x : MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) => (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) -> (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d)) (MonoidHom.hasCoeToFun.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) x) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (HasLiftT.mk.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (CoeTCₓ.coe.{succ u1, succ u1} M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d) (Con.Quotient.hasCoeT.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d))) y)) (coeFn.{succ u1, succ u1} (Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (fun (_x : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) d x y) (h x y hc))) x)
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.map.{u1} M _inst_1 c d h) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d y)) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x y) (h x y hc))) x)
+  forall {M : Type.{u1}} [_inst_1 : MulOneClass.{u1} M] {c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} {d : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)} (h : LE.le.{u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (Con.instLECon.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c d) (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c), Eq.{succ u1} ((fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.map.{u1} M _inst_1 c d h) x) (FunLike.coe.{succ u1, succ u1, succ u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (_x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _x) (MulHomClass.toFunLike.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (MulOneClass.toMul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 d)) (MonoidHomClass.toMulHomClass.{u1, u1, u1} (MonoidHom.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d) (MonoidHom.monoidHomClass.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.mulOneClass.{u1} M _inst_1 c) (Con.mulOneClass.{u1} M _inst_1 d)))) (Con.lift.{u1, u1} M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) _inst_1 (Con.mulOneClass.{u1} M _inst_1 d) c (Con.mk'.{u1} M _inst_1 d) (fun (x : M) (y : M) (hc : FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) c x y) => Iff.mpr (Eq.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x) (Con.toQuotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d y)) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) d x y) (Con.eq.{u1} M (MulOneClass.toMul.{u1} M _inst_1) d x y) (h x y hc))) x)
 Case conversion may be inaccurate. Consider using '#align con.map_apply Con.map_applyₓ'. -/
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, the definition of
     the homomorphism from the quotient by `c` to the quotient by `d` induced by `d`'s quotient
@@ -1423,7 +1423,7 @@ noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* f
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3) (g : P -> M), (Function.RightInverse.{succ u1, succ u2} M P g (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
 Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverseₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a homomorphism with right inverse. -/
 @[to_additive
@@ -1443,7 +1443,7 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
 lean 3 declaration is
   forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (coeFn.{max (succ u2) (succ u1), max (succ u1) (succ u2)} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) (fun (_x : MonoidHom.{u1, u2} M P _inst_1 _inst_3) => M -> P) (MonoidHom.hasCoeToFun.{u1, u2} M P _inst_1 _inst_3) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toHasMul.{u2} P _inst_3))
 but is expected to have type
-  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
+  forall {M : Type.{u1}} {P : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_3 : MulOneClass.{u2} P] (f : MonoidHom.{u1, u2} M P _inst_1 _inst_3), (Function.Surjective.{succ u1, succ u2} M P (FunLike.coe.{max (succ u1) (succ u2), succ u1, succ u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M (fun (_x : M) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : M) => P) _x) (MulHomClass.toFunLike.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P (MulOneClass.toMul.{u1} M _inst_1) (MulOneClass.toMul.{u2} P _inst_3) (MonoidHomClass.toMulHomClass.{max u1 u2, u1, u2} (MonoidHom.{u1, u2} M P _inst_1 _inst_3) M P _inst_1 _inst_3 (MonoidHom.monoidHomClass.{u1, u2} M P _inst_1 _inst_3))) f)) -> (MulEquiv.{u1, u2} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) P (Con.hasMul.{u1} M (MulOneClass.toMul.{u1} M _inst_1) (Con.ker.{u1, u2} M P _inst_1 _inst_3 f)) (MulOneClass.toMul.{u2} P _inst_3))
 Case conversion may be inaccurate. Consider using '#align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjectiveₓ'. -/
 /-- The first isomorphism theorem for monoids in the case of a surjective homomorphism.
 
@@ -1461,7 +1461,7 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
 lean 3 declaration is
   forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (coeSort.{succ u1, succ (succ u1)} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) Type.{u1} (SetLike.hasCoeToSort.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Submonoid.setLike.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f))) (Con.hasMul.{u2} N (MulOneClass.toHasMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toHasMul.{u2} N _inst_2) (MulOneClass.toHasMul.{u1} M _inst_1) (coeFn.{max (succ u1) (succ u2), max (succ u2) (succ u1)} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) (fun (_x : MonoidHom.{u2, u1} N M _inst_2 _inst_1) => N -> M) (MonoidHom.hasCoeToFun.{u2, u1} N M _inst_2 _inst_1) f) (MonoidHom.map_mul.{u2, u1} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toHasMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
 but is expected to have type
-  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Subtype.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Membership.mem.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.instSetLikeSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) x (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))) (Con.hasMul.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2398 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
+  forall {M : Type.{u1}} {N : Type.{u2}} [_inst_1 : MulOneClass.{u1} M] [_inst_2 : MulOneClass.{u2} N] (c : Con.{u1} M (MulOneClass.toMul.{u1} M _inst_1)) (f : MonoidHom.{u2, u1} N M _inst_2 _inst_1), MulEquiv.{u2, u1} (Con.Quotient.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Subtype.{succ u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (fun (x : Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) => Membership.mem.{u1, u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (SetLike.instMembership.{u1, u1} (Submonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c)) (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Submonoid.instSetLikeSubmonoid.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c))) x (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))) (Con.hasMul.{u2} N (MulOneClass.toMul.{u2} N _inst_2) (Con.comap.{u2, u1} N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (FunLike.coe.{max (succ u1) (succ u2), succ u2, succ u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N (fun (_x : N) => (fun (x._@.Mathlib.Algebra.Hom.Group._hyg.2372 : N) => M) _x) (MulHomClass.toFunLike.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M (MulOneClass.toMul.{u2} N _inst_2) (MulOneClass.toMul.{u1} M _inst_1) (MonoidHomClass.toMulHomClass.{max u1 u2, u2, u1} (MonoidHom.{u2, u1} N M _inst_2 _inst_1) N M _inst_2 _inst_1 (MonoidHom.monoidHomClass.{u2, u1} N M _inst_2 _inst_1))) f) (MonoidHom.map_mul.{u1, u2} N M _inst_2 _inst_1 f) c)) (Submonoid.mul.{u1} (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.mrange.{u2, u1, max u1 u2} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c) (MonoidHom.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.monoidHomClass.{u2, u1} N (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 (Con.mulOneClass.{u1} M _inst_1 c)) (MonoidHom.comp.{u2, u1, u1} N M (Con.Quotient.{u1} M (MulOneClass.toMul.{u1} M _inst_1) c) _inst_2 _inst_1 (Con.mulOneClass.{u1} M _inst_1 c) (Con.mk'.{u1} M _inst_1 c) f)))
 Case conversion may be inaccurate. Consider using '#align con.comap_quotient_equiv Con.comapQuotientEquivₓ'. -/
 /-- The second isomorphism theorem for monoids. -/
 @[to_additive "The second isomorphism theorem for `add_monoid`s."]
Diff
@@ -564,9 +564,9 @@ instance : CompleteLattice (Con M) :=
 
 /- warning: con.inf_def -> Con.inf_def is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (M -> M -> Prop) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 (HasInf.inf.{u1} (Con.{u1} M _inst_1) (SemilatticeInf.toHasInf.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d))) (HasInf.inf.{u1} (M -> M -> Prop) (Pi.hasInf.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.hasInf.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeInf.toHasInf.{0} Prop (Lattice.toSemilatticeInf.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d)))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (M -> M -> Prop) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 (Inf.inf.{u1} (Con.{u1} M _inst_1) (SemilatticeInf.toHasInf.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d))) (Inf.inf.{u1} (M -> M -> Prop) (Pi.hasInf.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.hasInf.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeInf.toHasInf.{0} Prop (Lattice.toSemilatticeInf.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d)))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (M -> M -> Prop) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 (HasInf.inf.{u1} (Con.{u1} M _inst_1) (Lattice.toHasInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1))) c d))) (HasInf.inf.{u1} (M -> M -> Prop) (Pi.instHasInfForAll.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.instHasInfForAll.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => Lattice.toHasInf.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice)))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d)))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (M -> M -> Prop) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 (Inf.inf.{u1} (Con.{u1} M _inst_1) (Lattice.toInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1))) c d))) (Inf.inf.{u1} (M -> M -> Prop) (Pi.instInfForAll.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.instInfForAll.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => Lattice.toInf.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice)))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d)))
 Case conversion may be inaccurate. Consider using '#align con.inf_def Con.inf_defₓ'. -/
 /-- The infimum of two congruence relations equals the infimum of the underlying binary
     operations. -/
@@ -579,9 +579,9 @@ theorem inf_def {c d : Con M} : (c ⊓ d).R = c.R ⊓ d.R :=
 
 /- warning: con.inf_iff_and -> Con.inf_iff_and is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1} {x : M} {y : M}, Iff (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) (HasInf.inf.{u1} (Con.{u1} M _inst_1) (SemilatticeInf.toHasInf.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) x y) (And (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) d x y))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1} {x : M} {y : M}, Iff (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) (Inf.inf.{u1} (Con.{u1} M _inst_1) (SemilatticeInf.toHasInf.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) x y) (And (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) d x y))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1} {x : M} {y : M}, Iff (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) (HasInf.inf.{u1} (Con.{u1} M _inst_1) (Lattice.toHasInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1))) c d) x y) (And (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) d x y))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1} {x : M} {y : M}, Iff (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) (Inf.inf.{u1} (Con.{u1} M _inst_1) (Lattice.toInf.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1))) c d) x y) (And (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) d x y))
 Case conversion may be inaccurate. Consider using '#align con.inf_iff_and Con.inf_iff_andₓ'. -/
 /-- Definition of the infimum of two congruence relations. -/
 @[to_additive "Definition of the infimum of two additive congruence relations."]
@@ -656,9 +656,9 @@ theorem conGen_idem (r : M → M → Prop) : conGen (conGen r) = conGen r :=
 
 /- warning: con.sup_eq_con_gen -> Con.sup_eq_conGen is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (c : Con.{u1} M _inst_1) (d : Con.{u1} M _inst_1), Eq.{succ u1} (Con.{u1} M _inst_1) (HasSup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Or (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) d x y)))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (c : Con.{u1} M _inst_1) (d : Con.{u1} M _inst_1), Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Or (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) c x y) (coeFn.{succ u1, succ u1} (Con.{u1} M _inst_1) (fun (_x : Con.{u1} M _inst_1) => M -> M -> Prop) (Con.hasCoeToFun.{u1} M _inst_1) d x y)))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (c : Con.{u1} M _inst_1) (d : Con.{u1} M _inst_1), Eq.{succ u1} (Con.{u1} M _inst_1) (HasSup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Or (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) d x y)))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] (c : Con.{u1} M _inst_1) (d : Con.{u1} M _inst_1), Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (fun (x : M) (y : M) => Or (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) c x y) (FunLike.coe.{succ u1, succ u1, succ u1} (Con.{u1} M _inst_1) M (fun (_x : M) => (fun (x._@.Mathlib.GroupTheory.Congruence._hyg.479 : M) => M -> Prop) _x) (Con.instFunLikeConForAllProp.{u1} M _inst_1) d x y)))
 Case conversion may be inaccurate. Consider using '#align con.sup_eq_con_gen Con.sup_eq_conGenₓ'. -/
 /-- The supremum of congruence relations `c, d` equals the smallest congruence relation containing
     the binary relation '`x` is related to `y` by `c` or `d`'. -/
@@ -674,9 +674,9 @@ theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x
 
 /- warning: con.sup_def -> Con.sup_def is a dubious translation:
 lean 3 declaration is
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (Con.{u1} M _inst_1) (HasSup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (HasSup.sup.{u1} (M -> M -> Prop) (Pi.hasSup.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.hasSup.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeSup.toHasSup.{0} Prop (Lattice.toSemilatticeSup.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d))))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.completeLattice.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (Sup.sup.{u1} (M -> M -> Prop) (Pi.hasSup.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.hasSup.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeSup.toHasSup.{0} Prop (Lattice.toSemilatticeSup.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d))))
 but is expected to have type
-  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (Con.{u1} M _inst_1) (HasSup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toHasSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (HasSup.sup.{u1} (M -> M -> Prop) (Pi.instHasSupForAll.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.instHasSupForAll.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeSup.toHasSup.{0} Prop (Lattice.toSemilatticeSup.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d))))
+  forall {M : Type.{u1}} [_inst_1 : Mul.{u1} M] {c : Con.{u1} M _inst_1} {d : Con.{u1} M _inst_1}, Eq.{succ u1} (Con.{u1} M _inst_1) (Sup.sup.{u1} (Con.{u1} M _inst_1) (SemilatticeSup.toSup.{u1} (Con.{u1} M _inst_1) (Lattice.toSemilatticeSup.{u1} (Con.{u1} M _inst_1) (CompleteLattice.toLattice.{u1} (Con.{u1} M _inst_1) (Con.instCompleteLatticeCon.{u1} M _inst_1)))) c d) (conGen.{u1} M _inst_1 (Sup.sup.{u1} (M -> M -> Prop) (Pi.instSupForAll.{u1, u1} M (fun (ᾰ : M) => M -> Prop) (fun (i : M) => Pi.instSupForAll.{u1, 0} M (fun (ᾰ : M) => Prop) (fun (i : M) => SemilatticeSup.toSup.{0} Prop (Lattice.toSemilatticeSup.{0} Prop (CompleteLattice.toLattice.{0} Prop Prop.completeLattice))))) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 c)) (Setoid.r.{succ u1} M (Con.toSetoid.{u1} M _inst_1 d))))
 Case conversion may be inaccurate. Consider using '#align con.sup_def Con.sup_defₓ'. -/
 /-- The supremum of two congruence relations equals the smallest congruence relation containing
     the supremum of the underlying binary operations. -/

Changes in mathlib4

mathlib3
mathlib4
chore: adapt to multiple goal linter 1 (#12338)

A PR accompanying #12339.

Zulip discussion

Diff
@@ -1338,7 +1338,7 @@ def liftOnUnits (u : Units c.Quotient) (f : ∀ x y : M, c (x * y) 1 → c (y *
         f x y (c.eq.1 hxy) (c.eq.1 hyx))
       (fun x y x' y' hx hy => _) u.3 u.4
   refine' Function.hfunext _ _
-  rw [c.eq.2 hx, c.eq.2 hy]
+  · rw [c.eq.2 hx, c.eq.2 hy]
   · rintro Hxy Hxy' -
     refine' Function.hfunext _ _
     · rw [c.eq.2 hx, c.eq.2 hy]
doc: fix many more mathlib3 names in doc comments (#11987)

A mix of various changes; generated with a script and manually tweaked.

Diff
@@ -768,7 +768,7 @@ variable {c}
 /-- The congruence relation on a monoid `M` from a submonoid of `M × M` for which membership
     is an equivalence relation. -/
 @[to_additive "The additive congruence relation on an `AddMonoid` `M` from
-an `add_submonoid` of `M × M` for which membership is an equivalence relation."]
+an `AddSubmonoid` of `M × M` for which membership is an equivalence relation."]
 def ofSubmonoid (N : Submonoid (M × M)) (H : Equivalence fun x y => (x, y) ∈ N) : Con M
     where
   r x y := (x, y) ∈ N
@@ -780,7 +780,7 @@ def ofSubmonoid (N : Submonoid (M × M)) (H : Equivalence fun x y => (x, y) ∈
 /-- Coercion from a congruence relation `c` on a monoid `M` to the submonoid of `M × M` whose
     elements are `(x, y)` such that `x` is related to `y` by `c`. -/
 @[to_additive "Coercion from a congruence relation `c` on an `AddMonoid` `M`
-to the `add_submonoid` of `M × M` whose elements are `(x, y)` such that `x`
+to the `AddSubmonoid` of `M × M` whose elements are `(x, y)` such that `x`
 is related to `y` by `c`."]
 instance toSubmonoid : Coe (Con M) (Submonoid (M × M)) :=
   ⟨fun c => c.submonoid⟩
change the order of operation in zsmulRec and nsmulRec (#11451)

We change the following field in the definition of an additive commutative monoid:

 nsmul_succ : ∀ (n : ℕ) (x : G),
-  AddMonoid.nsmul (n + 1) x = x + AddMonoid.nsmul n x
+  AddMonoid.nsmul (n + 1) x = AddMonoid.nsmul n x + x

where the latter is more natural

We adjust the definitions of ^ in monoids, groups, etc. Originally there was a warning comment about why this natural order was preferred

use x * npowRec n x and not npowRec n x * x in the definition to make sure that definitional unfolding of npowRec is blocked, to avoid deep recursion issues.

but it seems to no longer apply.

Remarks on the PR :

  • pow_succ and pow_succ' have switched their meanings.
  • Most of the time, the proofs were adjusted by priming/unpriming one lemma, or exchanging left and right; a few proofs were more complicated to adjust.
  • In particular, [Mathlib/NumberTheory/RamificationInertia.lean] used Ideal.IsPrime.mul_mem_pow which is defined in [Mathlib/RingTheory/DedekindDomain/Ideal.lean]. Changing the order of operation forced me to add the symmetric lemma Ideal.IsPrime.mem_pow_mul.
  • the docstring for Cauchy condensation test in [Mathlib/Analysis/PSeries.lean] was mathematically incorrect, I added the mention that the function is antitone.
Diff
@@ -1140,7 +1140,7 @@ section Monoids
 protected theorem pow {M : Type*} [Monoid M] (c : Con M) :
     ∀ (n : ℕ) {w x}, c w x → c (w ^ n) (x ^ n)
   | 0, w, x, _ => by simpa using c.refl _
-  | Nat.succ n, w, x, h => by simpa [pow_succ] using c.mul h (Con.pow c n h)
+  | Nat.succ n, w, x, h => by simpa [pow_succ] using c.mul (Con.pow c n h) h
 #align con.pow Con.pow
 #align add_con.nsmul AddCon.nsmul
 
chore: simplify some proofs for the 2024-03-16 nightly (#11547)

Some small changes to adapt to the 2024-03-16 nightly that can land in advance.

Diff
@@ -686,7 +686,8 @@ the additive congruence relations on the quotient of `M` by `c`."]
 def correspondence : { d // c ≤ d } ≃o Con c.Quotient
     where
   toFun d :=
-    d.1.mapOfSurjective (↑) _ (by rw [mul_ker_mk_eq]; exact d.2) <| @exists_rep _ c.toSetoid
+    d.1.mapOfSurjective (↑) _ (by rw [mul_ker_mk_eq]; exact d.2) <|
+      @Quotient.exists_rep _ c.toSetoid
   invFun d :=
     ⟨comap ((↑) : M → c.Quotient) (fun x y => rfl) d, fun x y h =>
       show d x y by rw [c.eq.2 h]; exact d.refl _⟩
@@ -711,7 +712,8 @@ def correspondence : { d // c ≤ d } ≃o Con c.Quotient
     constructor
     · intros h x y hs
       rcases h ⟨x, y, rfl, rfl, hs⟩ with ⟨a, b, hx, hy, ht⟩
-      exact t.1.trans (t.1.symm <| t.2 <| eq_rel.1 hx) (t.1.trans ht (t.2 <| eq_rel.1 hy))
+      exact t.1.trans (t.1.symm <| t.2 <| Quotient.eq_rel.1 hx)
+        (t.1.trans ht (t.2 <| Quotient.eq_rel.1 hy))
     · intros h _ _ hs
       rcases hs with ⟨a, b, hx, hy, Hs⟩
       exact ⟨a, b, hx, hy, h Hs⟩
chore: Rename zpow_coe_nat to zpow_natCast (#11528)

... and add a deprecated alias for the old name. This is mostly just me discovering the power of F2

Diff
@@ -1265,7 +1265,7 @@ protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) :=
 /-- Multiplicative congruence relations preserve integer powers. -/
 @[to_additive "Additive congruence relations preserve integer scaling."]
 protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
-  | Int.ofNat n, w, x, h => by simpa only [zpow_coe_nat, Int.ofNat_eq_coe] using c.pow n h
+  | Int.ofNat n, w, x, h => by simpa only [zpow_natCast, Int.ofNat_eq_coe] using c.pow n h
   | Int.negSucc n, w, x, h => by simpa only [zpow_negSucc] using c.inv (c.pow _ h)
 #align con.zpow Con.zpow
 #align add_con.zsmul AddCon.zsmul
chore: classify todo porting notes (#11216)

Classifies by adding issue number #11215 to porting notes claiming "TODO".

Diff
@@ -284,7 +284,7 @@ theorem quot_mk_eq_coe {M : Type*} [Mul M] (c : Con M) (x : M) : Quot.mk c x = (
 #align con.quot_mk_eq_coe Con.quot_mk_eq_coe
 #align add_con.quot_mk_eq_coe AddCon.quot_mk_eq_coe
 
--- Porting note: TODO: restore `elab_as_elim`
+-- Porting note (#11215): TODO: restore `elab_as_elim`
 /-- The function on the quotient by a congruence relation `c` induced by a function that is
     constant on `c`'s equivalence classes. -/
 @[to_additive "The function on the quotient by a congruence relation `c`
@@ -295,7 +295,7 @@ protected def liftOn {β} {c : Con M} (q : c.Quotient) (f : M → β) (h : ∀ a
 #align con.lift_on Con.liftOn
 #align add_con.lift_on AddCon.liftOn
 
--- Porting note: TODO: restore `elab_as_elim`
+-- Porting note (#11215): TODO: restore `elab_as_elim`
 /-- The binary function on the quotient by a congruence relation `c` induced by a binary function
     that is constant on `c`'s equivalence classes. -/
 @[to_additive "The binary function on the quotient by a congruence relation `c`
style: homogenise porting notes (#11145)

Homogenises porting notes via capitalisation and addition of whitespace.

It makes the following changes:

  • converts "--porting note" into "-- Porting note";
  • converts "porting note" into "Porting note".
Diff
@@ -118,7 +118,7 @@ variable [Mul M] [Mul N] [Mul P] (c : Con M)
 instance : Inhabited (Con M) :=
   ⟨conGen EmptyRelation⟩
 
---Porting note: upgraded to FunLike
+-- Porting note: upgraded to FunLike
 /-- A coercion from a congruence relation to its underlying binary relation. -/
 @[to_additive "A coercion from an additive congruence relation to its underlying binary relation."]
 instance : FunLike (Con M) M (M → Prop) where
@@ -253,7 +253,7 @@ protected def Quotient :=
 #align con.quotient Con.Quotient
 #align add_con.quotient AddCon.Quotient
 
---Porting note: made implicit
+-- Porting note: made implicit
 variable {c}
 
 /-- The morphism into the quotient by a congruence relation -/
@@ -263,7 +263,7 @@ def toQuotient : M → c.Quotient :=
 
 variable (c)
 
--- porting note: was `priority 0`. why?
+-- Porting note: was `priority 0`. why?
 /-- Coercion from a type with a multiplication to its quotient by a congruence relation.
 
 See Note [use has_coe_t]. -/
@@ -284,7 +284,7 @@ theorem quot_mk_eq_coe {M : Type*} [Mul M] (c : Con M) (x : M) : Quot.mk c x = (
 #align con.quot_mk_eq_coe Con.quot_mk_eq_coe
 #align add_con.quot_mk_eq_coe AddCon.quot_mk_eq_coe
 
--- porting note: TODO: restore `elab_as_elim`
+-- Porting note: TODO: restore `elab_as_elim`
 /-- The function on the quotient by a congruence relation `c` induced by a function that is
     constant on `c`'s equivalence classes. -/
 @[to_additive "The function on the quotient by a congruence relation `c`
@@ -295,7 +295,7 @@ protected def liftOn {β} {c : Con M} (q : c.Quotient) (f : M → β) (h : ∀ a
 #align con.lift_on Con.liftOn
 #align add_con.lift_on AddCon.liftOn
 
--- porting note: TODO: restore `elab_as_elim`
+-- Porting note: TODO: restore `elab_as_elim`
 /-- The binary function on the quotient by a congruence relation `c` induced by a binary function
     that is constant on `c`'s equivalence classes. -/
 @[to_additive "The binary function on the quotient by a congruence relation `c`
@@ -542,7 +542,7 @@ theorem conGen_of_con (c : Con M) : conGen c = c :=
 #align add_con.add_con_gen_of_con AddCon.addConGen_of_addCon
 #align add_con.add_con_gen_of_add_con AddCon.addConGen_of_addCon
 
---Porting note: removing simp, simp can prove it
+-- Porting note: removing simp, simp can prove it
 /-- The map sending a binary relation to the smallest congruence relation in which it is
     contained is idempotent. -/
 @[to_additive addConGen_idem "The map sending a binary relation to the smallest additive
@@ -691,7 +691,7 @@ def correspondence : { d // c ≤ d } ≃o Con c.Quotient
     ⟨comap ((↑) : M → c.Quotient) (fun x y => rfl) d, fun x y h =>
       show d x y by rw [c.eq.2 h]; exact d.refl _⟩
   left_inv d :=
-    --Porting note: by exact needed for unknown reason
+    -- Porting note: by exact needed for unknown reason
     by exact
       Subtype.ext_iff_val.2 <|
         ext fun x y =>
@@ -700,7 +700,7 @@ def correspondence : { d // c ≤ d } ≃o Con c.Quotient
             d.1.trans (d.1.symm <| d.2 <| c.eq.1 hx) <| d.1.trans H <| d.2 <| c.eq.1 hy,
             fun h => ⟨_, _, rfl, rfl, h⟩⟩
   right_inv d :=
-    --Porting note: by exact needed for unknown reason
+    -- Porting note: by exact needed for unknown reason
     by exact
       ext fun x y =>
         ⟨fun h =>
@@ -749,7 +749,7 @@ theorem coe_one : ((1 : M) : c.Quotient) = 1 :=
 
 variable (c)
 
---Porting note: made M implicit
+-- Porting note: made M implicit
 /-- The submonoid of `M × M` defined by a congruence relation on a monoid `M`. -/
 @[to_additive (attr := coe) "The `AddSubmonoid` of `M × M` defined by an additive congruence
 relation on an `AddMonoid` `M`."]
@@ -867,7 +867,7 @@ theorem coe_mk' : (c.mk' : M → c.Quotient) = ((↑) : M → c.Quotient) :=
 #align add_con.coe_mk' AddCon.coe_mk'
 
 @[to_additive (attr := simp)]
---Porting note: removed dot notation
+-- Porting note: removed dot notation
 theorem mrange_mk' : MonoidHom.mrange c.mk' = ⊤ :=
   MonoidHom.mrange_top_iff_surjective.2 mk'_surjective
 #align con.mrange_mk' Con.mrange_mk'
fix: correct statement of zpow_ofNat and ofNat_zsmul (#10969)

Previously these were syntactically identical to the corresponding zpow_coe_nat and coe_nat_zsmul lemmas, now they are about OfNat.ofNat.

Unfortunately, almost every call site uses the ofNat name to refer to Nat.cast, so the downstream proofs had to be adjusted too.

Diff
@@ -1265,7 +1265,7 @@ protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) :=
 /-- Multiplicative congruence relations preserve integer powers. -/
 @[to_additive "Additive congruence relations preserve integer scaling."]
 protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
-  | Int.ofNat n, w, x, h => by simpa only [zpow_ofNat, Int.ofNat_eq_coe] using c.pow n h
+  | Int.ofNat n, w, x, h => by simpa only [zpow_coe_nat, Int.ofNat_eq_coe] using c.pow n h
   | Int.negSucc n, w, x, h => by simpa only [zpow_negSucc] using c.inv (c.pow _ h)
 #align con.zpow Con.zpow
 #align add_con.zsmul AddCon.zsmul
refactor(*): abbreviation for non-dependent FunLike (#9833)

This follows up from #9785, which renamed FunLike to DFunLike, by introducing a new abbreviation FunLike F α β := DFunLike F α (fun _ => β), to make the non-dependent use of FunLike easier.

I searched for the pattern DFunLike.*fun and DFunLike.*λ in all files to replace expressions of the form DFunLike F α (fun _ => β) with FunLike F α β. I did this everywhere except for extends clauses for two reasons: it would conflict with #8386, and more importantly extends must directly refer to a structure with no unfolding of defs or abbrevs.

Diff
@@ -118,10 +118,10 @@ variable [Mul M] [Mul N] [Mul P] (c : Con M)
 instance : Inhabited (Con M) :=
   ⟨conGen EmptyRelation⟩
 
---Porting note: upgraded to DFunLike
+--Porting note: upgraded to FunLike
 /-- A coercion from a congruence relation to its underlying binary relation. -/
 @[to_additive "A coercion from an additive congruence relation to its underlying binary relation."]
-instance : DFunLike (Con M) M (fun _ => M → Prop) where
+instance : FunLike (Con M) M (M → Prop) where
   coe c := c.r
   coe_injective' := fun x y h => by
     rcases x with ⟨⟨x, _⟩, _⟩
chore(*): rename FunLike to DFunLike (#9785)

This prepares for the introduction of a non-dependent synonym of FunLike, which helps a lot with keeping #8386 readable.

This is entirely search-and-replace in 680197f combined with manual fixes in 4145626, e900597 and b8428f8. The commands that generated this change:

sed -i 's/\bFunLike\b/DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoFunLike\b/toDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/import Mathlib.Data.DFunLike/import Mathlib.Data.FunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bHom_FunLike\b/Hom_DFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean     
sed -i 's/\binstFunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\bfunLike\b/instDFunLike/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean
sed -i 's/\btoo many metavariables to apply `fun_like.has_coe_to_fun`/too many metavariables to apply `DFunLike.hasCoeToFun`/g' {Archive,Counterexamples,Mathlib,test}/**/*.lean

Co-authored-by: Anne Baanen <Vierkantor@users.noreply.github.com>

Diff
@@ -118,10 +118,10 @@ variable [Mul M] [Mul N] [Mul P] (c : Con M)
 instance : Inhabited (Con M) :=
   ⟨conGen EmptyRelation⟩
 
---Porting note: upgraded to FunLike
+--Porting note: upgraded to DFunLike
 /-- A coercion from a congruence relation to its underlying binary relation. -/
 @[to_additive "A coercion from an additive congruence relation to its underlying binary relation."]
-instance : FunLike (Con M) M (fun _ => M → Prop) where
+instance : DFunLike (Con M) M (fun _ => M → Prop) where
   coe c := c.r
   coe_injective' := fun x y h => by
     rcases x with ⟨⟨x, _⟩, _⟩
@@ -178,7 +178,7 @@ variable {c}
 /-- The map sending a congruence relation to its underlying binary relation is injective. -/
 @[to_additive "The map sending an additive congruence relation to its underlying binary relation
 is injective."]
-theorem ext' {c d : Con M} (H : ⇑c = ⇑d) : c = d := FunLike.coe_injective H
+theorem ext' {c d : Con M} (H : ⇑c = ⇑d) : c = d := DFunLike.coe_injective H
 #align con.ext' Con.ext'
 #align add_con.ext' AddCon.ext'
 
@@ -207,7 +207,7 @@ theorem ext_iff {c d : Con M} : (∀ x y, c x y ↔ d x y) ↔ c = d :=
 /-- Two congruence relations are equal iff their underlying binary relations are equal. -/
 @[to_additive "Two additive congruence relations are equal iff their underlying binary relations
 are equal."]
-theorem coe_inj {c d : Con M} : ⇑c = ⇑d ↔ c = d := FunLike.coe_injective.eq_iff
+theorem coe_inj {c d : Con M} : ⇑c = ⇑d ↔ c = d := DFunLike.coe_injective.eq_iff
 #align con.ext'_iff Con.coe_inj
 #align add_con.ext'_iff AddCon.coe_inj
 
@@ -606,7 +606,7 @@ variable (M)
     binary relations on `M`. -/
 @[to_additive "There is a Galois insertion of additive congruence relations on a type with
 an addition `M` into binary relations on `M`."]
-protected def gi : @GaloisInsertion (M → M → Prop) (Con M) _ _ conGen FunLike.coe
+protected def gi : @GaloisInsertion (M → M → Prop) (Con M) _ _ conGen DFunLike.coe
     where
   choice r _ := conGen r
   gc _ c := ⟨fun H _ _ h => H <| ConGen.Rel.of _ _ h, @fun H => conGen_of_con c ▸ conGen_mono H⟩
@@ -950,7 +950,7 @@ are equal if they are equal on elements that are coercions from the `AddMonoid`.
 theorem lift_funext (f g : c.Quotient →* P) (h : ∀ a : M, f a = g a) : f = g := by
   rw [← lift_apply_mk' f, ← lift_apply_mk' g]
   congr 1
-  exact FunLike.ext_iff.2 h
+  exact DFunLike.ext_iff.2 h
 #align con.lift_funext Con.lift_funext
 #align add_con.lift_funext AddCon.lift_funext
 
chore(*): drop $/<| before fun (#9361)

Subset of #9319

Diff
@@ -793,7 +793,7 @@ theorem mem_coe {c : Con M} {x y} : (x, y) ∈ (↑c : Submonoid (M × M)) ↔ (
 
 @[to_additive]
 theorem to_submonoid_inj (c d : Con M) (H : (c : Submonoid (M × M)) = d) : c = d :=
-  ext <| fun x y => show (x, y) ∈ c.submonoid ↔ (x, y) ∈ d from H ▸ Iff.rfl
+  ext fun x y => show (x, y) ∈ c.submonoid ↔ (x, y) ∈ d from H ▸ Iff.rfl
 #align con.to_submonoid_inj Con.to_submonoid_inj
 #align add_con.to_add_submonoid_inj AddCon.to_addSubmonoid_inj
 
feat(RingTheory/Congruence): add the CompleteLattice instance (#8313)

The code is copied from GroupTheory/Congruence.lean, and then modified to fix the errors.

I haven't copied the full contents of GroupTheory/Congruencee, only the results about the lattice structure.

This replaces leanprover-community/mathlib#18588

Diff
@@ -451,6 +451,10 @@ theorem coe_sInf (S : Set (Con M)) :
 #align con.Inf_def Con.coe_sInf
 #align add_con.Inf_def AddCon.coe_sInf
 
+@[to_additive (attr := simp, norm_cast)]
+theorem coe_iInf {ι : Sort*} (f : ι → Con M) : ⇑(iInf f) = ⨅ i, ⇑(f i) := by
+  rw [iInf, coe_sInf, ← Set.range_comp, sInf_range, Function.comp]
+
 @[to_additive]
 instance : PartialOrder (Con M) where
   le_refl _ _ _ := id
chore: Replace (· op ·) a by (a op ·) (#8843)

I used the regex \(\(· (.) ·\) (.)\), replacing with ($2 $1 ·).

Diff
@@ -1156,7 +1156,7 @@ theorem smul {α M : Type*} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (
 
 instance _root_.AddCon.Quotient.nsmul {M : Type*} [AddMonoid M] (c : AddCon M) :
     SMul ℕ c.Quotient where
-  smul n := (Quotient.map' ((· • ·) n)) fun _ _ => c.nsmul n
+  smul n := (Quotient.map' (n • ·)) fun _ _ => c.nsmul n
 #align add_con.quotient.has_nsmul AddCon.Quotient.nsmul
 
 @[to_additive existing AddCon.Quotient.nsmul]
@@ -1288,7 +1288,7 @@ instance hasDiv : Div c.Quotient :=
     subtraction. -/
 instance _root_.AddCon.Quotient.zsmul {M : Type*} [AddGroup M] (c : AddCon M) :
     SMul ℤ c.Quotient :=
-  ⟨fun z => (Quotient.map' ((· • ·) z)) fun _ _ => c.zsmul z⟩
+  ⟨fun z => (Quotient.map' (z • ·)) fun _ _ => c.zsmul z⟩
 #align add_con.quotient.has_zsmul AddCon.Quotient.zsmul
 
 /-- The integer power induced on the quotient by a congruence relation on a type with a
@@ -1372,7 +1372,7 @@ section Actions
 @[to_additive]
 instance instSMul {α M : Type*} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
     SMul α c.Quotient where
-  smul a := (Quotient.map' ((· • ·) a)) fun _ _ => c.smul a
+  smul a := (Quotient.map' (a • ·)) fun _ _ => c.smul a
 #align con.has_smul Con.instSMul
 #align add_con.has_vadd AddCon.instVAdd
 
refactor: replace some [@foo](https://github.com/foo) _ _ _ _ _ ... by named arguments (#8702)

Using Lean4's named arguments, we manage to remove a few hard-to-read explicit function calls [@foo](https://github.com/foo) _ _ _ _ _ ... which used to be necessary in Lean3.

Occasionally, this results in slightly longer code. The benefit of named arguments is readability, as well as to reduce the brittleness of the code when the argument order is changed.

Co-authored-by: Michael Rothgang <rothgami@math.hu-berlin.de>

Diff
@@ -1326,7 +1326,7 @@ def liftOnUnits (u : Units c.Quotient) (f : ∀ x y : M, c (x * y) 1 → c (y *
     (Hf : ∀ x y hxy hyx x' y' hxy' hyx',
       c x x' → c y y' → f x y hxy hyx = f x' y' hxy' hyx') : α := by
   refine'
-    @Con.hrecOn₂ M M _ _ c c (fun x y => x * y = 1 → y * x = 1 → α) (u : c.Quotient)
+    Con.hrecOn₂ (cN := c) (φ := fun x y => x * y = 1 → y * x = 1 → α) (u : c.Quotient)
       (↑u⁻¹ : c.Quotient)
       (fun (x y : M) (hxy : (x * y : c.Quotient) = 1) (hyx : (y * x : c.Quotient) = 1) =>
         f x y (c.eq.1 hxy) (c.eq.1 hyx))
doc: Mark named theorems (#8749)
Diff
@@ -1056,7 +1056,7 @@ theorem map_apply {c d : Con M} (h : c ≤ d) (x) :
 
 variable (c)
 
-/-- The first isomorphism theorem for monoids. -/
+/-- The **first isomorphism theorem for monoids**. -/
 @[to_additive "The first isomorphism theorem for `AddMonoid`s."]
 noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* MonoidHom.mrange f :=
   { Equiv.ofBijective
@@ -1105,7 +1105,7 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
 #align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjective
 #align add_con.quotient_ker_equiv_of_surjective AddCon.quotientKerEquivOfSurjective
 
-/-- The second isomorphism theorem for monoids. -/
+/-- The **second isomorphism theorem for monoids**. -/
 @[to_additive "The second isomorphism theorem for `AddMonoid`s."]
 noncomputable def comapQuotientEquiv (f : N →* M) :
     (comap f f.map_mul c).Quotient ≃* MonoidHom.mrange (c.mk'.comp f) :=
@@ -1113,7 +1113,7 @@ noncomputable def comapQuotientEquiv (f : N →* M) :
 #align con.comap_quotient_equiv Con.comapQuotientEquiv
 #align add_con.comap_quotient_equiv AddCon.comapQuotientEquiv
 
-/-- The third isomorphism theorem for monoids. -/
+/-- The **third isomorphism theorem for monoids**. -/
 @[to_additive "The third isomorphism theorem for `AddMonoid`s."]
 def quotientQuotientEquivQuotient (c d : Con M) (h : c ≤ d) :
     (ker (c.map d h)).Quotient ≃* d.Quotient :=
chore(GroupTheory/Congruence): small cleanups (#8314)

Switches to where notation in a couple of places and removes a default lt field.

Also replaces uses of .r with coeFn, since the latter is declared simp-normal by this file.

Diff
@@ -121,13 +121,13 @@ instance : Inhabited (Con M) :=
 --Porting note: upgraded to FunLike
 /-- A coercion from a congruence relation to its underlying binary relation. -/
 @[to_additive "A coercion from an additive congruence relation to its underlying binary relation."]
-instance : FunLike (Con M) M (fun _ => M → Prop) :=
-  { coe := fun c => fun x y => @Setoid.r _ c.toSetoid x y
-    coe_injective' := fun x y h => by
-      rcases x with ⟨⟨x, _⟩, _⟩
-      rcases y with ⟨⟨y, _⟩, _⟩
-      have : x = y := h
-      subst x; rfl }
+instance : FunLike (Con M) M (fun _ => M → Prop) where
+  coe c := c.r
+  coe_injective' := fun x y h => by
+    rcases x with ⟨⟨x, _⟩, _⟩
+    rcases y with ⟨⟨y, _⟩, _⟩
+    have : x = y := h
+    subst x; rfl
 
 @[to_additive (attr := simp)]
 theorem rel_eq_coe (c : Con M) : c.r = c :=
@@ -178,11 +178,7 @@ variable {c}
 /-- The map sending a congruence relation to its underlying binary relation is injective. -/
 @[to_additive "The map sending an additive congruence relation to its underlying binary relation
 is injective."]
-theorem ext' {c d : Con M} (H : c.r = d.r) : c = d := by
-  rcases c with ⟨⟨⟩⟩
-  rcases d with ⟨⟨⟩⟩
-  cases H
-  congr
+theorem ext' {c d : Con M} (H : ⇑c = ⇑d) : c = d := FunLike.coe_injective H
 #align con.ext' Con.ext'
 #align add_con.ext' AddCon.ext'
 
@@ -211,10 +207,9 @@ theorem ext_iff {c d : Con M} : (∀ x y, c x y ↔ d x y) ↔ c = d :=
 /-- Two congruence relations are equal iff their underlying binary relations are equal. -/
 @[to_additive "Two additive congruence relations are equal iff their underlying binary relations
 are equal."]
-theorem ext'_iff {c d : Con M} : c.r = d.r ↔ c = d :=
-  ⟨ext', fun h => h ▸ rfl⟩
-#align con.ext'_iff Con.ext'_iff
-#align add_con.ext'_iff AddCon.ext'_iff
+theorem coe_inj {c d : Con M} : ⇑c = ⇑d ↔ c = d := FunLike.coe_injective.eq_iff
+#align con.ext'_iff Con.coe_inj
+#align add_con.ext'_iff AddCon.coe_inj
 
 /-- The kernel of a multiplication-preserving function as a congruence relation. -/
 @[to_additive "The kernel of an addition-preserving function as an additive congruence relation."]
@@ -413,8 +408,8 @@ protected def congr {c d : Con M} (h : c = d) : c.Quotient ≃* d.Quotient :=
     `x` is related to `y` by `d` if `x` is related to `y` by `c`. -/
 @[to_additive "For additive congruence relations `c, d` on a type `M` with an addition, `c ≤ d` iff
 `∀ x y ∈ M`, `x` is related to `y` by `d` if `x` is related to `y` by `c`."]
-instance : LE (Con M) :=
-  ⟨fun c d => ∀ ⦃x y⦄, c x y → d x y⟩
+instance : LE (Con M) where
+  le c d := ∀ ⦃x y⦄, c x y → d x y
 
 /-- Definition of `≤` for congruence relations. -/
 @[to_additive "Definition of `≤` for additive congruence relations."]
@@ -426,12 +421,12 @@ theorem le_def {c d : Con M} : c ≤ d ↔ ∀ {x y}, c x y → d x y :=
 /-- The infimum of a set of congruence relations on a given type with a multiplication. -/
 @[to_additive "The infimum of a set of additive congruence relations on a given type with
 an addition."]
-instance : InfSet (Con M) :=
-  ⟨fun S =>
-    ⟨⟨fun x y => ∀ c : Con M, c ∈ S → c x y,
-        ⟨fun x c _ => c.refl x, fun h c hc => c.symm <| h c hc, fun h1 h2 c hc =>
-          c.trans (h1 c hc) <| h2 c hc⟩⟩,
-      fun h1 h2 c hc => c.mul (h1 c hc) <| h2 c hc⟩⟩
+instance : InfSet (Con M) where
+  sInf S :=
+    { r := fun x y => ∀ c : Con M, c ∈ S → c x y
+      iseqv := ⟨fun x c _ => c.refl x, fun h c hc => c.symm <| h c hc,
+        fun h1 h2 c hc => c.trans (h1 c hc) <| h2 c hc⟩
+      mul' := fun h1 h2 c hc => c.mul (h1 c hc) <| h2 c hc }
 
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying equivalence relation. -/
@@ -445,51 +440,49 @@ theorem sInf_toSetoid (S : Set (Con M)) : (sInf S).toSetoid = sInf (toSetoid ''
 
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying binary relation. -/
-@[to_additive "The infimum of a set of additive congruence relations is the same as the infimum
-of the set's image under the map to the underlying binary relation."]
-theorem sInf_def (S : Set (Con M)) :
-    ⇑(sInf S) = sInf (@Set.image (Con M) (M → M → Prop) (↑) S) := by
+@[to_additive (attr := simp, norm_cast)
+  "The infimum of a set of additive congruence relations is the same as the infimum
+  of the set's image under the map to the underlying binary relation."]
+theorem coe_sInf (S : Set (Con M)) :
+    ⇑(sInf S) = sInf ((⇑) '' S) := by
   ext
   simp only [sInf_image, iInf_apply, iInf_Prop_eq]
   rfl
-#align con.Inf_def Con.sInf_def
-#align add_con.Inf_def AddCon.sInf_def
+#align con.Inf_def Con.coe_sInf
+#align add_con.Inf_def AddCon.coe_sInf
 
 @[to_additive]
 instance : PartialOrder (Con M) where
-  le := (· ≤ ·)
-  lt c d := c ≤ d ∧ ¬d ≤ c
   le_refl _ _ _ := id
   le_trans _ _ _ h1 h2 _ _ h := h2 <| h1 h
-  lt_iff_le_not_le _ _ := Iff.rfl
   le_antisymm _ _ hc hd := ext fun _ _ => ⟨fun h => hc h, fun h => hd h⟩
 
 /-- The complete lattice of congruence relations on a given type with a multiplication. -/
 @[to_additive "The complete lattice of additive congruence relations on a given type with
 an addition."]
-instance : CompleteLattice (Con M) :=
-  { (completeLatticeOfInf (Con M)) fun s =>
+instance : CompleteLattice (Con M) where
+  __ := completeLatticeOfInf (Con M) fun s =>
       ⟨fun r hr x y h => (h : ∀ r ∈ s, (r : Con M) x y) r hr, fun r hr x y h r' hr' =>
         hr hr'
-          h⟩ with
-    inf := fun c d =>
-      ⟨c.toSetoid ⊓ d.toSetoid, fun h1 h2 => ⟨c.mul h1.1 h2.1, d.mul h1.2 h2.2⟩⟩
-    inf_le_left := fun _ _ _ _ h => h.1
-    inf_le_right := fun _ _ _ _ h => h.2
-    le_inf := fun _ _ _ hb hc _ _ h => ⟨hb h, hc h⟩
-    top := { Setoid.completeLattice.top with mul' := by tauto }
-    le_top := fun _ _ _ _ => trivial
-    bot := { Setoid.completeLattice.bot with mul' := fun h1 h2 => h1 ▸ h2 ▸ rfl }
-    bot_le := fun c x y h => h ▸ c.refl x }
+          h⟩
+  inf c d := ⟨c.toSetoid ⊓ d.toSetoid, fun h1 h2 => ⟨c.mul h1.1 h2.1, d.mul h1.2 h2.2⟩⟩
+  inf_le_left _ _ := fun _ _ h => h.1
+  inf_le_right _ _ := fun _ _ h => h.2
+  le_inf  _ _ _ hb hc := fun _ _ h => ⟨hb h, hc h⟩
+  top := { Setoid.completeLattice.top with mul' := by tauto }
+  le_top _ := fun _ _ _ => trivial
+  bot := { Setoid.completeLattice.bot with mul' := fun h1 h2 => h1 ▸ h2 ▸ rfl }
+  bot_le c := fun x y h => h ▸ c.refl x
 
 /-- The infimum of two congruence relations equals the infimum of the underlying binary
     operations. -/
-@[to_additive "The infimum of two additive congruence relations equals the infimum of the
-underlying binary operations."]
-theorem inf_def {c d : Con M} : (c ⊓ d).r = c.r ⊓ d.r :=
+@[to_additive (attr := simp, norm_cast)
+  "The infimum of two additive congruence relations equals the infimum of the underlying binary
+  operations."]
+theorem coe_inf {c d : Con M} : ⇑(c ⊓ d) = ⇑c ⊓ ⇑d :=
   rfl
-#align con.inf_def Con.inf_def
-#align add_con.inf_def AddCon.inf_def
+#align con.inf_def Con.coe_inf
+#align add_con.inf_def AddCon.coe_inf
 
 /-- Definition of the infimum of two congruence relations. -/
 @[to_additive "Definition of the infimum of two additive congruence relations."]
@@ -505,9 +498,9 @@ containing a binary relation `r` equals the infimum of the set of additive congr
 containing `r`."]
 theorem conGen_eq (r : M → M → Prop) : conGen r = sInf { s : Con M | ∀ x y, r x y → s x y } :=
   le_antisymm
-    (le_sInf (fun s hs x y (hxy : (conGen r).r x y) =>
-      show s.r x y by
-        apply ConGen.Rel.recOn (motive := fun x y _ => s.r x y) hxy
+    (le_sInf (fun s hs x y (hxy : (conGen r) x y) =>
+      show s x y by
+        apply ConGen.Rel.recOn (motive := fun x y _ => s x y) hxy
         · exact fun x y h => hs x y h
         · exact s.refl'
         · exact fun _ => s.symm'
@@ -521,7 +514,7 @@ theorem conGen_eq (r : M → M → Prop) : conGen r = sInf { s : Con M | ∀ x y
     congruence relation containing `r`. -/
 @[to_additive addConGen_le "The smallest additive congruence relation containing a binary
 relation `r` is contained in any additive congruence relation containing `r`."]
-theorem conGen_le {r : M → M → Prop} {c : Con M} (h : ∀ x y, r x y → @Setoid.r _ c.toSetoid x y) :
+theorem conGen_le {r : M → M → Prop} {c : Con M} (h : ∀ x y, r x y → c x y) :
     conGen r ≤ c := by rw [conGen_eq]; exact sInf_le h
 #align con.con_gen_le Con.conGen_le
 #align add_con.add_con_gen_le AddCon.addConGen_le
@@ -571,7 +564,7 @@ theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x
     the supremum of the underlying binary operations. -/
 @[to_additive "The supremum of two additive congruence relations equals the smallest additive
 congruence relation containing the supremum of the underlying binary operations."]
-theorem sup_def {c d : Con M} : c ⊔ d = conGen (c.r ⊔ d.r) := by rw [sup_eq_conGen]; rfl
+theorem sup_def {c d : Con M} : c ⊔ d = conGen (⇑c ⊔ ⇑d) := by rw [sup_eq_conGen]; rfl
 #align con.sup_def Con.sup_def
 #align add_con.sup_def AddCon.sup_def
 
@@ -596,7 +589,7 @@ theorem sSup_eq_conGen (S : Set (Con M)) :
 additive congruence relation containing the supremum of the set's image under the map to the
 underlying binary relation."]
 theorem sSup_def {S : Set (Con M)} :
-    sSup S = conGen (sSup (@Set.image (Con M) (M → M → Prop) ((⇑) : Con M → M → M → Prop) S)) := by
+    sSup S = conGen (sSup ((⇑) '' S)) := by
   rw [sSup_eq_conGen, sSup_image]
   congr with (x y)
   simp only [sSup_image, iSup_apply, iSup_Prop_eq, exists_prop, rel_eq_coe]
refactor(Algebra/Hom): transpose Hom and file name (#8095)

I believe the file defining a type of morphisms belongs alongside the file defining the structure this morphism works on. So I would like to reorganize the files in the Mathlib.Algebra.Hom folder so that e.g. Mathlib.Algebra.Hom.Ring becomes Mathlib.Algebra.Ring.Hom and Mathlib.Algebra.Hom.NonUnitalAlg becomes Mathlib.Algebra.Algebra.NonUnitalHom.

While fixing the imports I went ahead and sorted them for good luck.

The full list of changes is: renamed: Mathlib/Algebra/Hom/NonUnitalAlg.lean -> Mathlib/Algebra/Algebra/NonUnitalHom.lean renamed: Mathlib/Algebra/Hom/Aut.lean -> Mathlib/Algebra/Group/Aut.lean renamed: Mathlib/Algebra/Hom/Commute.lean -> Mathlib/Algebra/Group/Commute/Hom.lean renamed: Mathlib/Algebra/Hom/Embedding.lean -> Mathlib/Algebra/Group/Embedding.lean renamed: Mathlib/Algebra/Hom/Equiv/Basic.lean -> Mathlib/Algebra/Group/Equiv/Basic.lean renamed: Mathlib/Algebra/Hom/Equiv/TypeTags.lean -> Mathlib/Algebra/Group/Equiv/TypeTags.lean renamed: Mathlib/Algebra/Hom/Equiv/Units/Basic.lean -> Mathlib/Algebra/Group/Units/Equiv.lean renamed: Mathlib/Algebra/Hom/Equiv/Units/GroupWithZero.lean -> Mathlib/Algebra/GroupWithZero/Units/Equiv.lean renamed: Mathlib/Algebra/Hom/Freiman.lean -> Mathlib/Algebra/Group/Freiman.lean renamed: Mathlib/Algebra/Hom/Group/Basic.lean -> Mathlib/Algebra/Group/Hom/Basic.lean renamed: Mathlib/Algebra/Hom/Group/Defs.lean -> Mathlib/Algebra/Group/Hom/Defs.lean renamed: Mathlib/Algebra/Hom/GroupAction.lean -> Mathlib/GroupTheory/GroupAction/Hom.lean renamed: Mathlib/Algebra/Hom/GroupInstances.lean -> Mathlib/Algebra/Group/Hom/Instances.lean renamed: Mathlib/Algebra/Hom/Iterate.lean -> Mathlib/Algebra/GroupPower/IterateHom.lean renamed: Mathlib/Algebra/Hom/Centroid.lean -> Mathlib/Algebra/Ring/CentroidHom.lean renamed: Mathlib/Algebra/Hom/Ring/Basic.lean -> Mathlib/Algebra/Ring/Hom/Basic.lean renamed: Mathlib/Algebra/Hom/Ring/Defs.lean -> Mathlib/Algebra/Ring/Hom/Defs.lean renamed: Mathlib/Algebra/Hom/Units.lean -> Mathlib/Algebra/Group/Units/Hom.lean

Zulip thread: https://leanprover.zulipchat.com/#narrow/stream/287929-mathlib4/topic/Reorganizing.20.60Mathlib.2EAlgebra.2EHom.60

Diff
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Amelia Livingston
 -/
 import Mathlib.Algebra.Group.Prod
-import Mathlib.Algebra.Hom.Equiv.Basic
+import Mathlib.Algebra.Group.Equiv.Basic
 import Mathlib.Data.Setoid.Basic
 import Mathlib.GroupTheory.Submonoid.Operations
 
perf: improve some instances in GroupTheory/Congruence (#6874)
Diff
@@ -732,10 +732,8 @@ variable [MulOneClass M] [MulOneClass N] [MulOneClass P] (c : Con M)
 /-- The quotient of a monoid by a congruence relation is a monoid. -/
 @[to_additive "The quotient of an `AddMonoid` by an additive congruence relation is
 an `AddMonoid`."]
-instance mulOneClass : MulOneClass c.Quotient
-    where
+instance mulOneClass : MulOneClass c.Quotient where
   one := ((1 : M) : c.Quotient)
-  mul := (· * ·)
   mul_one x := Quotient.inductionOn' x fun _ => congr_arg ((↑) : M → c.Quotient) <| mul_one _
   one_mul x := Quotient.inductionOn' x fun _ => congr_arg ((↑) : M → c.Quotient) <| one_mul _
 #align con.mul_one_class Con.mulOneClass
@@ -1148,7 +1146,7 @@ protected theorem pow {M : Type*} [Monoid M] (c : Con M) :
 #align add_con.nsmul AddCon.nsmul
 
 @[to_additive]
-instance [MulOneClass M] (c : Con M) : One c.Quotient where
+instance one [MulOneClass M] (c : Con M) : One c.Quotient where
   -- Using Quotient.mk'' here instead of c.toQuotient
   -- since c.toQuotient is not reducible.
   -- This would lead to non-defeq diamonds since this instance ends up in
@@ -1176,7 +1174,12 @@ instance {M : Type*} [Monoid M] (c : Con M) : Pow c.Quotient ℕ where
 @[to_additive "The quotient of an `AddSemigroup` by an additive congruence relation is
 an `AddSemigroup`."]
 instance semigroup {M : Type*} [Semigroup M] (c : Con M) : Semigroup c.Quotient :=
-  Function.Surjective.semigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
+  { (Function.Surjective.semigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl :
+      Semigroup c.Quotient) with
+    /- The `toMul` field is given explicitly for performance reasons.
+    This avoids any need to unfold `Function.Surjective.semigroup` when the type checker is checking
+    that instance diagrams commute -/
+    toMul := Con.hasMul _ }
 #align con.semigroup Con.semigroup
 #align add_con.add_semigroup AddCon.addSemigroup
 
@@ -1184,7 +1187,12 @@ instance semigroup {M : Type*} [Semigroup M] (c : Con M) : Semigroup c.Quotient
 @[to_additive "The quotient of an `AddCommSemigroup` by an additive congruence relation is
 an `AddCommSemigroup`."]
 instance commSemigroup {M : Type*} [CommSemigroup M] (c : Con M) : CommSemigroup c.Quotient :=
-  Function.Surjective.commSemigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
+  { (Function.Surjective.commSemigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl :
+      CommSemigroup c.Quotient) with
+    /- The `toSemigroup` field is given explicitly for performance reasons.
+    This avoids any need to unfold `Function.Surjective.commSemigroup` when the type checker is
+    checking that instance diagrams commute -/
+    toSemigroup := Con.semigroup _ }
 #align con.comm_semigroup Con.commSemigroup
 #align add_con.add_comm_semigroup AddCon.addCommSemigroup
 
@@ -1192,7 +1200,13 @@ instance commSemigroup {M : Type*} [CommSemigroup M] (c : Con M) : CommSemigroup
 @[to_additive "The quotient of an `AddMonoid` by an additive congruence relation is
 an `AddMonoid`."]
 instance monoid {M : Type*} [Monoid M] (c : Con M) : Monoid c.Quotient :=
-  Function.Surjective.monoid _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) fun _ _ => rfl
+  { (Function.Surjective.monoid _ Quotient.surjective_Quotient_mk'' rfl
+      (fun _ _ => rfl) fun _ _ => rfl : Monoid c.Quotient) with
+    /- The `toSemigroup` and `toOne` fields are given explicitly for performance reasons.
+    This avoids any need to unfold `Function.Surjective.monoid` when the type checker is
+    checking that instance diagrams commute -/
+    toSemigroup := Con.semigroup _
+    toOne := Con.one _ }
 #align con.monoid Con.monoid
 #align add_con.add_monoid AddCon.addMonoid
 
@@ -1200,8 +1214,12 @@ instance monoid {M : Type*} [Monoid M] (c : Con M) : Monoid c.Quotient :=
 @[to_additive "The quotient of an `AddCommMonoid` by an additive congruence
 relation is an `AddCommMonoid`."]
 instance commMonoid {M : Type*} [CommMonoid M] (c : Con M) : CommMonoid c.Quotient :=
-  Function.Surjective.commMonoid _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) fun _ _ =>
-    rfl
+  { (Function.Surjective.commMonoid _ Quotient.surjective_Quotient_mk'' rfl
+      (fun _ _ => rfl) fun _ _ => rfl : CommMonoid c.Quotient) with
+    /- The `toMonoid` field is given explicitly for performance reasons.
+    This avoids any need to unfold `Function.Surjective.commMonoid` when the type checker is
+    checking that instance diagrams commute -/
+    toMonoid := Con.monoid _ }
 #align con.comm_monoid Con.commMonoid
 #align add_con.add_comm_monoid AddCon.addCommMonoid
 
@@ -1291,9 +1309,12 @@ instance zpowinst : Pow c.Quotient ℤ :=
 @[to_additive "The quotient of an `AddGroup` by an additive congruence relation is
 an `AddGroup`."]
 instance group : Group c.Quotient :=
-  Function.Surjective.group Quotient.mk''
-    Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) (fun _ => rfl)
-    (fun _ _ => rfl) (fun _ _ => rfl) fun _ _ => rfl
+  { (Function.Surjective.group Quotient.mk''
+      Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) (fun _ => rfl)
+        (fun _ _ => rfl) (fun _ _ => rfl) fun _ _ => rfl : Group c.Quotient) with
+    toMonoid := Con.monoid _
+    toInv := Con.hasInv _
+    toDiv := Con.hasDiv _ }
 #align con.group Con.group
 #align add_con.add_group AddCon.addGroup
 
@@ -1371,9 +1392,7 @@ theorem coe_smul {α M : Type*} [MulOneClass M] [SMul α M] [IsScalarTower α M
 
 @[to_additive]
 instance mulAction {α M : Type*} [Monoid α] [MulOneClass M] [MulAction α M] [IsScalarTower α M M]
-    (c : Con M) : MulAction α c.Quotient
-    where
-  smul := (· • ·)
+    (c : Con M) : MulAction α c.Quotient where
   one_smul := Quotient.ind' fun _ => congr_arg Quotient.mk'' <| one_smul _ _
   mul_smul _ _ := Quotient.ind' fun _ => congr_arg Quotient.mk'' <| mul_smul _ _ _
 #align con.mul_action Con.mulAction
@@ -1381,8 +1400,7 @@ instance mulAction {α M : Type*} [Monoid α] [MulOneClass M] [MulAction α M] [
 
 instance mulDistribMulAction {α M : Type*} [Monoid α] [Monoid M] [MulDistribMulAction α M]
     [IsScalarTower α M M] (c : Con M) : MulDistribMulAction α c.Quotient :=
-  { c.mulAction with
-    smul_one := fun _ => congr_arg Quotient.mk'' <| smul_one _
+  { smul_one := fun _ => congr_arg Quotient.mk'' <| smul_one _
     smul_mul := fun _ => Quotient.ind₂' fun _ _ => congr_arg Quotient.mk'' <| smul_mul' _ _ _ }
 #align con.mul_distrib_mul_action Con.mulDistribMulAction
 
refactor: redefine Monoid.Coprod (#2214)
  • Redefine Monoid.Coprod.
  • Use @[to_additive].
  • Expand API.
Diff
@@ -1205,6 +1205,28 @@ instance commMonoid {M : Type*} [CommMonoid M] (c : Con M) : CommMonoid c.Quotie
 #align con.comm_monoid Con.commMonoid
 #align add_con.add_comm_monoid AddCon.addCommMonoid
 
+/-- Sometimes, a group is defined as a quotient of a monoid by a congruence relation.
+Usually, the inverse operation is defined as `Setoid.map f _` for some `f`.
+This lemma allows to avoid code duplication in the definition of the inverse operation:
+instead of proving both `∀ x y, c x y → c (f x) (f y)` (to define the operation)
+and `∀ x, c (f x * x) 1` (to prove the group laws), one can only prove the latter. -/
+@[to_additive "Sometimes, an additive group is defined as a quotient of a monoid
+  by an additive congruence relation.
+  Usually, the inverse operation is defined as `Setoid.map f _` for some `f`.
+  This lemma allows to avoid code duplication in the definition of the inverse operation:
+  instead of proving both `∀ x y, c x y → c (f x) (f y)` (to define the operation)
+  and `∀ x, c (f x + x) 0` (to prove the group laws), one can only prove the latter."]
+theorem map_of_mul_left_rel_one [Monoid M] (c : Con M)
+    (f : M → M) (hf : ∀ x, c (f x * x) 1) {x y} (h : c x y) : c (f x) (f y) := by
+  simp only [← Con.eq, coe_one, coe_mul] at *
+  have hf' : ∀ x : M, (x : c.Quotient) * f x = 1 := fun x ↦
+    calc
+      (x : c.Quotient) * f x = f (f x) * f x * (x * f x) := by simp [hf]
+      _ = f (f x) * (f x * x) * f x := by ac_rfl
+      _ = 1 := by simp [hf]
+  have : (⟨_, _, hf' x, hf x⟩ : c.Quotientˣ) = ⟨_, _, hf' y, hf y⟩ := Units.ext h
+  exact congr_arg Units.inv this
+
 end Monoids
 
 section Groups
@@ -1213,8 +1235,8 @@ variable [Group M] [Group N] [Group P] (c : Con M)
 
 /-- Multiplicative congruence relations preserve inversion. -/
 @[to_additive "Additive congruence relations preserve negation."]
-protected theorem inv : ∀ {w x}, c w x → c w⁻¹ x⁻¹ := @fun x y h => by
-  simpa using c.symm (c.mul (c.mul (c.refl x⁻¹) h) (c.refl y⁻¹))
+protected theorem inv {x y} (h : c x y) : c x⁻¹ y⁻¹ :=
+  c.map_of_mul_left_rel_one Inv.inv (fun x => by simp only [mul_left_inv, c.refl 1]) h
 #align con.inv Con.inv
 #align add_con.neg AddCon.neg
 
perf: remove overspecified fields (#6965)

This removes redundant field values of the form add := add for smaller terms and less unfolding during unification.

A list of all files containing a structure instance of the form { a1, ... with x1 := val, ... } where some xi is a field of some aj was generated by modifying the structure instance elaboration algorithm to print such overlaps to stdout in a custom toolchain.

Using that toolchain, I went through each file on the list and attempted to remove algebraic fields that overlapped and were redundant, eg add := add and not toFun (though some other ones did creep in). If things broke (which was the case in a couple of cases), I did not push further and reverted.

It is possible that pushing harder and trying to remove all redundant overlaps will yield further improvements.

Diff
@@ -1360,7 +1360,6 @@ instance mulAction {α M : Type*} [Monoid α] [MulOneClass M] [MulAction α M] [
 instance mulDistribMulAction {α M : Type*} [Monoid α] [Monoid M] [MulDistribMulAction α M]
     [IsScalarTower α M M] (c : Con M) : MulDistribMulAction α c.Quotient :=
   { c.mulAction with
-    smul := (· • ·)
     smul_one := fun _ => congr_arg Quotient.mk'' <| smul_one _
     smul_mul := fun _ => Quotient.ind₂' fun _ _ => congr_arg Quotient.mk'' <| smul_mul' _ _ _ }
 #align con.mul_distrib_mul_action Con.mulDistribMulAction
style: fix wrapping of where (#7149)
Diff
@@ -1163,13 +1163,14 @@ theorem smul {α M : Type*} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (
 #align con.smul Con.smul
 #align add_con.vadd AddCon.vadd
 
-instance _root_.AddCon.Quotient.nsmul {M : Type*} [AddMonoid M] (c : AddCon M) : SMul ℕ c.Quotient
-    where smul n := (Quotient.map' ((· • ·) n)) fun _ _ => c.nsmul n
+instance _root_.AddCon.Quotient.nsmul {M : Type*} [AddMonoid M] (c : AddCon M) :
+    SMul ℕ c.Quotient where
+  smul n := (Quotient.map' ((· • ·) n)) fun _ _ => c.nsmul n
 #align add_con.quotient.has_nsmul AddCon.Quotient.nsmul
 
 @[to_additive existing AddCon.Quotient.nsmul]
-instance {M : Type*} [Monoid M] (c : Con M) : Pow c.Quotient ℕ
-    where pow x n := Quotient.map' (fun x => x ^ n) (fun _ _ => c.pow n) x
+instance {M : Type*} [Monoid M] (c : Con M) : Pow c.Quotient ℕ where
+  pow x n := Quotient.map' (fun x => x ^ n) (fun _ _ => c.pow n) x
 
 /-- The quotient of a semigroup by a congruence relation is a semigroup. -/
 @[to_additive "The quotient of an `AddSemigroup` by an additive congruence relation is
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -51,7 +51,7 @@ quotient monoid, isomorphism theorems
 -/
 
 
-variable (M : Type _) {N : Type _} {P : Type _}
+variable (M : Type*) {N : Type*} {P : Type*}
 
 open Function Setoid
 
@@ -241,7 +241,7 @@ protected def prod (c : Con M) (d : Con N) : Con (M × N) :=
 
 /-- The product of an indexed collection of congruence relations. -/
 @[to_additive "The product of an indexed collection of additive congruence relations."]
-def pi {ι : Type _} {f : ι → Type _} [∀ i, Mul (f i)] (C : ∀ i, Con (f i)) : Con (∀ i, f i) :=
+def pi {ι : Type*} {f : ι → Type*} [∀ i, Mul (f i)] (C : ∀ i, Con (f i)) : Con (∀ i, f i) :=
   { @piSetoid _ _ fun i => (C i).toSetoid with
     mul' := fun h1 h2 i => (C i).mul (h1 i) (h2 i) }
 #align con.pi Con.pi
@@ -284,7 +284,7 @@ instance (priority := 500) [∀ a b, Decidable (c a b)] : DecidableEq c.Quotient
   inferInstanceAs (DecidableEq (Quotient c.toSetoid))
 
 @[to_additive (attr := simp)]
-theorem quot_mk_eq_coe {M : Type _} [Mul M] (c : Con M) (x : M) : Quot.mk c x = (x : c.Quotient) :=
+theorem quot_mk_eq_coe {M : Type*} [Mul M] (c : Con M) (x : M) : Quot.mk c x = (x : c.Quotient) :=
   rfl
 #align con.quot_mk_eq_coe Con.quot_mk_eq_coe
 #align add_con.quot_mk_eq_coe AddCon.quot_mk_eq_coe
@@ -313,7 +313,7 @@ protected def liftOn₂ {β} {c : Con M} (q r : c.Quotient) (f : M → M → β)
 
 /-- A version of `Quotient.hrecOn₂'` for quotients by `Con`. -/
 @[to_additive "A version of `Quotient.hrecOn₂'` for quotients by `AddCon`."]
-protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort _}
+protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort*}
     (a : cM.Quotient) (b : cN.Quotient) (f : ∀ (x : M) (y : N), φ x y)
     (h : ∀ x y x' y', cM x x' → cN y y' → HEq (f x y) (f x' y')) : φ a b :=
   Quotient.hrecOn₂' a b f h
@@ -321,7 +321,7 @@ protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quoti
 #align add_con.hrec_on₂ AddCon.hrecOn₂
 
 @[to_additive (attr := simp)]
-theorem hrec_on₂_coe {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort _} (a : M)
+theorem hrec_on₂_coe {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort*} (a : M)
     (b : N) (f : ∀ (x : M) (y : N), φ x y)
     (h : ∀ x y x' y', cM x x' → cN y y' → HEq (f x y) (f x' y')) :
     Con.hrecOn₂ (↑a) (↑b) f h = f a b :=
@@ -1140,7 +1140,7 @@ section Monoids
 
 /-- Multiplicative congruence relations preserve natural powers. -/
 @[to_additive "Additive congruence relations preserve natural scaling."]
-protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
+protected theorem pow {M : Type*} [Monoid M] (c : Con M) :
     ∀ (n : ℕ) {w x}, c w x → c (w ^ n) (x ^ n)
   | 0, w, x, _ => by simpa using c.refl _
   | Nat.succ n, w, x, h => by simpa [pow_succ] using c.mul h (Con.pow c n h)
@@ -1157,24 +1157,24 @@ instance [MulOneClass M] (c : Con M) : One c.Quotient where
   -- one := ((1 : M) : c.Quotient)
 
 @[to_additive]
-theorem smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α)
+theorem smul {α M : Type*} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α)
     {w x : M} (h : c w x) : c (a • w) (a • x) := by
   simpa only [smul_one_mul] using c.mul (c.refl' (a • (1 : M) : M)) h
 #align con.smul Con.smul
 #align add_con.vadd AddCon.vadd
 
-instance _root_.AddCon.Quotient.nsmul {M : Type _} [AddMonoid M] (c : AddCon M) : SMul ℕ c.Quotient
+instance _root_.AddCon.Quotient.nsmul {M : Type*} [AddMonoid M] (c : AddCon M) : SMul ℕ c.Quotient
     where smul n := (Quotient.map' ((· • ·) n)) fun _ _ => c.nsmul n
 #align add_con.quotient.has_nsmul AddCon.Quotient.nsmul
 
 @[to_additive existing AddCon.Quotient.nsmul]
-instance {M : Type _} [Monoid M] (c : Con M) : Pow c.Quotient ℕ
+instance {M : Type*} [Monoid M] (c : Con M) : Pow c.Quotient ℕ
     where pow x n := Quotient.map' (fun x => x ^ n) (fun _ _ => c.pow n) x
 
 /-- The quotient of a semigroup by a congruence relation is a semigroup. -/
 @[to_additive "The quotient of an `AddSemigroup` by an additive congruence relation is
 an `AddSemigroup`."]
-instance semigroup {M : Type _} [Semigroup M] (c : Con M) : Semigroup c.Quotient :=
+instance semigroup {M : Type*} [Semigroup M] (c : Con M) : Semigroup c.Quotient :=
   Function.Surjective.semigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
 #align con.semigroup Con.semigroup
 #align add_con.add_semigroup AddCon.addSemigroup
@@ -1182,7 +1182,7 @@ instance semigroup {M : Type _} [Semigroup M] (c : Con M) : Semigroup c.Quotient
 /-- The quotient of a commutative semigroup by a congruence relation is a semigroup. -/
 @[to_additive "The quotient of an `AddCommSemigroup` by an additive congruence relation is
 an `AddCommSemigroup`."]
-instance commSemigroup {M : Type _} [CommSemigroup M] (c : Con M) : CommSemigroup c.Quotient :=
+instance commSemigroup {M : Type*} [CommSemigroup M] (c : Con M) : CommSemigroup c.Quotient :=
   Function.Surjective.commSemigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
 #align con.comm_semigroup Con.commSemigroup
 #align add_con.add_comm_semigroup AddCon.addCommSemigroup
@@ -1190,7 +1190,7 @@ instance commSemigroup {M : Type _} [CommSemigroup M] (c : Con M) : CommSemigrou
 /-- The quotient of a monoid by a congruence relation is a monoid. -/
 @[to_additive "The quotient of an `AddMonoid` by an additive congruence relation is
 an `AddMonoid`."]
-instance monoid {M : Type _} [Monoid M] (c : Con M) : Monoid c.Quotient :=
+instance monoid {M : Type*} [Monoid M] (c : Con M) : Monoid c.Quotient :=
   Function.Surjective.monoid _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) fun _ _ => rfl
 #align con.monoid Con.monoid
 #align add_con.add_monoid AddCon.addMonoid
@@ -1198,7 +1198,7 @@ instance monoid {M : Type _} [Monoid M] (c : Con M) : Monoid c.Quotient :=
 /-- The quotient of a `CommMonoid` by a congruence relation is a `CommMonoid`. -/
 @[to_additive "The quotient of an `AddCommMonoid` by an additive congruence
 relation is an `AddCommMonoid`."]
-instance commMonoid {M : Type _} [CommMonoid M] (c : Con M) : CommMonoid c.Quotient :=
+instance commMonoid {M : Type*} [CommMonoid M] (c : Con M) : CommMonoid c.Quotient :=
   Function.Surjective.commMonoid _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) fun _ _ =>
     rfl
 #align con.comm_monoid Con.commMonoid
@@ -1252,7 +1252,7 @@ instance hasDiv : Div c.Quotient :=
 
 /-- The integer scaling induced on the quotient by a congruence relation on a type with a
     subtraction. -/
-instance _root_.AddCon.Quotient.zsmul {M : Type _} [AddGroup M] (c : AddCon M) :
+instance _root_.AddCon.Quotient.zsmul {M : Type*} [AddGroup M] (c : AddCon M) :
     SMul ℤ c.Quotient :=
   ⟨fun z => (Quotient.map' ((· • ·) z)) fun _ _ => c.zsmul z⟩
 #align add_con.quotient.has_zsmul AddCon.Quotient.zsmul
@@ -1278,7 +1278,7 @@ end Groups
 
 section Units
 
-variable {α : Type _} [Monoid M] {c : Con M}
+variable {α : Type*} [Monoid M] {c : Con M}
 
 /-- In order to define a function `(Con.Quotient c)ˣ → α` on the units of `Con.Quotient c`,
 where `c : Con M` is a multiplicative congruence on a monoid, it suffices to define a function `f`
@@ -1333,21 +1333,21 @@ end Units
 section Actions
 
 @[to_additive]
-instance instSMul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
+instance instSMul {α M : Type*} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
     SMul α c.Quotient where
   smul a := (Quotient.map' ((· • ·) a)) fun _ _ => c.smul a
 #align con.has_smul Con.instSMul
 #align add_con.has_vadd AddCon.instVAdd
 
 @[to_additive]
-theorem coe_smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M)
+theorem coe_smul {α M : Type*} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M)
     (a : α) (x : M) : (↑(a • x) : c.Quotient) = a • (x : c.Quotient) :=
   rfl
 #align con.coe_smul Con.coe_smul
 #align add_con.coe_vadd AddCon.coe_vadd
 
 @[to_additive]
-instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M] [IsScalarTower α M M]
+instance mulAction {α M : Type*} [Monoid α] [MulOneClass M] [MulAction α M] [IsScalarTower α M M]
     (c : Con M) : MulAction α c.Quotient
     where
   smul := (· • ·)
@@ -1356,7 +1356,7 @@ instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M]
 #align con.mul_action Con.mulAction
 #align add_con.add_action AddCon.addAction
 
-instance mulDistribMulAction {α M : Type _} [Monoid α] [Monoid M] [MulDistribMulAction α M]
+instance mulDistribMulAction {α M : Type*} [Monoid α] [Monoid M] [MulDistribMulAction α M]
     [IsScalarTower α M M] (c : Con M) : MulDistribMulAction α c.Quotient :=
   { c.mulAction with
     smul := (· • ·)
chore: tidy various files (#6291)
Diff
@@ -312,7 +312,7 @@ protected def liftOn₂ {β} {c : Con M} (q r : c.Quotient) (f : M → M → β)
 #align add_con.lift_on₂ AddCon.liftOn₂
 
 /-- A version of `Quotient.hrecOn₂'` for quotients by `Con`. -/
-@[to_additive "A version of `quotient.hrec_on₂'` for quotients by `add_con`."]
+@[to_additive "A version of `Quotient.hrecOn₂'` for quotients by `AddCon`."]
 protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort _}
     (a : cM.Quotient) (b : cN.Quotient) (f : ∀ (x : M) (y : N), φ x y)
     (h : ∀ x y x' y', cM x x' → cN y y' → HEq (f x y) (f x' y')) : φ a b :=
@@ -341,7 +341,7 @@ protected theorem induction_on {C : c.Quotient → Prop} (q : c.Quotient) (H : 
 #align add_con.induction_on AddCon.induction_on
 
 /-- A version of `Con.induction_on` for predicates which take two arguments. -/
-@[to_additive (attr := elab_as_elim) "A version of `add_con.induction_on` for predicates which take
+@[to_additive (attr := elab_as_elim) "A version of `AddCon.induction_on` for predicates which take
 two arguments."]
 protected theorem induction_on₂ {d : Con N} {C : c.Quotient → d.Quotient → Prop} (p : c.Quotient)
     (q : d.Quotient) (H : ∀ (x : M) (y : N), C x y) : C p q :=
@@ -468,8 +468,7 @@ instance : PartialOrder (Con M) where
 @[to_additive "The complete lattice of additive congruence relations on a given type with
 an addition."]
 instance : CompleteLattice (Con M) :=
-  {
-    (completeLatticeOfInf (Con M)) fun s =>
+  { (completeLatticeOfInf (Con M)) fun s =>
       ⟨fun r hr x y h => (h : ∀ r ∈ s, (r : Con M) x y) r hr, fun r hr x y h r' hr' =>
         hr hr'
           h⟩ with
@@ -757,7 +756,7 @@ variable (c)
 
 --Porting note: made M implicit
 /-- The submonoid of `M × M` defined by a congruence relation on a monoid `M`. -/
-@[to_additive (attr := coe) "The `add_submonoid` of `M × M` defined by an additive congruence
+@[to_additive (attr := coe) "The `AddSubmonoid` of `M × M` defined by an additive congruence
 relation on an `AddMonoid` `M`."]
 protected def submonoid : Submonoid (M × M)
     where
@@ -1182,7 +1181,7 @@ instance semigroup {M : Type _} [Semigroup M] (c : Con M) : Semigroup c.Quotient
 
 /-- The quotient of a commutative semigroup by a congruence relation is a semigroup. -/
 @[to_additive "The quotient of an `AddCommSemigroup` by an additive congruence relation is
-an `AddSemigroup`."]
+an `AddCommSemigroup`."]
 instance commSemigroup {M : Type _} [CommSemigroup M] (c : Con M) : CommSemigroup c.Quotient :=
   Function.Surjective.commSemigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
 #align con.comm_semigroup Con.commSemigroup
@@ -1334,10 +1333,11 @@ end Units
 section Actions
 
 @[to_additive]
-instance smulinst {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
-    SMul α c.Quotient where smul a := (Quotient.map' ((· • ·) a)) fun _ _ => c.smul a
-#align con.has_smul Con.smulinst
-#align add_con.has_vadd AddCon.smulinst
+instance instSMul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
+    SMul α c.Quotient where
+  smul a := (Quotient.map' ((· • ·) a)) fun _ _ => c.smul a
+#align con.has_smul Con.instSMul
+#align add_con.has_vadd AddCon.instVAdd
 
 @[to_additive]
 theorem coe_smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M)
chore: fix some Set defeq abuse, golf (#6114)
  • Use {x | p x} instead of fun x ↦ p x to define a set here and there.
  • Golf some proofs.
  • Replace Con.ker_apply_eq_preimage with Con.ker_apply. The old version used to abuse definitional equality between Set M and M → Prop.
  • Fix Submonoid.mk* lemmas to use ⟨_, _⟩, not ⟨⟨_, _⟩, _⟩.
Diff
@@ -879,16 +879,11 @@ theorem mrange_mk' : MonoidHom.mrange c.mk' = ⊤ :=
 #align con.mrange_mk' Con.mrange_mk'
 #align add_con.mrange_mk' AddCon.mrange_mk'
 
-/-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
-    those in the preimage of `f(x)` under `f`. -/
-@[to_additive "The elements related to `x ∈ M`, `M` an `AddMonoid`, by the kernel of
-an `AddMonoid` homomorphism are those in the preimage of `f(x)` under `f`. "]
-theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
-  Set.ext fun _ =>
-    ⟨fun h => Set.mem_preimage.2 <| Set.mem_singleton_iff.2 h.symm, fun h =>
-      (Set.mem_singleton_iff.1 <| Set.mem_preimage.1 h).symm⟩
-#align con.ker_apply_eq_preimage Con.ker_apply_eq_preimage
-#align add_con.ker_apply_eq_preimage AddCon.ker_apply_eq_preimage
+-- Porting note: used to abuse defeq between sets and predicates
+@[to_additive]
+theorem ker_apply {f : M →* P} {x y} : ker f x y ↔ f x = f y := Iff.rfl
+#noalign con.ker_apply_eq_preimage
+#noalign add_con.ker_apply_eq_preimage
 
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
     relation induced on `N` by `f` equals the kernel of `c`'s quotient homomorphism composed with
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -2,17 +2,14 @@
 Copyright (c) 2019 Amelia Livingston. All rights reserved.
 Released under Apache 2.0 license as described in the file LICENSE.
 Authors: Amelia Livingston
-
-! This file was ported from Lean 3 source module group_theory.congruence
-! leanprover-community/mathlib commit 6cb77a8eaff0ddd100e87b1591c6d3ad319514ff
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
 -/
 import Mathlib.Algebra.Group.Prod
 import Mathlib.Algebra.Hom.Equiv.Basic
 import Mathlib.Data.Setoid.Basic
 import Mathlib.GroupTheory.Submonoid.Operations
 
+#align_import group_theory.congruence from "leanprover-community/mathlib"@"6cb77a8eaff0ddd100e87b1591c6d3ad319514ff"
+
 /-!
 # Congruence relations
 
style: remove unnecessary <| (#5721)
Diff
@@ -257,7 +257,7 @@ variable (c)
 @[to_additive "Defining the quotient by an additive congruence relation of a type with
 an addition."]
 protected def Quotient :=
-  Quotient <| c.toSetoid
+  Quotient c.toSetoid
 #align con.quotient Con.Quotient
 #align add_con.quotient AddCon.Quotient
 
chore: fix focusing dots (#5708)

This PR is the result of running

find . -type f -name "*.lean" -exec sed -i -E 's/^( +)\. /\1· /' {} \;
find . -type f -name "*.lean" -exec sed -i -E 'N;s/^( +·)\n +(.*)$/\1 \2/;P;D' {} \;

which firstly replaces . focusing dots with · and secondly removes isolated instances of such dots, unifying them with the following line. A new rule is placed in the style linter to verify this.

Diff
@@ -512,11 +512,11 @@ theorem conGen_eq (r : M → M → Prop) : conGen r = sInf { s : Con M | ∀ x y
     (le_sInf (fun s hs x y (hxy : (conGen r).r x y) =>
       show s.r x y by
         apply ConGen.Rel.recOn (motive := fun x y _ => s.r x y) hxy
-        . exact fun x y h => hs x y h
-        . exact s.refl'
-        . exact fun _ => s.symm'
-        . exact fun _ _ => s.trans'
-        . exact fun _ _ => s.mul))
+        · exact fun x y h => hs x y h
+        · exact s.refl'
+        · exact fun _ => s.symm'
+        · exact fun _ _ => s.trans'
+        · exact fun _ _ => s.mul))
     (sInf_le ConGen.Rel.of)
 #align con.con_gen_eq Con.conGen_eq
 #align add_con.add_con_gen_eq AddCon.addConGen_eq
@@ -716,10 +716,10 @@ def correspondence : { d // c ≤ d } ≃o Con c.Quotient
           Con.induction_on₂ x y fun w z h => ⟨w, z, rfl, rfl, h⟩⟩
   map_rel_iff' := @fun s t => by
     constructor
-    . intros h x y hs
+    · intros h x y hs
       rcases h ⟨x, y, rfl, rfl, hs⟩ with ⟨a, b, hx, hy, ht⟩
       exact t.1.trans (t.1.symm <| t.2 <| eq_rel.1 hx) (t.1.trans ht (t.2 <| eq_rel.1 hy))
-    . intros h _ _ hs
+    · intros h _ _ hs
       rcases hs with ⟨a, b, hx, hy, Hs⟩
       exact ⟨a, b, hx, hy, h Hs⟩
 #align con.correspondence Con.correspondence
@@ -1305,10 +1305,10 @@ def liftOnUnits (u : Units c.Quotient) (f : ∀ x y : M, c (x * y) 1 → c (y *
       (fun x y x' y' hx hy => _) u.3 u.4
   refine' Function.hfunext _ _
   rw [c.eq.2 hx, c.eq.2 hy]
-  . rintro Hxy Hxy' -
+  · rintro Hxy Hxy' -
     refine' Function.hfunext _ _
     · rw [c.eq.2 hx, c.eq.2 hy]
-    . rintro Hyx Hyx' -
+    · rintro Hyx Hyx' -
       exact heq_of_eq (Hf _ _ _ _ _ _ _ _ hx hy)
 #align con.lift_on_units Con.liftOnUnits
 #align add_con.lift_on_add_units AddCon.liftOnAddUnits
chore: fix grammar in docs (#5668)
Diff
@@ -1241,7 +1241,7 @@ protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
 #align con.zpow Con.zpow
 #align add_con.zsmul AddCon.zsmul
 
-/-- The inversion induced on the quotient by a congruence relation on a type with a
+/-- The inversion induced on the quotient by a congruence relation on a type with an
     inversion. -/
 @[to_additive "The negation induced on the quotient by an additive congruence relation on a type
 with a negation."]
chore: fix backtick in docs (#5077)

I wrote a script to find lines that contain an odd number of backticks

Diff
@@ -959,7 +959,7 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
 
 /-- Homomorphisms on the quotient of a monoid by a congruence relation are equal if they
     are equal on elements that are coercions from the monoid. -/
-@[to_additive "Homomorphisms on the quotient of an AddMonoid` by an additive congruence relation
+@[to_additive "Homomorphisms on the quotient of an `AddMonoid` by an additive congruence relation
 are equal if they are equal on elements that are coercions from the `AddMonoid`."]
 theorem lift_funext (f g : c.Quotient →* P) (h : ∀ a : M, f a = g a) : f = g := by
   rw [← lift_apply_mk' f, ← lift_apply_mk' g]
chore: fix grammar 2/3 (#5002)

Part 2 of #5001

Diff
@@ -1244,7 +1244,7 @@ protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
 /-- The inversion induced on the quotient by a congruence relation on a type with a
     inversion. -/
 @[to_additive "The negation induced on the quotient by an additive congruence relation on a type
-with an negation."]
+with a negation."]
 instance hasInv : Inv c.Quotient :=
   ⟨(Quotient.map' Inv.inv) fun _ _ => c.inv⟩
 #align con.has_inv Con.hasInv
chore: fix many typos (#4967)

These are all doc fixes

Diff
@@ -1110,12 +1110,12 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
 
 /-- The first isomorphism theorem for Monoids in the case of a surjective homomorphism.
 
-For a `computable` version, see `con.quotientKerEquivOfRightOnverse`.
+For a `computable` version, see `Con.quotientKerEquivOfRightInverse`.
 -/
 @[to_additive "The first isomorphism theorem for `AddMonoid`s in the case of a surjective
 homomorphism.
 
-For a `computable` version, see `add_con.quotient_ker_equiv_of_right_inverse`.
+For a `computable` version, see `AddCon.quotientKerEquivOfRightInverse`.
 "]
 noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f) :
     (ker f).Quotient ≃* P :=
chore: tidy various files (#4304)

Co-authored-by: Jeremy Tan Jie Rui <reddeloostw@gmail.com> Co-authored-by: Chris Hughes <chrishughes24@gmail.com>

Diff
@@ -1275,7 +1275,7 @@ instance zpowinst : Pow c.Quotient ℤ :=
 
 /-- The quotient of a group by a congruence relation is a group. -/
 @[to_additive "The quotient of an `AddGroup` by an additive congruence relation is
-an `add_group`."]
+an `AddGroup`."]
 instance group : Group c.Quotient :=
   Function.Surjective.group Quotient.mk''
     Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) (fun _ => rfl)
chore: fix upper/lowercase in comments (#4360)
  • Run a non-interactive version of fix-comments.py on all files.
  • Go through the diff and manually add/discard/edit chunks.
Diff
@@ -314,7 +314,7 @@ protected def liftOn₂ {β} {c : Con M} (q r : c.Quotient) (f : M → M → β)
 #align con.lift_on₂ Con.liftOn₂
 #align add_con.lift_on₂ AddCon.liftOn₂
 
-/-- A version of `quotient.hrec_on₂'` for quotients by `con`. -/
+/-- A version of `Quotient.hrecOn₂'` for quotients by `Con`. -/
 @[to_additive "A version of `quotient.hrec_on₂'` for quotients by `add_con`."]
 protected def hrecOn₂ {cM : Con M} {cN : Con N} {φ : cM.Quotient → cN.Quotient → Sort _}
     (a : cM.Quotient) (b : cN.Quotient) (f : ∀ (x : M) (y : N), φ x y)
@@ -343,7 +343,7 @@ protected theorem induction_on {C : c.Quotient → Prop} (q : c.Quotient) (H : 
 #align con.induction_on Con.induction_on
 #align add_con.induction_on AddCon.induction_on
 
-/-- A version of `con.induction_on` for predicates which take two arguments. -/
+/-- A version of `Con.induction_on` for predicates which take two arguments. -/
 @[to_additive (attr := elab_as_elim) "A version of `add_con.induction_on` for predicates which take
 two arguments."]
 protected theorem induction_on₂ {d : Con N} {C : c.Quotient → d.Quotient → Prop} (p : c.Quotient)
@@ -1313,8 +1313,8 @@ def liftOnUnits (u : Units c.Quotient) (f : ∀ x y : M, c (x * y) 1 → c (y *
 #align con.lift_on_units Con.liftOnUnits
 #align add_con.lift_on_add_units AddCon.liftOnAddUnits
 
-/-- In order to define a function `(con.quotient c)ˣ → α` on the units of `con.quotient c`,
-where `c : con M` is a multiplicative congruence on a monoid, it suffices to define a function `f`
+/-- In order to define a function `(Con.Quotient c)ˣ → α` on the units of `Con.Quotient c`,
+where `c : Con M` is a multiplicative congruence on a monoid, it suffices to define a function `f`
 that takes elements `x y : M` with proofs of `c (x * y) 1` and `c (y * x) 1`, and returns an element
 of `α` provided that `f x y _ _ = f x' y' _ _` whenever `c x x'` and `c y y'`. -/
 add_decl_doc AddCon.liftOnAddUnits
chore: reenable eta, bump to nightly 2023-05-16 (#3414)

Now that leanprover/lean4#2210 has been merged, this PR:

  • removes all the set_option synthInstance.etaExperiment true commands (and some etaExperiment% term elaborators)
  • removes many but not quite all set_option maxHeartbeats commands
  • makes various other changes required to cope with leanprover/lean4#2210.

Co-authored-by: Scott Morrison <scott.morrison@anu.edu.au> Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Matthew Ballard <matt@mrb.email>

Diff
@@ -1157,8 +1157,13 @@ protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
 #align add_con.nsmul AddCon.nsmul
 
 @[to_additive]
-instance {M : Type _} [MulOneClass M] (c : Con M) : One c.Quotient
-    where one := ((1 : M) : c.Quotient)
+instance [MulOneClass M] (c : Con M) : One c.Quotient where
+  -- Using Quotient.mk'' here instead of c.toQuotient
+  -- since c.toQuotient is not reducible.
+  -- This would lead to non-defeq diamonds since this instance ends up in
+  -- quotients modulo ideals.
+  one := Quotient.mk'' (1 : M)
+  -- one := ((1 : M) : c.Quotient)
 
 @[to_additive]
 theorem smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α)
@@ -1272,7 +1277,8 @@ instance zpowinst : Pow c.Quotient ℤ :=
 @[to_additive "The quotient of an `AddGroup` by an additive congruence relation is
 an `add_group`."]
 instance group : Group c.Quotient :=
-  Function.Surjective.group _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) (fun _ => rfl)
+  Function.Surjective.group Quotient.mk''
+    Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) (fun _ => rfl)
     (fun _ _ => rfl) (fun _ _ => rfl) fun _ _ => rfl
 #align con.group Con.group
 #align add_con.add_group AddCon.addGroup
chore: Rename to sSup/iSup (#3938)

As discussed on Zulip

Renames

  • supₛsSup
  • infₛsInf
  • supᵢiSup
  • infᵢiInf
  • bsupₛbsSup
  • binfₛbsInf
  • bsupᵢbiSup
  • binfᵢbiInf
  • csupₛcsSup
  • cinfₛcsInf
  • csupᵢciSup
  • cinfᵢciInf
  • unionₛsUnion
  • interₛsInter
  • unionᵢiUnion
  • interᵢiInter
  • bunionₛbsUnion
  • binterₛbsInter
  • bunionᵢbiUnion
  • binterᵢbiInter

Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>

Diff
@@ -440,23 +440,23 @@ instance : InfSet (Con M) :=
     under the map to the underlying equivalence relation. -/
 @[to_additive "The infimum of a set of additive congruence relations is the same as the infimum of
 the set's image under the map to the underlying equivalence relation."]
-theorem infₛ_toSetoid (S : Set (Con M)) : (infₛ S).toSetoid = infₛ (toSetoid '' S) :=
+theorem sInf_toSetoid (S : Set (Con M)) : (sInf S).toSetoid = sInf (toSetoid '' S) :=
   Setoid.ext' fun x y =>
     ⟨fun h r ⟨c, hS, hr⟩ => by rw [← hr]; exact h c hS, fun h c hS => h c.toSetoid ⟨c, hS, rfl⟩⟩
-#align con.Inf_to_setoid Con.infₛ_toSetoid
-#align add_con.Inf_to_setoid AddCon.infₛ_toSetoid
+#align con.Inf_to_setoid Con.sInf_toSetoid
+#align add_con.Inf_to_setoid AddCon.sInf_toSetoid
 
 /-- The infimum of a set of congruence relations is the same as the infimum of the set's image
     under the map to the underlying binary relation. -/
 @[to_additive "The infimum of a set of additive congruence relations is the same as the infimum
 of the set's image under the map to the underlying binary relation."]
-theorem infₛ_def (S : Set (Con M)) :
-    ⇑(infₛ S) = infₛ (@Set.image (Con M) (M → M → Prop) (↑) S) := by
+theorem sInf_def (S : Set (Con M)) :
+    ⇑(sInf S) = sInf (@Set.image (Con M) (M → M → Prop) (↑) S) := by
   ext
-  simp only [infₛ_image, infᵢ_apply, infᵢ_Prop_eq]
+  simp only [sInf_image, iInf_apply, iInf_Prop_eq]
   rfl
-#align con.Inf_def Con.infₛ_def
-#align add_con.Inf_def AddCon.infₛ_def
+#align con.Inf_def Con.sInf_def
+#align add_con.Inf_def AddCon.sInf_def
 
 @[to_additive]
 instance : PartialOrder (Con M) where
@@ -507,9 +507,9 @@ theorem inf_iff_and {c d : Con M} {x y} : (c ⊓ d) x y ↔ c x y ∧ d x y :=
 @[to_additive addConGen_eq "The inductively defined smallest additive congruence relation
 containing a binary relation `r` equals the infimum of the set of additive congruence relations
 containing `r`."]
-theorem conGen_eq (r : M → M → Prop) : conGen r = infₛ { s : Con M | ∀ x y, r x y → s x y } :=
+theorem conGen_eq (r : M → M → Prop) : conGen r = sInf { s : Con M | ∀ x y, r x y → s x y } :=
   le_antisymm
-    (le_infₛ (fun s hs x y (hxy : (conGen r).r x y) =>
+    (le_sInf (fun s hs x y (hxy : (conGen r).r x y) =>
       show s.r x y by
         apply ConGen.Rel.recOn (motive := fun x y _ => s.r x y) hxy
         . exact fun x y h => hs x y h
@@ -517,7 +517,7 @@ theorem conGen_eq (r : M → M → Prop) : conGen r = infₛ { s : Con M | ∀ x
         . exact fun _ => s.symm'
         . exact fun _ _ => s.trans'
         . exact fun _ _ => s.mul))
-    (infₛ_le ConGen.Rel.of)
+    (sInf_le ConGen.Rel.of)
 #align con.con_gen_eq Con.conGen_eq
 #align add_con.add_con_gen_eq AddCon.addConGen_eq
 
@@ -526,7 +526,7 @@ theorem conGen_eq (r : M → M → Prop) : conGen r = infₛ { s : Con M | ∀ x
 @[to_additive addConGen_le "The smallest additive congruence relation containing a binary
 relation `r` is contained in any additive congruence relation containing `r`."]
 theorem conGen_le {r : M → M → Prop} {c : Con M} (h : ∀ x y, r x y → @Setoid.r _ c.toSetoid x y) :
-    conGen r ≤ c := by rw [conGen_eq]; exact infₛ_le h
+    conGen r ≤ c := by rw [conGen_eq]; exact sInf_le h
 #align con.con_gen_le Con.conGen_le
 #align add_con.add_con_gen_le AddCon.addConGen_le
 
@@ -544,7 +544,7 @@ theorem conGen_mono {r s : M → M → Prop} (h : ∀ x y, r x y → s x y) : co
 @[to_additive (attr := simp) addConGen_of_addCon "Additive congruence relations equal the smallest
 additive congruence relation in which they are contained."]
 theorem conGen_of_con (c : Con M) : conGen c = c :=
-  le_antisymm (by rw [conGen_eq]; exact infₛ_le fun _ _ => id) ConGen.Rel.of
+  le_antisymm (by rw [conGen_eq]; exact sInf_le fun _ _ => id) ConGen.Rel.of
 #align con.con_gen_of_con Con.conGen_of_con
 #align add_con.add_con_gen_of_con AddCon.addConGen_of_addCon
 #align add_con.add_con_gen_of_add_con AddCon.addConGen_of_addCon
@@ -566,7 +566,7 @@ smallest additive congruence relation containing the binary relation '`x` is rel
 by `c` or `d`'."]
 theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x y := by
   rw [conGen_eq]
-  apply congr_arg infₛ
+  apply congr_arg sInf
   simp only [le_def, or_imp, ← forall_and]
 #align con.sup_eq_con_gen Con.sup_eq_conGen
 #align add_con.sup_eq_add_con_gen AddCon.sup_eq_addConGen
@@ -582,30 +582,30 @@ theorem sup_def {c d : Con M} : c ⊔ d = conGen (c.r ⊔ d.r) := by rw [sup_eq_
 /-- The supremum of a set of congruence relations `S` equals the smallest congruence relation
     containing the binary relation 'there exists `c ∈ S` such that `x` is related to `y` by
     `c`'. -/
-@[to_additive supₛ_eq_addConGen "The supremum of a set of additive congruence relations `S` equals
+@[to_additive sSup_eq_addConGen "The supremum of a set of additive congruence relations `S` equals
 the smallest additive congruence relation containing the binary relation 'there exists `c ∈ S`
 such that `x` is related to `y` by `c`'."]
-theorem supₛ_eq_conGen (S : Set (Con M)) :
-    supₛ S = conGen fun x y => ∃ c : Con M, c ∈ S ∧ c x y := by
+theorem sSup_eq_conGen (S : Set (Con M)) :
+    sSup S = conGen fun x y => ∃ c : Con M, c ∈ S ∧ c x y := by
   rw [conGen_eq]
-  apply congr_arg infₛ
+  apply congr_arg sInf
   ext
   exact ⟨fun h _ _ ⟨r, hr⟩ => h hr.1 hr.2, fun h r hS _ _ hr => h _ _ ⟨r, hS, hr⟩⟩
-#align con.Sup_eq_con_gen Con.supₛ_eq_conGen
-#align add_con.Sup_eq_add_con_gen AddCon.supₛ_eq_addConGen
+#align con.Sup_eq_con_gen Con.sSup_eq_conGen
+#align add_con.Sup_eq_add_con_gen AddCon.sSup_eq_addConGen
 
 /-- The supremum of a set of congruence relations is the same as the smallest congruence relation
     containing the supremum of the set's image under the map to the underlying binary relation. -/
 @[to_additive "The supremum of a set of additive congruence relations is the same as the smallest
 additive congruence relation containing the supremum of the set's image under the map to the
 underlying binary relation."]
-theorem supₛ_def {S : Set (Con M)} :
-    supₛ S = conGen (supₛ (@Set.image (Con M) (M → M → Prop) ((⇑) : Con M → M → M → Prop) S)) := by
-  rw [supₛ_eq_conGen, supₛ_image]
+theorem sSup_def {S : Set (Con M)} :
+    sSup S = conGen (sSup (@Set.image (Con M) (M → M → Prop) ((⇑) : Con M → M → M → Prop) S)) := by
+  rw [sSup_eq_conGen, sSup_image]
   congr with (x y)
-  simp only [supₛ_image, supᵢ_apply, supᵢ_Prop_eq, exists_prop, rel_eq_coe]
-#align con.Sup_def Con.supₛ_def
-#align add_con.Sup_def AddCon.supₛ_def
+  simp only [sSup_image, iSup_apply, iSup_Prop_eq, exists_prop, rel_eq_coe]
+#align con.Sup_def Con.sSup_def
+#align add_con.Sup_def AddCon.sSup_def
 
 variable (M)
 
chore: bye-bye, solo bys! (#3825)

This PR puts, with one exception, every single remaining by that lies all by itself on its own line to the previous line, thus matching the current behaviour of start-port.sh. The exception is when the by begins the second or later argument to a tuple or anonymous constructor; see https://github.com/leanprover-community/mathlib4/pull/3825#discussion_r1186702599.

Essentially this is s/\n *by$/ by/g, but with manual editing to satisfy the linter's max-100-char-line requirement. The Python style linter is also modified to catch these "isolated bys".

Diff
@@ -450,8 +450,8 @@ theorem infₛ_toSetoid (S : Set (Con M)) : (infₛ S).toSetoid = infₛ (toSeto
     under the map to the underlying binary relation. -/
 @[to_additive "The infimum of a set of additive congruence relations is the same as the infimum
 of the set's image under the map to the underlying binary relation."]
-theorem infₛ_def (S : Set (Con M)) : ⇑(infₛ S) = infₛ (@Set.image (Con M) (M → M → Prop) (↑) S) :=
-  by
+theorem infₛ_def (S : Set (Con M)) :
+    ⇑(infₛ S) = infₛ (@Set.image (Con M) (M → M → Prop) (↑) S) := by
   ext
   simp only [infₛ_image, infᵢ_apply, infᵢ_Prop_eq]
   rfl
@@ -564,8 +564,7 @@ theorem conGen_idem (r : M → M → Prop) : conGen (conGen r) = conGen r :=
 @[to_additive sup_eq_addConGen "The supremum of additive congruence relations `c, d` equals the
 smallest additive congruence relation containing the binary relation '`x` is related to `y`
 by `c` or `d`'."]
-theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x y :=
-  by
+theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x y := by
   rw [conGen_eq]
   apply congr_arg infₛ
   simp only [le_def, or_imp, ← forall_and]
@@ -586,8 +585,8 @@ theorem sup_def {c d : Con M} : c ⊔ d = conGen (c.r ⊔ d.r) := by rw [sup_eq_
 @[to_additive supₛ_eq_addConGen "The supremum of a set of additive congruence relations `S` equals
 the smallest additive congruence relation containing the binary relation 'there exists `c ∈ S`
 such that `x` is related to `y` by `c`'."]
-theorem supₛ_eq_conGen (S : Set (Con M)) : supₛ S = conGen fun x y => ∃ c : Con M, c ∈ S ∧ c x y :=
-  by
+theorem supₛ_eq_conGen (S : Set (Con M)) :
+    supₛ S = conGen fun x y => ∃ c : Con M, c ∈ S ∧ c x y := by
   rw [conGen_eq]
   apply congr_arg infₛ
   ext
@@ -962,8 +961,7 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
     are equal on elements that are coercions from the monoid. -/
 @[to_additive "Homomorphisms on the quotient of an AddMonoid` by an additive congruence relation
 are equal if they are equal on elements that are coercions from the `AddMonoid`."]
-theorem lift_funext (f g : c.Quotient →* P) (h : ∀ a : M, f a = g a) : f = g :=
-  by
+theorem lift_funext (f g : c.Quotient →* P) (h : ∀ a : M, f a = g a) : f = g := by
   rw [← lift_apply_mk' f, ← lift_apply_mk' g]
   congr 1
   exact FunLike.ext_iff.2 h
@@ -1291,8 +1289,8 @@ that takes elements `x y : M` with proofs of `c (x * y) 1` and `c (y * x) 1`, an
 of `α` provided that `f x y _ _ = f x' y' _ _` whenever `c x x'` and `c y y'`. -/
 @[to_additive]
 def liftOnUnits (u : Units c.Quotient) (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
-    (Hf : ∀ x y hxy hyx x' y' hxy' hyx', c x x' → c y y' → f x y hxy hyx = f x' y' hxy' hyx') : α :=
-  by
+    (Hf : ∀ x y hxy hyx x' y' hxy' hyx',
+      c x x' → c y y' → f x y hxy hyx = f x' y' hxy' hyx') : α := by
   refine'
     @Con.hrecOn₂ M M _ _ c c (fun x y => x * y = 1 → y * x = 1 → α) (u : c.Quotient)
       (↑u⁻¹ : c.Quotient)
Fix: Move more attributes to the attr argument of to_additive (#2558)
Diff
@@ -1324,7 +1324,7 @@ theorem liftOnUnits_mk (f : ∀ x y : M, c (x * y) 1 → c (y * x) 1 → α)
 #align con.lift_on_units_mk Con.liftOnUnits_mk
 #align add_con.lift_on_add_units_mk AddCon.liftOnAddUnits_mk
 
-@[elab_as_elim, to_additive]
+@[to_additive (attr := elab_as_elim)]
 theorem induction_on_units {p : Units c.Quotient → Prop} (u : Units c.Quotient)
     (H : ∀ (x y : M) (hxy : c (x * y) 1) (hyx : c (y * x) 1), p ⟨x, y, c.eq.2 hxy, c.eq.2 hyx⟩) :
     p u := by
fix: replace symmApply by symm_apply (#2560)
Diff
@@ -1105,8 +1105,8 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
     right_inv := fun x => by conv_rhs => rw [← hf x]; rfl }
 #align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverse
 #align add_con.quotient_ker_equiv_of_right_inverse AddCon.quotientKerEquivOfRightInverse
-#align con.quotient_ker_equiv_of_right_inverse_symm_apply Con.quotientKerEquivOfRightInverse_symmApply
-#align add_con.quotient_ker_equiv_of_right_inverse_symm_apply AddCon.quotientKerEquivOfRightInverse_symmApply
+#align con.quotient_ker_equiv_of_right_inverse_symm_apply Con.quotientKerEquivOfRightInverse_symm_apply
+#align add_con.quotient_ker_equiv_of_right_inverse_symm_apply AddCon.quotientKerEquivOfRightInverse_symm_apply
 #align con.quotient_ker_equiv_of_right_inverse_apply Con.quotientKerEquivOfRightInverse_apply
 #align add_con.quotient_ker_equiv_of_right_inverse_apply AddCon.quotientKerEquivOfRightInverse_apply
 
feat: port LinearAlgebra.TensorProduct (#2539)

It was quite smooth. I didn't have to make changes that I expect to change downstream files, so I left few porting notes.

Comments that I didn't make into porting notes:

  • attribute [local ext] ext had to be changed to attribute [local ext high] ext
  • Sometimes M ⊗ N needed to be replaced by M ⊗[R] N in theorem statements.
  • I needed to make a few fixes in other files. I want to go through the library globally and fix this error, but I'm waiting on #1881 to get merged, because those two things would have many merge conflicts.

Co-authored-by: Johan Commelin <johan@commelin.net>

Diff
@@ -336,7 +336,7 @@ variable {c}
 
 /-- The inductive principle used to prove propositions about the elements of a quotient by a
     congruence relation. -/
-@[elab_as_elim, to_additive "The inductive principle used to prove propositions about
+@[to_additive (attr := elab_as_elim) "The inductive principle used to prove propositions about
 the elements of a quotient by an additive congruence relation."]
 protected theorem induction_on {C : c.Quotient → Prop} (q : c.Quotient) (H : ∀ x : M, C x) : C q :=
   Quotient.inductionOn' q H
@@ -344,7 +344,7 @@ protected theorem induction_on {C : c.Quotient → Prop} (q : c.Quotient) (H : 
 #align add_con.induction_on AddCon.induction_on
 
 /-- A version of `con.induction_on` for predicates which take two arguments. -/
-@[elab_as_elim, to_additive "A version of `add_con.induction_on` for predicates which take
+@[to_additive (attr := elab_as_elim) "A version of `add_con.induction_on` for predicates which take
 two arguments."]
 protected theorem induction_on₂ {d : Con N} {C : c.Quotient → d.Quotient → Prop} (p : c.Quotient)
     (q : d.Quotient) (H : ∀ (x : M) (y : N), C x y) : C p q :=
feat: add to_additive linter checking whether additive decl exists (#1881)
  • Force the user to specify whether the additive declaration already exists.
  • Will raise a linter error if the user specified it wrongly
  • Requested on Zulip
Diff
@@ -1173,7 +1173,7 @@ instance _root_.AddCon.Quotient.nsmul {M : Type _} [AddMonoid M] (c : AddCon M)
     where smul n := (Quotient.map' ((· • ·) n)) fun _ _ => c.nsmul n
 #align add_con.quotient.has_nsmul AddCon.Quotient.nsmul
 
-@[to_additive AddCon.Quotient.nsmul]
+@[to_additive existing AddCon.Quotient.nsmul]
 instance {M : Type _} [Monoid M] (c : Con M) : Pow c.Quotient ℕ
     where pow x n := Quotient.map' (fun x => x ^ n) (fun _ _ => c.pow n) x
 
@@ -1265,7 +1265,7 @@ instance _root_.AddCon.Quotient.zsmul {M : Type _} [AddGroup M] (c : AddCon M) :
 
 /-- The integer power induced on the quotient by a congruence relation on a type with a
     division. -/
-@[to_additive AddCon.Quotient.zsmul]
+@[to_additive existing AddCon.Quotient.zsmul]
 instance zpowinst : Pow c.Quotient ℤ :=
   ⟨fun x z => Quotient.map' (fun x => x ^ z) (fun _ _ h => c.zpow z h) x⟩
 #align con.has_zpow Con.zpowinst
feat: to_additive raises linter errors; nested to_additive (#1819)
  • Turn info messages of to_additive into linter errors
  • Allow @[to_additive (attr := to_additive)] to additivize the generated lemma. This is useful for Pow -> SMul -> VAdd lemmas. We can write e.g. @[to_additive (attr := to_additive, simp)] to add the simp attribute to all 3 generated lemmas, and we can provide other options to each to_additive call separately (specifying a name / reorder).
  • The previous point was needed to cleanly get rid of some linter warnings. It also required some additional changes (addToAdditiveAttr now returns a value, turn a few (meta) definitions into mutual partial def, reorder some definitions, generalize additivizeLemmas to lists of more than 2 elements) that should have no visible effects for the user.
Diff
@@ -1150,7 +1150,7 @@ end MulOneClass
 section Monoids
 
 /-- Multiplicative congruence relations preserve natural powers. -/
-@[to_additive AddCon.nsmul "Additive congruence relations preserve natural scaling."]
+@[to_additive "Additive congruence relations preserve natural scaling."]
 protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
     ∀ (n : ℕ) {w x}, c w x → c (w ^ n) (x ^ n)
   | 0, w, x, _ => by simpa using c.refl _
fix: use to_additive (attr := _) here and there (#2073)
Diff
@@ -1093,9 +1093,9 @@ noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* M
 #align add_con.quotient_ker_equiv_range AddCon.quotientKerEquivRange
 
 /-- The first isomorphism theorem for monoids in the case of a homomorphism with right inverse. -/
-@[to_additive "The first isomorphism theorem for `AddMonoid`s in the case of a homomorphism
-with right inverse.",
-  simps]
+@[to_additive (attr := simps)
+  "The first isomorphism theorem for `AddMonoid`s in the case of a homomorphism
+  with right inverse."]
 def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.RightInverse g f) :
     (ker f).Quotient ≃* P :=
   { kerLift f with
@@ -1106,7 +1106,9 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
 #align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverse
 #align add_con.quotient_ker_equiv_of_right_inverse AddCon.quotientKerEquivOfRightInverse
 #align con.quotient_ker_equiv_of_right_inverse_symm_apply Con.quotientKerEquivOfRightInverse_symmApply
+#align add_con.quotient_ker_equiv_of_right_inverse_symm_apply AddCon.quotientKerEquivOfRightInverse_symmApply
 #align con.quotient_ker_equiv_of_right_inverse_apply Con.quotientKerEquivOfRightInverse_apply
+#align add_con.quotient_ker_equiv_of_right_inverse_apply AddCon.quotientKerEquivOfRightInverse_apply
 
 /-- The first isomorphism theorem for Monoids in the case of a surjective homomorphism.
 
chore: add missing #align statements (#1902)

This PR is the result of a slight variant on the following "algorithm"

  • take all mathlib 3 names, remove _ and make all uppercase letters into lowercase
  • take all mathlib 4 names, remove _ and make all uppercase letters into lowercase
  • look for matches, and create pairs (original_lean3_name, OriginalLean4Name)
  • for pairs that do not have an align statement:
    • use Lean 4 to lookup the file + position of the Lean 4 name
    • add an #align statement just before the next empty line
  • manually fix some tiny mistakes (e.g., empty lines in proofs might cause the #align statement to have been inserted too early)
Diff
@@ -547,6 +547,7 @@ theorem conGen_of_con (c : Con M) : conGen c = c :=
   le_antisymm (by rw [conGen_eq]; exact infₛ_le fun _ _ => id) ConGen.Rel.of
 #align con.con_gen_of_con Con.conGen_of_con
 #align add_con.add_con_gen_of_con AddCon.addConGen_of_addCon
+#align add_con.add_con_gen_of_add_con AddCon.addConGen_of_addCon
 
 --Porting note: removing simp, simp can prove it
 /-- The map sending a binary relation to the smallest congruence relation in which it is
@@ -1104,6 +1105,8 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
     right_inv := fun x => by conv_rhs => rw [← hf x]; rfl }
 #align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverse
 #align add_con.quotient_ker_equiv_of_right_inverse AddCon.quotientKerEquivOfRightInverse
+#align con.quotient_ker_equiv_of_right_inverse_symm_apply Con.quotientKerEquivOfRightInverse_symmApply
+#align con.quotient_ker_equiv_of_right_inverse_apply Con.quotientKerEquivOfRightInverse_apply
 
 /-- The first isomorphism theorem for Monoids in the case of a surjective homomorphism.
 
feat: port GroupTheory.GroupAction.Basic (#1845)
Diff
@@ -359,7 +359,7 @@ variable (c)
 @[to_additive (attr := simp) "Two elements are related by an additive congruence relation `c` iff
 they are represented by the same element of the quotient by `c`."]
 protected theorem eq {a b : M} : (a : c.Quotient) = (b : c.Quotient) ↔ c a b :=
-  Quotient.eq'
+  Quotient.eq''
 #align con.eq Con.eq
 #align add_con.eq AddCon.eq
 
@@ -376,7 +376,7 @@ instance hasMul : Mul c.Quotient :=
 @[to_additive (attr := simp) "The kernel of the quotient map induced by an additive congruence
 relation `c` equals `c`."]
 theorem mul_ker_mk_eq : (mulKer ((↑) : M → c.Quotient) fun _ _ => rfl) = c :=
-  ext fun _ _ => Quotient.eq'
+  ext fun _ _ => Quotient.eq''
 #align con.mul_ker_mk_eq Con.mul_ker_mk_eq
 #align add_con.add_ker_mk_eq AddCon.add_ker_mk_eq
 
chore: add #align statements for to_additive decls (#1816)

Co-authored-by: Floris van Doorn <fpvdoorn@gmail.com>

Diff
@@ -798,22 +798,26 @@ instance toSubmonoid : Coe (Con M) (Submonoid (M × M)) :=
 theorem mem_coe {c : Con M} {x y} : (x, y) ∈ (↑c : Submonoid (M × M)) ↔ (x, y) ∈ c :=
   Iff.rfl
 #align con.mem_coe Con.mem_coe
+#align add_con.mem_coe AddCon.mem_coe
 
 @[to_additive]
 theorem to_submonoid_inj (c d : Con M) (H : (c : Submonoid (M × M)) = d) : c = d :=
   ext <| fun x y => show (x, y) ∈ c.submonoid ↔ (x, y) ∈ d from H ▸ Iff.rfl
 #align con.to_submonoid_inj Con.to_submonoid_inj
+#align add_con.to_add_submonoid_inj AddCon.to_addSubmonoid_inj
 
 @[to_additive]
 theorem le_iff {c d : Con M} : c ≤ d ↔ (c : Submonoid (M × M)) ≤ d :=
   ⟨fun h _ H => h H, fun h x y hc => h <| show (x, y) ∈ c from hc⟩
 #align con.le_iff Con.le_iff
+#align add_con.le_iff AddCon.le_iff
 
 /-- The kernel of a monoid homomorphism as a congruence relation. -/
 @[to_additive "The kernel of an `AddMonoid` homomorphism as an additive congruence relation."]
 def ker (f : M →* P) : Con M :=
   mulKer f (map_mul f)
 #align con.ker Con.ker
+#align add_con.ker AddCon.ker
 
 /-- The definition of the congruence relation defined by a monoid homomorphism's kernel. -/
 @[to_additive (attr := simp) "The definition of the additive congruence relation defined by an
@@ -821,6 +825,7 @@ def ker (f : M →* P) : Con M :=
 theorem ker_rel (f : M →* P) {x y} : ker f x y ↔ f x = f y :=
   Iff.rfl
 #align con.ker_rel Con.ker_rel
+#align add_con.ker_rel AddCon.ker_rel
 
 /-- There exists an element of the quotient of a monoid by a congruence relation (namely 1). -/
 @[to_additive "There exists an element of the quotient of an `AddMonoid` by a congruence relation
@@ -828,6 +833,7 @@ theorem ker_rel (f : M →* P) {x y} : ker f x y ↔ f x = f y :=
 instance Quotient.inhabited : Inhabited c.Quotient :=
   ⟨((1 : M) : c.Quotient)⟩
 #align con.quotient.inhabited Con.Quotient.inhabited
+#align add_con.quotient.inhabited AddCon.Quotient.inhabited
 
 variable (c)
 
@@ -839,6 +845,7 @@ def mk' : M →* c.Quotient :=
     map_one' := rfl
     map_mul' := fun _ _ => rfl }
 #align con.mk' Con.mk'
+#align add_con.mk' AddCon.mk'
 
 variable (x y : M)
 
@@ -849,6 +856,7 @@ quotient by an additive congruence relation `c` equals `c`."]
 theorem mk'_ker : ker c.mk' = c :=
   ext fun _ _ => c.eq
 #align con.mk'_ker Con.mk'_ker
+#align add_con.mk'_ker AddCon.mk'_ker
 
 variable {c}
 
@@ -859,17 +867,20 @@ relation is surjective."]
 theorem mk'_surjective : Surjective c.mk' :=
   Quotient.surjective_Quotient_mk''
 #align con.mk'_surjective Con.mk'_surjective
+#align add_con.mk'_surjective AddCon.mk'_surjective
 
 @[to_additive (attr := simp)]
 theorem coe_mk' : (c.mk' : M → c.Quotient) = ((↑) : M → c.Quotient) :=
   rfl
 #align con.coe_mk' Con.coe_mk'
+#align add_con.coe_mk' AddCon.coe_mk'
 
 @[to_additive (attr := simp)]
 --Porting note: removed dot notation
 theorem mrange_mk' : MonoidHom.mrange c.mk' = ⊤ :=
   MonoidHom.mrange_top_iff_surjective.2 mk'_surjective
 #align con.mrange_mk' Con.mrange_mk'
+#align add_con.mrange_mk' AddCon.mrange_mk'
 
 /-- The elements related to `x ∈ M`, `M` a monoid, by the kernel of a monoid homomorphism are
     those in the preimage of `f(x)` under `f`. -/
@@ -880,6 +891,7 @@ theorem ker_apply_eq_preimage {f : M →* P} (x) : (ker f) x = f ⁻¹' {f x} :=
     ⟨fun h => Set.mem_preimage.2 <| Set.mem_singleton_iff.2 h.symm, fun h =>
       (Set.mem_singleton_iff.1 <| Set.mem_preimage.1 h).symm⟩
 #align con.ker_apply_eq_preimage Con.ker_apply_eq_preimage
+#align add_con.ker_apply_eq_preimage AddCon.ker_apply_eq_preimage
 
 /-- Given a monoid homomorphism `f : N → M` and a congruence relation `c` on `M`, the congruence
     relation induced on `N` by `f` equals the kernel of `c`'s quotient homomorphism composed with
@@ -890,6 +902,7 @@ quotient homomorphism composed with `f`."]
 theorem comap_eq {f : N →* M} : comap f f.map_mul c = ker (c.mk'.comp f) :=
   ext fun x y => show c _ _ ↔ c.mk' _ = c.mk' _ by rw [← c.eq]; rfl
 #align con.comap_eq Con.comap_eq
+#align add_con.comap_eq AddCon.comap_eq
 
 variable (c) (f : M →* P)
 
@@ -905,6 +918,7 @@ def lift (H : c ≤ ker f) : c.Quotient →* P
     dsimp only [← coe_mul, Con.liftOn_coe]
     rw [map_mul]
 #align con.lift Con.lift
+#align add_con.lift AddCon.lift
 
 variable {c f}
 
@@ -914,6 +928,7 @@ commutes."]
 theorem lift_mk' (H : c ≤ ker f) (x) : c.lift f H (c.mk' x) = f x :=
   rfl
 #align con.lift_mk' Con.lift_mk'
+#align add_con.lift_mk' AddCon.lift_mk'
 
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[to_additive (attr := simp) "The diagram describing the universal property for quotients of
@@ -921,12 +936,14 @@ theorem lift_mk' (H : c ≤ ker f) (x) : c.lift f H (c.mk' x) = f x :=
 theorem lift_coe (H : c ≤ ker f) (x : M) : c.lift f H x = f x :=
   rfl
 #align con.lift_coe Con.lift_coe
+#align add_con.lift_coe AddCon.lift_coe
 
 /-- The diagram describing the universal property for quotients of monoids commutes. -/
 @[to_additive (attr := simp) "The diagram describing the universal property for quotients of
 `AddMonoid`s commutes."]
 theorem lift_comp_mk' (H : c ≤ ker f) : (c.lift f H).comp c.mk' = f := by ext; rfl
 #align con.lift_comp_mk' Con.lift_comp_mk'
+#align add_con.lift_comp_mk' AddCon.lift_comp_mk'
 
 /-- Given a homomorphism `f` from the quotient of a monoid by a congruence relation, `f` equals the
     homomorphism on the quotient induced by `f` composed with the natural map from the monoid to
@@ -938,6 +955,7 @@ theorem lift_apply_mk' (f : c.Quotient →* P) :
     (c.lift (f.comp c.mk') fun x y h => show f ↑x = f ↑y by rw [c.eq.2 h]) = f := by
   ext x; rcases x with ⟨⟩; rfl
 #align con.lift_apply_mk' Con.lift_apply_mk'
+#align add_con.lift_apply_mk' AddCon.lift_apply_mk'
 
 /-- Homomorphisms on the quotient of a monoid by a congruence relation are equal if they
     are equal on elements that are coercions from the monoid. -/
@@ -949,6 +967,7 @@ theorem lift_funext (f g : c.Quotient →* P) (h : ∀ a : M, f a = g a) : f = g
   congr 1
   exact FunLike.ext_iff.2 h
 #align con.lift_funext Con.lift_funext
+#align add_con.lift_funext AddCon.lift_funext
 
 /-- The uniqueness part of the universal property for quotients of monoids. -/
 @[to_additive "The uniqueness part of the universal property for quotients of `AddMonoid`s."]
@@ -958,6 +977,7 @@ theorem lift_unique (H : c ≤ ker f) (g : c.Quotient →* P) (Hg : g.comp c.mk'
     subst f
     rfl
 #align con.lift_unique Con.lift_unique
+#align add_con.lift_unique AddCon.lift_unique
 
 /-- Given a congruence relation `c` on a monoid and a homomorphism `f` constant on `c`'s
     equivalence classes, `f` has the same image as the homomorphism that `f` induces on the
@@ -968,6 +988,7 @@ on the quotient."]
 theorem lift_range (H : c ≤ ker f) : MonoidHom.mrange (c.lift f H) = MonoidHom.mrange f :=
   Submonoid.ext fun x => ⟨by rintro ⟨⟨y⟩, hy⟩; exact ⟨y, hy⟩, fun ⟨y, hy⟩ => ⟨↑y, hy⟩⟩
 #align con.lift_range Con.lift_range
+#align add_con.lift_range AddCon.lift_range
 
 /-- Surjective monoid homomorphisms constant on a congruence relation `c`'s equivalence classes
     induce a surjective homomorphism on `c`'s quotient. -/
@@ -977,6 +998,7 @@ theorem lift_surjective_of_surjective (h : c ≤ ker f) (hf : Surjective f) :
     Surjective (c.lift f h) := fun y =>
   (Exists.elim (hf y)) fun w hw => ⟨w, (lift_mk' h w).symm ▸ hw⟩
 #align con.lift_surjective_of_surjective Con.lift_surjective_of_surjective
+#align add_con.lift_surjective_of_surjective AddCon.lift_surjective_of_surjective
 
 variable (c f)
 
@@ -988,6 +1010,7 @@ to `P` is injective."]
 theorem ker_eq_lift_of_injective (H : c ≤ ker f) (h : Injective (c.lift f H)) : ker f = c :=
   toSetoid_inj <| Setoid.ker_eq_lift_of_injective f H h
 #align con.ker_eq_lift_of_injective Con.ker_eq_lift_of_injective
+#align add_con.ker_eq_lift_of_injective AddCon.ker_eq_lift_of_injective
 
 variable {c}
 
@@ -997,6 +1020,7 @@ of an `AddMonoid` homomorphism."]
 def kerLift : (ker f).Quotient →* P :=
   ((ker f).lift f) fun _ _ => id
 #align con.ker_lift Con.kerLift
+#align add_con.ker_lift AddCon.kerLift
 
 variable {f}
 
@@ -1008,6 +1032,7 @@ commutes."]
 theorem kerLift_mk (x : M) : kerLift f x = f x :=
   rfl
 #align con.ker_lift_mk Con.kerLift_mk
+#align add_con.ker_lift_mk AddCon.kerLift_mk
 
 /-- Given a monoid homomorphism `f`, the induced homomorphism on the quotient by `f`'s kernel has
     the same image as `f`. -/
@@ -1016,6 +1041,7 @@ on the quotient by `f`'s kernel has the same image as `f`."]
 theorem kerLift_range_eq : MonoidHom.mrange (kerLift f) = MonoidHom.mrange f :=
   lift_range fun _ _ => id
 #align con.ker_lift_range_eq Con.kerLift_range_eq
+#align add_con.ker_lift_range_eq AddCon.kerLift_range_eq
 
 /-- A monoid homomorphism `f` induces an injective homomorphism on the quotient by `f`'s kernel. -/
 @[to_additive "An `AddMonoid` homomorphism `f` induces an injective homomorphism on the quotient
@@ -1023,6 +1049,7 @@ by `f`'s kernel."]
 theorem kerLift_injective (f : M →* P) : Injective (kerLift f) := fun x y =>
   Quotient.inductionOn₂' x y fun _ _ => (ker f).eq.2
 #align con.ker_lift_injective Con.kerLift_injective
+#align add_con.ker_lift_injective AddCon.kerLift_injective
 
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, `d`'s quotient
     map induces a homomorphism from the quotient by `c` to the quotient by `d`. -/
@@ -1032,6 +1059,7 @@ by `d`."]
 def map (c d : Con M) (h : c ≤ d) : c.Quotient →* d.Quotient :=
   (c.lift d.mk') fun x y hc => show (ker d.mk') x y from (mk'_ker d).symm ▸ h hc
 #align con.map Con.map
+#align add_con.map AddCon.map
 
 /-- Given congruence relations `c, d` on a monoid such that `d` contains `c`, the definition of
     the homomorphism from the quotient by `c` to the quotient by `d` induced by `d`'s quotient
@@ -1043,6 +1071,7 @@ theorem map_apply {c d : Con M} (h : c ≤ d) (x) :
     c.map d h x = c.lift d.mk' (fun _ _ hc => d.eq.2 <| h hc) x :=
   rfl
 #align con.map_apply Con.map_apply
+#align add_con.map_apply AddCon.map_apply
 
 variable (c)
 
@@ -1060,6 +1089,7 @@ noncomputable def quotientKerEquivRange (f : M →* P) : (ker f).Quotient ≃* M
           fun ⟨w, z, hz⟩ => ⟨z, by rcases hz with ⟨⟩; rfl⟩⟩) with
     map_mul' := MonoidHom.map_mul _ }
 #align con.quotient_ker_equiv_range Con.quotientKerEquivRange
+#align add_con.quotient_ker_equiv_range AddCon.quotientKerEquivRange
 
 /-- The first isomorphism theorem for monoids in the case of a homomorphism with right inverse. -/
 @[to_additive "The first isomorphism theorem for `AddMonoid`s in the case of a homomorphism
@@ -1073,6 +1103,7 @@ def quotientKerEquivOfRightInverse (f : M →* P) (g : P → M) (hf : Function.R
     left_inv := fun x => kerLift_injective _ (by rw [Function.comp_apply, kerLift_mk, hf])
     right_inv := fun x => by conv_rhs => rw [← hf x]; rfl }
 #align con.quotient_ker_equiv_of_right_inverse Con.quotientKerEquivOfRightInverse
+#align add_con.quotient_ker_equiv_of_right_inverse AddCon.quotientKerEquivOfRightInverse
 
 /-- The first isomorphism theorem for Monoids in the case of a surjective homomorphism.
 
@@ -1087,6 +1118,7 @@ noncomputable def quotientKerEquivOfSurjective (f : M →* P) (hf : Surjective f
     (ker f).Quotient ≃* P :=
   quotientKerEquivOfRightInverse _ _ hf.hasRightInverse.choose_spec
 #align con.quotient_ker_equiv_of_surjective Con.quotientKerEquivOfSurjective
+#align add_con.quotient_ker_equiv_of_surjective AddCon.quotientKerEquivOfSurjective
 
 /-- The second isomorphism theorem for monoids. -/
 @[to_additive "The second isomorphism theorem for `AddMonoid`s."]
@@ -1094,6 +1126,7 @@ noncomputable def comapQuotientEquiv (f : N →* M) :
     (comap f f.map_mul c).Quotient ≃* MonoidHom.mrange (c.mk'.comp f) :=
   (Con.congr comap_eq).trans <| quotientKerEquivRange <| c.mk'.comp f
 #align con.comap_quotient_equiv Con.comapQuotientEquiv
+#align add_con.comap_quotient_equiv AddCon.comapQuotientEquiv
 
 /-- The third isomorphism theorem for monoids. -/
 @[to_additive "The third isomorphism theorem for `AddMonoid`s."]
@@ -1105,6 +1138,7 @@ def quotientQuotientEquivQuotient (c d : Con M) (h : c ≤ d) :
         Con.induction_on₂ w z fun a b =>
           show _ = d.mk' a * d.mk' b by rw [← d.mk'.map_mul]; rfl }
 #align con.quotient_quotient_equiv_quotient Con.quotientQuotientEquivQuotient
+#align add_con.quotient_quotient_equiv_quotient AddCon.quotientQuotientEquivQuotient
 
 end MulOneClass
 
@@ -1117,6 +1151,7 @@ protected theorem pow {M : Type _} [Monoid M] (c : Con M) :
   | 0, w, x, _ => by simpa using c.refl _
   | Nat.succ n, w, x, h => by simpa [pow_succ] using c.mul h (Con.pow c n h)
 #align con.pow Con.pow
+#align add_con.nsmul AddCon.nsmul
 
 @[to_additive]
 instance {M : Type _} [MulOneClass M] (c : Con M) : One c.Quotient
@@ -1127,6 +1162,7 @@ theorem smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M]
     {w x : M} (h : c w x) : c (a • w) (a • x) := by
   simpa only [smul_one_mul] using c.mul (c.refl' (a • (1 : M) : M)) h
 #align con.smul Con.smul
+#align add_con.vadd AddCon.vadd
 
 instance _root_.AddCon.Quotient.nsmul {M : Type _} [AddMonoid M] (c : AddCon M) : SMul ℕ c.Quotient
     where smul n := (Quotient.map' ((· • ·) n)) fun _ _ => c.nsmul n
@@ -1142,6 +1178,7 @@ an `AddSemigroup`."]
 instance semigroup {M : Type _} [Semigroup M] (c : Con M) : Semigroup c.Quotient :=
   Function.Surjective.semigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
 #align con.semigroup Con.semigroup
+#align add_con.add_semigroup AddCon.addSemigroup
 
 /-- The quotient of a commutative semigroup by a congruence relation is a semigroup. -/
 @[to_additive "The quotient of an `AddCommSemigroup` by an additive congruence relation is
@@ -1149,6 +1186,7 @@ an `AddSemigroup`."]
 instance commSemigroup {M : Type _} [CommSemigroup M] (c : Con M) : CommSemigroup c.Quotient :=
   Function.Surjective.commSemigroup _ Quotient.surjective_Quotient_mk'' fun _ _ => rfl
 #align con.comm_semigroup Con.commSemigroup
+#align add_con.add_comm_semigroup AddCon.addCommSemigroup
 
 /-- The quotient of a monoid by a congruence relation is a monoid. -/
 @[to_additive "The quotient of an `AddMonoid` by an additive congruence relation is
@@ -1156,6 +1194,7 @@ an `AddMonoid`."]
 instance monoid {M : Type _} [Monoid M] (c : Con M) : Monoid c.Quotient :=
   Function.Surjective.monoid _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) fun _ _ => rfl
 #align con.monoid Con.monoid
+#align add_con.add_monoid AddCon.addMonoid
 
 /-- The quotient of a `CommMonoid` by a congruence relation is a `CommMonoid`. -/
 @[to_additive "The quotient of an `AddCommMonoid` by an additive congruence
@@ -1164,6 +1203,7 @@ instance commMonoid {M : Type _} [CommMonoid M] (c : Con M) : CommMonoid c.Quoti
   Function.Surjective.commMonoid _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) fun _ _ =>
     rfl
 #align con.comm_monoid Con.commMonoid
+#align add_con.add_comm_monoid AddCon.addCommMonoid
 
 end Monoids
 
@@ -1176,12 +1216,14 @@ variable [Group M] [Group N] [Group P] (c : Con M)
 protected theorem inv : ∀ {w x}, c w x → c w⁻¹ x⁻¹ := @fun x y h => by
   simpa using c.symm (c.mul (c.mul (c.refl x⁻¹) h) (c.refl y⁻¹))
 #align con.inv Con.inv
+#align add_con.neg AddCon.neg
 
 /-- Multiplicative congruence relations preserve division. -/
 @[to_additive "Additive congruence relations preserve subtraction."]
 protected theorem div : ∀ {w x y z}, c w x → c y z → c (w / y) (x / z) := @fun w x y z h1 h2 => by
   simpa only [div_eq_mul_inv] using c.mul h1 (c.inv h2)
 #align con.div Con.div
+#align add_con.sub AddCon.sub
 
 /-- Multiplicative congruence relations preserve integer powers. -/
 @[to_additive "Additive congruence relations preserve integer scaling."]
@@ -1189,6 +1231,7 @@ protected theorem zpow : ∀ (n : ℤ) {w x}, c w x → c (w ^ n) (x ^ n)
   | Int.ofNat n, w, x, h => by simpa only [zpow_ofNat, Int.ofNat_eq_coe] using c.pow n h
   | Int.negSucc n, w, x, h => by simpa only [zpow_negSucc] using c.inv (c.pow _ h)
 #align con.zpow Con.zpow
+#align add_con.zsmul AddCon.zsmul
 
 /-- The inversion induced on the quotient by a congruence relation on a type with a
     inversion. -/
@@ -1197,6 +1240,7 @@ with an negation."]
 instance hasInv : Inv c.Quotient :=
   ⟨(Quotient.map' Inv.inv) fun _ _ => c.inv⟩
 #align con.has_inv Con.hasInv
+#align add_con.has_neg AddCon.hasNeg
 
 /-- The division induced on the quotient by a congruence relation on a type with a
     division. -/
@@ -1205,6 +1249,7 @@ with a subtraction."]
 instance hasDiv : Div c.Quotient :=
   ⟨(Quotient.map₂' (· / ·)) fun _ _ h₁ _ _ h₂ => c.div h₁ h₂⟩
 #align con.has_div Con.hasDiv
+#align add_con.has_sub AddCon.hasSub
 
 /-- The integer scaling induced on the quotient by a congruence relation on a type with a
     subtraction. -/
@@ -1227,6 +1272,7 @@ instance group : Group c.Quotient :=
   Function.Surjective.group _ Quotient.surjective_Quotient_mk'' rfl (fun _ _ => rfl) (fun _ => rfl)
     (fun _ _ => rfl) (fun _ _ => rfl) fun _ _ => rfl
 #align con.group Con.group
+#align add_con.add_group AddCon.addGroup
 
 end Groups
 
@@ -1280,6 +1326,7 @@ theorem induction_on_units {p : Units c.Quotient → Prop} (u : Units c.Quotient
   rcases u with ⟨⟨x⟩, ⟨y⟩, h₁, h₂⟩
   exact H x y (c.eq.1 h₁) (c.eq.1 h₂)
 #align con.induction_on_units Con.induction_on_units
+#align add_con.induction_on_add_units AddCon.induction_on_addUnits
 
 end Units
 
@@ -1289,12 +1336,14 @@ section Actions
 instance smulinst {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
     SMul α c.Quotient where smul a := (Quotient.map' ((· • ·) a)) fun _ _ => c.smul a
 #align con.has_smul Con.smulinst
+#align add_con.has_vadd AddCon.smulinst
 
 @[to_additive]
 theorem coe_smul {α M : Type _} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M)
     (a : α) (x : M) : (↑(a • x) : c.Quotient) = a • (x : c.Quotient) :=
   rfl
 #align con.coe_smul Con.coe_smul
+#align add_con.coe_vadd AddCon.coe_vadd
 
 @[to_additive]
 instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M] [IsScalarTower α M M]
@@ -1304,6 +1353,7 @@ instance mulAction {α M : Type _} [Monoid α] [MulOneClass M] [MulAction α M]
   one_smul := Quotient.ind' fun _ => congr_arg Quotient.mk'' <| one_smul _ _
   mul_smul _ _ := Quotient.ind' fun _ => congr_arg Quotient.mk'' <| mul_smul _ _ _
 #align con.mul_action Con.mulAction
+#align add_con.add_action AddCon.addAction
 
 instance mulDistribMulAction {α M : Type _} [Monoid α] [Monoid M] [MulDistribMulAction α M]
     [IsScalarTower α M M] (c : Con M) : MulDistribMulAction α c.Quotient :=
fix: to_additive translates constructors of inductive types (#1783)

Zulip

Diff
@@ -102,9 +102,6 @@ inductive ConGen.Rel [Mul M] (r : M → M → Prop) : M → M → Prop
   | mul : ∀ {w x y z}, ConGen.Rel r w x → ConGen.Rel r y z → ConGen.Rel r (w * y) (x * z)
 #align con_gen.rel ConGen.Rel
 
-attribute [to_additive] ConGen.Rel.of ConGen.Rel.refl ConGen.Rel.symm ConGen.Rel.trans
-  ConGen.Rel.mul
-
 /-- The inductively defined smallest multiplicative congruence relation containing a given binary
     relation. -/
 @[to_additive addConGen "The inductively defined smallest additive congruence relation containing
chore: fix most phantom #aligns (#1794)
Diff
@@ -112,7 +112,7 @@ a given binary relation."]
 def conGen [Mul M] (r : M → M → Prop) : Con M :=
   ⟨⟨ConGen.Rel r, ⟨ConGen.Rel.refl, ConGen.Rel.symm, ConGen.Rel.trans⟩⟩, ConGen.Rel.mul⟩
 #align con_gen conGen
-#align add_con_get addConGen
+#align add_con_gen addConGen
 
 namespace Con
 
@@ -164,7 +164,7 @@ protected theorem trans {x y z} : c x y → c y z → c x z := c.toSetoid.trans'
 @[to_additive "Additive congruence relations preserve addition."]
 protected theorem mul {w x y z} : c w x → c y z → c (w * y) (x * z) := c.mul'
 #align con.mul Con.mul
-#align add_con.mul AddCon.add
+#align add_con.add AddCon.add
 
 @[to_additive (attr := simp)]
 theorem rel_mk {s : Setoid M} {h a b} : Con.mk s h a b ↔ r a b :=
@@ -522,7 +522,7 @@ theorem conGen_eq (r : M → M → Prop) : conGen r = infₛ { s : Con M | ∀ x
         . exact fun _ _ => s.mul))
     (infₛ_le ConGen.Rel.of)
 #align con.con_gen_eq Con.conGen_eq
-#align add_con.con_gen_eq AddCon.addConGen_eq
+#align add_con.add_con_gen_eq AddCon.addConGen_eq
 
 /-- The smallest congruence relation containing a binary relation `r` is contained in any
     congruence relation containing `r`. -/
@@ -531,7 +531,7 @@ relation `r` is contained in any additive congruence relation containing `r`."]
 theorem conGen_le {r : M → M → Prop} {c : Con M} (h : ∀ x y, r x y → @Setoid.r _ c.toSetoid x y) :
     conGen r ≤ c := by rw [conGen_eq]; exact infₛ_le h
 #align con.con_gen_le Con.conGen_le
-#align add_con.con_gen_le AddCon.addConGen_le
+#align add_con.add_con_gen_le AddCon.addConGen_le
 
 /-- Given binary relations `r, s` with `r` contained in `s`, the smallest congruence relation
     containing `s` contains the smallest congruence relation containing `r`. -/
@@ -541,7 +541,7 @@ relation containing `r`."]
 theorem conGen_mono {r s : M → M → Prop} (h : ∀ x y, r x y → s x y) : conGen r ≤ conGen s :=
   conGen_le fun x y hr => ConGen.Rel.of _ _ <| h x y hr
 #align con.con_gen_mono Con.conGen_mono
-#align add_con.con_gen_mono AddCon.addConGen_mono
+#align add_con.add_con_gen_mono AddCon.addConGen_mono
 
 /-- Congruence relations equal the smallest congruence relation in which they are contained. -/
 @[to_additive (attr := simp) addConGen_of_addCon "Additive congruence relations equal the smallest
@@ -549,7 +549,7 @@ additive congruence relation in which they are contained."]
 theorem conGen_of_con (c : Con M) : conGen c = c :=
   le_antisymm (by rw [conGen_eq]; exact infₛ_le fun _ _ => id) ConGen.Rel.of
 #align con.con_gen_of_con Con.conGen_of_con
-#align add_con.con_gen_of_con AddCon.addConGen_of_addCon
+#align add_con.add_con_gen_of_con AddCon.addConGen_of_addCon
 
 --Porting note: removing simp, simp can prove it
 /-- The map sending a binary relation to the smallest congruence relation in which it is
@@ -559,7 +559,7 @@ congruence relation in which it is contained is idempotent."]
 theorem conGen_idem (r : M → M → Prop) : conGen (conGen r) = conGen r :=
   conGen_of_con _
 #align con.con_gen_idem Con.conGen_idem
-#align add_con.con_gen_idem AddCon.addConGen_idem
+#align add_con.add_con_gen_idem AddCon.addConGen_idem
 
 /-- The supremum of congruence relations `c, d` equals the smallest congruence relation containing
     the binary relation '`x` is related to `y` by `c` or `d`'. -/
@@ -572,7 +572,7 @@ theorem sup_eq_conGen (c d : Con M) : c ⊔ d = conGen fun x y => c x y ∨ d x
   apply congr_arg infₛ
   simp only [le_def, or_imp, ← forall_and]
 #align con.sup_eq_con_gen Con.sup_eq_conGen
-#align add_con.sup_eq_con_gen AddCon.sup_eq_addConGen
+#align add_con.sup_eq_add_con_gen AddCon.sup_eq_addConGen
 
 /-- The supremum of two congruence relations equals the smallest congruence relation containing
     the supremum of the underlying binary operations. -/
@@ -595,7 +595,7 @@ theorem supₛ_eq_conGen (S : Set (Con M)) : supₛ S = conGen fun x y => ∃ c
   ext
   exact ⟨fun h _ _ ⟨r, hr⟩ => h hr.1 hr.2, fun h r hS _ _ hr => h _ _ ⟨r, hS, hr⟩⟩
 #align con.Sup_eq_con_gen Con.supₛ_eq_conGen
-#align add_con.Sup_eq_con_gen AddCon.supₛ_eq_addConGen
+#align add_con.Sup_eq_add_con_gen AddCon.supₛ_eq_addConGen
 
 /-- The supremum of a set of congruence relations is the same as the smallest congruence relation
     containing the supremum of the set's image under the map to the underlying binary relation. -/
feat: port GroupTheory/Congruence (#1316)

wip

Co-authored-by: Yury G. Kudryashov <urkud@urkud.name> Co-authored-by: ChrisHughes24 <chrishughes24@gmail.com>

Dependencies 2 + 93

94 files ported (97.9%)
49569 lines ported (99.7%)
Show graph

The unported dependencies are