group_theory.congruence
⟷
Mathlib.GroupTheory.Congruence
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.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -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 /-
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -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"
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -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
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/32a7e535287f9c73f2e4d2aef306a39190f0b504
@@ -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 /-
mathlib commit https://github.com/leanprover-community/mathlib/commit/d11f435d4e34a6cea0a1797d6b625b0c170be845
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/95a87616d63b3cb49d3fe678d416fbe9c4217bf4
@@ -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."]
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -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ₓ'. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -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)
mathlib commit https://github.com/leanprover-community/mathlib/commit/38f16f960f5006c6c0c2bac7b0aba5273188f4e5
@@ -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."]
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -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. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
@@ -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]
A mix of various changes; generated with a script and manually tweaked.
@@ -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⟩
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 notnpowRec n x * x
in the definition to make sure that definitional unfolding ofnpowRec
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.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
.@@ -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
Some small changes to adapt to the 2024-03-16 nightly that can land in advance.
@@ -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⟩
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
@@ -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
@@ -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`
Homogenises porting notes via capitalisation and addition of whitespace.
It makes the following changes:
@@ -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'
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.
@@ -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
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 def
s or abbrev
s.
@@ -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, _⟩, _⟩
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>
@@ -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
@@ -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
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
@@ -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
(· op ·) a
by (a op ·)
(#8843)
I used the regex \(\(· (.) ·\) (.)\)
, replacing with ($2 $1 ·)
.
@@ -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
[@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>
@@ -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))
@@ -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 :=
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.
@@ -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]
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
@@ -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
@@ -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
Monoid.Coprod
(#2214)
Monoid.Coprod
.@[to_additive]
.@@ -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
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.
@@ -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
@@ -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
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -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 := (· • ·)
@@ -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)
Set
defeq abuse, golf (#6114)
{x | p x}
instead of fun x ↦ p x
to define a set here and there.Con.ker_apply_eq_preimage
with Con.ker_apply
. The old version used to abuse definitional equality between Set M
and M → Prop
.Submonoid.mk*
lemmas to use ⟨_, _⟩
, not ⟨⟨_, _⟩, _⟩
.@@ -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
@@ -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
@@ -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
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.
@@ -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
@@ -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."]
I wrote a script to find lines that contain an odd number of backticks
@@ -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]
@@ -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
@@ -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 :=
@@ -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)
fix-comments.py
on all files.@@ -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
Now that leanprover/lean4#2210 has been merged, this PR:
set_option synthInstance.etaExperiment true
commands (and some etaExperiment%
term elaborators)set_option maxHeartbeats
commandsCo-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>
@@ -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
sSup
/iSup
(#3938)
As discussed on Zulip
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>
@@ -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)
by
s! (#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 by
s".
@@ -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)
@@ -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
@@ -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
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
M ⊗ N
needed to be replaced by M ⊗[R] N
in theorem statements.Co-authored-by: Johan Commelin <johan@commelin.net>
@@ -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 :=
@@ -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
to_additive
into linter errors@[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).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.@@ -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 _
@@ -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.
This PR is the result of a slight variant on the following "algorithm"
_
and make all uppercase letters into lowercase_
and make all uppercase letters into lowercase(original_lean3_name, OriginalLean4Name)
#align
statement just before the next empty line#align
statement to have been inserted too early)@@ -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.
@@ -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
@@ -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 :=
@@ -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
@@ -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. -/
The unported dependencies are