Documentation

Mathlib.GroupTheory.Congruence

Congruence relations #

This file defines congruence relations: equivalence relations that preserve a binary operation, which in this case is multiplication or addition. The principal definition is a structure extending a Setoid (an equivalence relation), and the inductive definition of the smallest congruence relation containing a binary relation is also given (see ConGen).

The file also proves basic properties of the quotient of a type by a congruence relation, and the complete lattice of congruence relations on a type. We then establish an order-preserving bijection between the set of congruence relations containing a congruence relation c and the set of congruence relations on the quotient by c.

The second half of the file concerns congruence relations on monoids, in which case the quotient by the congruence relation is also a monoid. There are results about the universal property of quotients of monoids, and the isomorphism theorems for monoids.

Implementation notes #

The inductive definition of a congruence relation could be a nested inductive type, defined using the equivalence closure of a binary relation EqvGen, but the recursor generated does not work. A nested inductive definition could conceivably shorten proofs, because they would allow invocation of the corresponding lemmas about EqvGen.

The lemmas refl, symm and trans are not tagged with @[refl], @[symm], and @[trans] respectively as these tags do not work on a structure coerced to a binary relation.

There is a coercion from elements of a type to the element's equivalence class under a congruence relation.

A congruence relation on a monoid M can be thought of as a submonoid of M × M for which membership is an equivalence relation, but whilst this fact is established in the file, it is not used, since this perspective adds more layers of definitional unfolding.

Tags #

congruence, congruence relation, quotient, quotient by congruence relation, monoid, quotient monoid, isomorphism theorems

structure AddCon (M : Type u_1) [Add M] extends Setoid :
Type u_1

A congruence relation on a type with an addition is an equivalence relation which preserves addition.

Instances For
    structure Con (M : Type u_1) [Mul M] extends Setoid :
    Type u_1

    A congruence relation on a type with a multiplication is an equivalence relation which preserves multiplication.

    Instances For
      inductive AddConGen.Rel {M : Type u_1} [Add M] (r : MMProp) :
      MMProp

      The inductively defined smallest additive congruence relation containing a given binary relation.

      Instances For
        inductive ConGen.Rel {M : Type u_1} [Mul M] (r : MMProp) :
        MMProp

        The inductively defined smallest multiplicative congruence relation containing a given binary relation.

        Instances For
          theorem addConGen.proof_1 {M : Type u_1} [Add M] (r : MMProp) :
          def addConGen {M : Type u_1} [Add M] (r : MMProp) :

          The inductively defined smallest additive congruence relation containing a given binary relation.

          Equations
          • One or more equations did not get rendered due to their size.
          Instances For
            def conGen {M : Type u_1} [Mul M] (r : MMProp) :
            Con M

            The inductively defined smallest multiplicative congruence relation containing a given binary relation.

            Equations
            Instances For
              instance AddCon.instInhabitedCon {M : Type u_1} [Add M] :
              Equations
              • AddCon.instInhabitedCon = { default := addConGen EmptyRelation }
              instance Con.instInhabitedCon {M : Type u_1} [Mul M] :
              Equations
              • Con.instInhabitedCon = { default := conGen EmptyRelation }
              instance AddCon.instFunLikeConForAllProp {M : Type u_1} [Add M] :
              FunLike (AddCon M) M fun x => MProp

              A coercion from an additive congruence relation to its underlying binary relation.

              Equations
              • AddCon.instFunLikeConForAllProp = { coe := fun c x y => Setoid.r x y, coe_injective' := (_ : ∀ (x y : AddCon M), (fun c x y => Setoid.r x y) x = (fun c x y => Setoid.r x y) yx = y) }
              theorem AddCon.instFunLikeConForAllProp.proof_1 {M : Type u_1} [Add M] (x : AddCon M) (y : AddCon M) (h : (fun c x y => Setoid.r x y) x = (fun c x y => Setoid.r x y) y) :
              x = y
              instance Con.instFunLikeConForAllProp {M : Type u_1} [Mul M] :
              FunLike (Con M) M fun x => MProp

              A coercion from a congruence relation to its underlying binary relation.

              Equations
              • Con.instFunLikeConForAllProp = { coe := fun c x y => Setoid.r x y, coe_injective' := (_ : ∀ (x y : Con M), (fun c x y => Setoid.r x y) x = (fun c x y => Setoid.r x y) yx = y) }
              @[simp]
              theorem AddCon.rel_eq_coe {M : Type u_1} [Add M] (c : AddCon M) :
              Setoid.r = c
              @[simp]
              theorem Con.rel_eq_coe {M : Type u_1} [Mul M] (c : Con M) :
              Setoid.r = c
              theorem AddCon.refl {M : Type u_1} [Add M] (c : AddCon M) (x : M) :
              c x x

              Additive congruence relations are reflexive.

              theorem Con.refl {M : Type u_1} [Mul M] (c : Con M) (x : M) :
              c x x

              Congruence relations are reflexive.

              theorem AddCon.symm {M : Type u_1} [Add M] (c : AddCon M) {x : M} {y : M} :
              c x yc y x

              Additive congruence relations are symmetric.

              theorem Con.symm {M : Type u_1} [Mul M] (c : Con M) {x : M} {y : M} :
              c x yc y x

              Congruence relations are symmetric.

              theorem AddCon.trans {M : Type u_1} [Add M] (c : AddCon M) {x : M} {y : M} {z : M} :
              c x yc y zc x z

              Additive congruence relations are transitive.

              theorem Con.trans {M : Type u_1} [Mul M] (c : Con M) {x : M} {y : M} {z : M} :
              c x yc y zc x z

              Congruence relations are transitive.

              theorem AddCon.add {M : Type u_1} [Add M] (c : AddCon M) {w : M} {x : M} {y : M} {z : M} :
              c w xc y zc (w + y) (x + z)

              Additive congruence relations preserve addition.

              theorem Con.mul {M : Type u_1} [Mul M] (c : Con M) {w : M} {x : M} {y : M} {z : M} :
              c w xc y zc (w * y) (x * z)

              Multiplicative congruence relations preserve multiplication.

              @[simp]
              theorem AddCon.rel_mk {M : Type u_1} [Add M] {s : Setoid M} {h : ∀ {w x y z : M}, Setoid.r w xSetoid.r y zSetoid.r (w + y) (x + z)} {a : M} {b : M} :
              { toSetoid := s, add' := h } a b Setoid.r a b
              @[simp]
              theorem Con.rel_mk {M : Type u_1} [Mul M] {s : Setoid M} {h : ∀ {w x y z : M}, Setoid.r w xSetoid.r y zSetoid.r (w * y) (x * z)} {a : M} {b : M} :
              { toSetoid := s, mul' := h } a b Setoid.r a b
              instance AddCon.instMembershipSumCon {M : Type u_1} [Add M] :
              Membership (M × M) (AddCon M)

              Given a type M with an addition, x, y ∈ M, and an additive congruence relation c on M, (x, y) ∈ M × M iff x is related to y by c.

              Equations
              • AddCon.instMembershipSumCon = { mem := fun x c => c x.fst x.snd }
              instance Con.instMembershipProdCon {M : Type u_1} [Mul M] :
              Membership (M × M) (Con M)

              Given a type M with a multiplication, a congruence relation c on M, and elements of M x, y, (x, y) ∈ M × M iff x is related to y by c.

              Equations
              • Con.instMembershipProdCon = { mem := fun x c => c x.fst x.snd }
              theorem AddCon.ext' {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (H : Setoid.r = Setoid.r) :
              c = d

              The map sending an additive congruence relation to its underlying binary relation is injective.

              theorem Con.ext' {M : Type u_1} [Mul M] {c : Con M} {d : Con M} (H : Setoid.r = Setoid.r) :
              c = d

              The map sending a congruence relation to its underlying binary relation is injective.

              theorem AddCon.ext {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (H : ∀ (x y : M), c x y d x y) :
              c = d

              Extensionality rule for additive congruence relations.

              theorem Con.ext {M : Type u_1} [Mul M] {c : Con M} {d : Con M} (H : ∀ (x y : M), c x y d x y) :
              c = d

              Extensionality rule for congruence relations.

              theorem AddCon.toSetoid_inj {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (H : c.toSetoid = d.toSetoid) :
              c = d

              The map sending an additive congruence relation to its underlying equivalence relation is injective.

              theorem Con.toSetoid_inj {M : Type u_1} [Mul M] {c : Con M} {d : Con M} (H : c.toSetoid = d.toSetoid) :
              c = d

              The map sending a congruence relation to its underlying equivalence relation is injective.

              theorem AddCon.ext_iff {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} :
              (∀ (x y : M), c x y d x y) c = d

              Iff version of extensionality rule for additive congruence relations.

              theorem Con.ext_iff {M : Type u_1} [Mul M] {c : Con M} {d : Con M} :
              (∀ (x y : M), c x y d x y) c = d

              Iff version of extensionality rule for congruence relations.

              theorem AddCon.ext'_iff {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} :
              Setoid.r = Setoid.r c = d

              Two additive congruence relations are equal iff their underlying binary relations are equal.

              theorem Con.ext'_iff {M : Type u_1} [Mul M] {c : Con M} {d : Con M} :
              Setoid.r = Setoid.r c = d

              Two congruence relations are equal iff their underlying binary relations are equal.

              theorem AddCon.addKer.proof_1 {M : Type u_1} {P : Type u_2} [Add M] [Add P] (f : MP) (h : ∀ (x y : M), f (x + y) = f x + f y) :
              ∀ {w x y z : M}, Setoid.r w xSetoid.r y zSetoid.r (w + y) (x + z)
              def AddCon.addKer {M : Type u_1} {P : Type u_3} [Add M] [Add P] (f : MP) (h : ∀ (x y : M), f (x + y) = f x + f y) :

              The kernel of an addition-preserving function as an additive congruence relation.

              Equations
              Instances For
                def Con.mulKer {M : Type u_1} {P : Type u_3} [Mul M] [Mul P] (f : MP) (h : ∀ (x y : M), f (x * y) = f x * f y) :
                Con M

                The kernel of a multiplication-preserving function as a congruence relation.

                Equations
                Instances For
                  theorem AddCon.prod.proof_2 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (c : AddCon M) (d : AddCon N) :
                  ∀ {w x y z : M × N}, Setoid.r w xSetoid.r y zSetoid.Rel c.toSetoid (w + y).fst (x + z).fst Setoid.Rel d.toSetoid (w + y).snd (x + z).snd
                  theorem AddCon.prod.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (c : AddCon M) (d : AddCon N) :
                  Equivalence Setoid.r
                  def AddCon.prod {M : Type u_1} {N : Type u_2} [Add M] [Add N] (c : AddCon M) (d : AddCon N) :
                  AddCon (M × N)

                  Given types with additions M, N, the product of two congruence relations c on M and d on N: (x₁, x₂), (y₁, y₂) ∈ M × N are related by c.prod d iff x₁ is related to y₁ by c and x₂ is related to y₂ by d.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    def Con.prod {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (c : Con M) (d : Con N) :
                    Con (M × N)

                    Given types with multiplications M, N, the product of two congruence relations c on M and d on N: (x₁, x₂), (y₁, y₂) ∈ M × N are related by c.prod d iff x₁ is related to y₁ by c and x₂ is related to y₂ by d.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      def AddCon.pi {ι : Type u_4} {f : ιType u_5} [(i : ι) → Add (f i)] (C : (i : ι) → AddCon (f i)) :
                      AddCon ((i : ι) → f i)

                      The product of an indexed collection of additive congruence relations.

                      Equations
                      Instances For
                        theorem AddCon.pi.proof_1 {ι : Type u_1} {f : ιType u_2} [(i : ι) → Add (f i)] (C : (i : ι) → AddCon (f i)) :
                        Equivalence Setoid.r
                        theorem AddCon.pi.proof_2 {ι : Type u_1} {f : ιType u_2} [(i : ι) → Add (f i)] (C : (i : ι) → AddCon (f i)) :
                        {w x y z : (i : ι) → f i} → Setoid.r w xSetoid.r y z(i : ι) → ↑(C i) (w i + y i) (x i + z i)
                        def Con.pi {ι : Type u_4} {f : ιType u_5} [(i : ι) → Mul (f i)] (C : (i : ι) → Con (f i)) :
                        Con ((i : ι) → f i)

                        The product of an indexed collection of congruence relations.

                        Equations
                        Instances For
                          def AddCon.Quotient {M : Type u_1} [Add M] (c : AddCon M) :
                          Type u_1

                          Defining the quotient by an additive congruence relation of a type with an addition.

                          Equations
                          Instances For
                            def Con.Quotient {M : Type u_1} [Mul M] (c : Con M) :
                            Type u_1

                            Defining the quotient by a congruence relation of a type with a multiplication.

                            Equations
                            Instances For
                              def AddCon.toQuotient {M : Type u_1} [Add M] {c : AddCon M} :

                              The morphism into the quotient by an additive congruence relation

                              Equations
                              • AddCon.toQuotient = Quotient.mk''
                              Instances For
                                def Con.toQuotient {M : Type u_1} [Mul M] {c : Con M} :
                                MCon.Quotient c

                                The morphism into the quotient by a congruence relation

                                Equations
                                • Con.toQuotient = Quotient.mk''
                                Instances For
                                  instance AddCon.instCoeTCQuotient {M : Type u_1} [Add M] (c : AddCon M) :

                                  Coercion from a type with an addition to its quotient by an additive congruence relation

                                  Equations
                                  instance Con.instCoeTCQuotient {M : Type u_1} [Mul M] (c : Con M) :

                                  Coercion from a type with a multiplication to its quotient by a congruence relation.

                                  See Note [use has_coe_t].

                                  Equations
                                  instance AddCon.instDecidableEqQuotient {M : Type u_1} [Add M] (c : AddCon M) [(a b : M) → Decidable (c a b)] :

                                  The quotient by a decidable additive congruence relation has decidable equality.

                                  Equations
                                  instance Con.instDecidableEqQuotient {M : Type u_1} [Mul M] (c : Con M) [(a b : M) → Decidable (c a b)] :

                                  The quotient by a decidable congruence relation has decidable equality.

                                  Equations
                                  @[simp]
                                  theorem AddCon.quot_mk_eq_coe {M : Type u_4} [Add M] (c : AddCon M) (x : M) :
                                  Quot.mk (c) x = x
                                  @[simp]
                                  theorem Con.quot_mk_eq_coe {M : Type u_4} [Mul M] (c : Con M) (x : M) :
                                  Quot.mk (c) x = x
                                  def AddCon.liftOn {M : Type u_1} [Add M] {β : Sort u_4} {c : AddCon M} (q : AddCon.Quotient c) (f : Mβ) (h : ∀ (a b : M), c a bf a = f b) :
                                  β

                                  The function on the quotient by a congruence relation c induced by a function that is constant on c's equivalence classes.

                                  Equations
                                  Instances For
                                    def Con.liftOn {M : Type u_1} [Mul M] {β : Sort u_4} {c : Con M} (q : Con.Quotient c) (f : Mβ) (h : ∀ (a b : M), c a bf a = f b) :
                                    β

                                    The function on the quotient by a congruence relation c induced by a function that is constant on c's equivalence classes.

                                    Equations
                                    Instances For
                                      def AddCon.liftOn₂ {M : Type u_1} [Add M] {β : Sort u_4} {c : AddCon M} (q : AddCon.Quotient c) (r : AddCon.Quotient c) (f : MMβ) (h : ∀ (a₁ a₂ b₁ b₂ : M), c a₁ b₁c a₂ b₂f a₁ a₂ = f b₁ b₂) :
                                      β

                                      The binary function on the quotient by a congruence relation c induced by a binary function that is constant on c's equivalence classes.

                                      Equations
                                      Instances For
                                        def Con.liftOn₂ {M : Type u_1} [Mul M] {β : Sort u_4} {c : Con M} (q : Con.Quotient c) (r : Con.Quotient c) (f : MMβ) (h : ∀ (a₁ a₂ b₁ b₂ : M), c a₁ b₁c a₂ b₂f a₁ a₂ = f b₁ b₂) :
                                        β

                                        The binary function on the quotient by a congruence relation c induced by a binary function that is constant on c's equivalence classes.

                                        Equations
                                        Instances For
                                          def AddCon.hrecOn₂ {M : Type u_1} {N : Type u_2} [Add M] [Add N] {cM : AddCon M} {cN : AddCon N} {φ : AddCon.Quotient cMAddCon.Quotient cNSort u_4} (a : AddCon.Quotient cM) (b : AddCon.Quotient cN) (f : (x : M) → (y : N) → φ x y) (h : ∀ (x : M) (y : N) (x' : M) (y' : N), cM x x'cN y y'HEq (f x y) (f x' y')) :
                                          φ a b

                                          A version of Quotient.hrecOn₂' for quotients by AddCon.

                                          Equations
                                          Instances For
                                            def Con.hrecOn₂ {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {cM : Con M} {cN : Con N} {φ : Con.Quotient cMCon.Quotient cNSort u_4} (a : Con.Quotient cM) (b : Con.Quotient cN) (f : (x : M) → (y : N) → φ x y) (h : ∀ (x : M) (y : N) (x' : M) (y' : N), cM x x'cN y y'HEq (f x y) (f x' y')) :
                                            φ a b

                                            A version of Quotient.hrecOn₂' for quotients by Con.

                                            Equations
                                            Instances For
                                              @[simp]
                                              theorem AddCon.hrec_on₂_coe {M : Type u_1} {N : Type u_2} [Add M] [Add N] {cM : AddCon M} {cN : AddCon N} {φ : AddCon.Quotient cMAddCon.Quotient cNSort u_4} (a : M) (b : N) (f : (x : M) → (y : N) → φ x y) (h : ∀ (x : M) (y : N) (x' : M) (y' : N), cM x x'cN y y'HEq (f x y) (f x' y')) :
                                              AddCon.hrecOn₂ (a) (b) f h = f a b
                                              @[simp]
                                              theorem Con.hrec_on₂_coe {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {cM : Con M} {cN : Con N} {φ : Con.Quotient cMCon.Quotient cNSort u_4} (a : M) (b : N) (f : (x : M) → (y : N) → φ x y) (h : ∀ (x : M) (y : N) (x' : M) (y' : N), cM x x'cN y y'HEq (f x y) (f x' y')) :
                                              Con.hrecOn₂ (a) (b) f h = f a b
                                              theorem AddCon.induction_on {M : Type u_1} [Add M] {c : AddCon M} {C : AddCon.Quotient cProp} (q : AddCon.Quotient c) (H : (x : M) → C x) :
                                              C q

                                              The inductive principle used to prove propositions about the elements of a quotient by an additive congruence relation.

                                              theorem Con.induction_on {M : Type u_1} [Mul M] {c : Con M} {C : Con.Quotient cProp} (q : Con.Quotient c) (H : (x : M) → C x) :
                                              C q

                                              The inductive principle used to prove propositions about the elements of a quotient by a congruence relation.

                                              theorem AddCon.induction_on₂ {M : Type u_1} {N : Type u_2} [Add M] [Add N] {c : AddCon M} {d : AddCon N} {C : AddCon.Quotient cAddCon.Quotient dProp} (p : AddCon.Quotient c) (q : AddCon.Quotient d) (H : (x : M) → (y : N) → C x y) :
                                              C p q

                                              A version of AddCon.induction_on for predicates which take two arguments.

                                              theorem Con.induction_on₂ {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {c : Con M} {d : Con N} {C : Con.Quotient cCon.Quotient dProp} (p : Con.Quotient c) (q : Con.Quotient d) (H : (x : M) → (y : N) → C x y) :
                                              C p q

                                              A version of Con.induction_on for predicates which take two arguments.

                                              @[simp]
                                              theorem AddCon.eq {M : Type u_1} [Add M] (c : AddCon M) {a : M} {b : M} :
                                              a = b c a b

                                              Two elements are related by an additive congruence relation c iff they are represented by the same element of the quotient by c.

                                              @[simp]
                                              theorem Con.eq {M : Type u_1} [Mul M] (c : Con M) {a : M} {b : M} :
                                              a = b c a b

                                              Two elements are related by a congruence relation c iff they are represented by the same element of the quotient by c.

                                              instance AddCon.hasAdd {M : Type u_1} [Add M] (c : AddCon M) :

                                              The addition induced on the quotient by an additive congruence relation on a type with an addition.

                                              Equations
                                              instance Con.hasMul {M : Type u_1} [Mul M] (c : Con M) :

                                              The multiplication induced on the quotient by a congruence relation on a type with a multiplication.

                                              Equations
                                              @[simp]
                                              theorem AddCon.add_ker_mk_eq {M : Type u_1} [Add M] (c : AddCon M) :
                                              AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) = c

                                              The kernel of the quotient map induced by an additive congruence relation c equals c.

                                              @[simp]
                                              theorem Con.mul_ker_mk_eq {M : Type u_1} [Mul M] (c : Con M) :
                                              Con.mulKer Con.toQuotient (_ : ∀ (x x_1 : M), ↑(x * x_1) = ↑(x * x_1)) = c

                                              The kernel of the quotient map induced by a congruence relation c equals c.

                                              @[simp]
                                              theorem AddCon.coe_add {M : Type u_1} [Add M] {c : AddCon M} (x : M) (y : M) :
                                              ↑(x + y) = x + y

                                              The coercion to the quotient of an additive congruence relation commutes with addition (by definition).

                                              @[simp]
                                              theorem Con.coe_mul {M : Type u_1} [Mul M] {c : Con M} (x : M) (y : M) :
                                              ↑(x * y) = x * y

                                              The coercion to the quotient of a congruence relation commutes with multiplication (by definition).

                                              @[simp]
                                              theorem AddCon.liftOn_coe {M : Type u_1} [Add M] {β : Sort u_4} (c : AddCon M) (f : Mβ) (h : ∀ (a b : M), c a bf a = f b) (x : M) :
                                              AddCon.liftOn (x) f h = f x

                                              Definition of the function on the quotient by an additive congruence relation c induced by a function that is constant on c's equivalence classes.

                                              @[simp]
                                              theorem Con.liftOn_coe {M : Type u_1} [Mul M] {β : Sort u_4} (c : Con M) (f : Mβ) (h : ∀ (a b : M), c a bf a = f b) (x : M) :
                                              Con.liftOn (x) f h = f x

                                              Definition of the function on the quotient by a congruence relation c induced by a function that is constant on c's equivalence classes.

                                              theorem AddCon.congr.proof_3 {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (h : c = d) :
                                              Function.RightInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun
                                              theorem AddCon.congr.proof_2 {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (h : c = d) :
                                              Function.LeftInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun
                                              theorem AddCon.congr.proof_4 {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (h : c = d) (x : AddCon.Quotient c) (y : AddCon.Quotient c) :
                                              Equiv.toFun { toFun := (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun, invFun := (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun, left_inv := (_ : Function.LeftInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun), right_inv := (_ : Function.RightInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun) } (x + y) = Equiv.toFun { toFun := (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun, invFun := (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun, left_inv := (_ : Function.LeftInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun), right_inv := (_ : Function.RightInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun) } x + Equiv.toFun { toFun := (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun, invFun := (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun, left_inv := (_ : Function.LeftInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun), right_inv := (_ : Function.RightInverse (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).invFun (Quotient.congr (Equiv.refl M) (_ : ∀ (x y : M), c x y d x y)).toFun) } y
                                              theorem AddCon.congr.proof_1 {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (h : c = d) (x : M) (y : M) :
                                              c x y d x y
                                              def AddCon.congr {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} (h : c = d) :

                                              Makes an additive isomorphism of quotients by two additive congruence relations, given that the relations are equal.

                                              Equations
                                              • One or more equations did not get rendered due to their size.
                                              Instances For
                                                def Con.congr {M : Type u_1} [Mul M] {c : Con M} {d : Con M} (h : c = d) :

                                                Makes an isomorphism of quotients by two congruence relations, given that the relations are equal.

                                                Equations
                                                • One or more equations did not get rendered due to their size.
                                                Instances For
                                                  instance AddCon.instLECon {M : Type u_1} [Add M] :

                                                  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.

                                                  Equations
                                                  • AddCon.instLECon = { le := fun c d => x y : M⦄ → c x yd x y }
                                                  instance Con.instLECon {M : Type u_1} [Mul M] :
                                                  LE (Con M)

                                                  For congruence relations c, d on a type M with a multiplication, c ≤ d iff ∀ x y ∈ M, x is related to y by d if x is related to y by c.

                                                  Equations
                                                  • Con.instLECon = { le := fun c d => x y : M⦄ → c x yd x y }
                                                  theorem AddCon.le_def {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} :
                                                  c d {x y : M} → c x yd x y

                                                  Definition of for additive congruence relations.

                                                  theorem Con.le_def {M : Type u_1} [Mul M] {c : Con M} {d : Con M} :
                                                  c d {x y : M} → c x yd x y

                                                  Definition of for congruence relations.

                                                  theorem AddCon.instInfSetCon.proof_1 {M : Type u_1} [Add M] (S : Set (AddCon M)) :
                                                  Equivalence fun x y => ∀ (c : AddCon M), c Sc x y
                                                  theorem AddCon.instInfSetCon.proof_2 {M : Type u_1} [Add M] (S : Set (AddCon M)) :
                                                  {w x y z : M} → Setoid.r w xSetoid.r y z∀ (c : AddCon M), c Sc (w + y) (x + z)
                                                  instance AddCon.instInfSetCon {M : Type u_1} [Add M] :

                                                  The infimum of a set of additive congruence relations on a given type with an addition.

                                                  Equations
                                                  • One or more equations did not get rendered due to their size.
                                                  instance Con.instInfSetCon {M : Type u_1} [Mul M] :

                                                  The infimum of a set of congruence relations on a given type with a multiplication.

                                                  Equations
                                                  • One or more equations did not get rendered due to their size.
                                                  theorem AddCon.sInf_toSetoid {M : Type u_1} [Add M] (S : Set (AddCon M)) :
                                                  (sInf S).toSetoid = sInf (AddCon.toSetoid '' S)

                                                  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.

                                                  abbrev AddCon.sInf_toSetoid.match_1 {M : Type u_1} [Add M] (S : Set (AddCon M)) (r : Setoid M) (motive : r AddCon.toSetoid '' SProp) :
                                                  (x : r AddCon.toSetoid '' S) → ((c : AddCon M) → (hS : c S) → (hr : c.toSetoid = r) → motive (_ : a, a S a.toSetoid = r)) → motive x
                                                  Equations
                                                  Instances For
                                                    theorem Con.sInf_toSetoid {M : Type u_1} [Mul M] (S : Set (Con M)) :
                                                    (sInf S).toSetoid = sInf (Con.toSetoid '' S)

                                                    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.

                                                    theorem AddCon.sInf_def {M : Type u_1} [Add M] (S : Set (AddCon M)) :
                                                    ↑(sInf S) = sInf (FunLike.coe '' S)

                                                    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 Con.sInf_def {M : Type u_1} [Mul M] (S : Set (Con M)) :
                                                    ↑(sInf S) = sInf (FunLike.coe '' S)

                                                    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.

                                                    theorem AddCon.instPartialOrderCon.proof_3 {M : Type u_1} [Add M] :
                                                    ∀ (x x_1 : AddCon M), x < x_1 x < x_1
                                                    theorem AddCon.instPartialOrderCon.proof_1 {M : Type u_1} [Add M] :
                                                    (x : AddCon M) → (x_1 x_2 : M) → x x_1 x_2x x_1 x_2
                                                    theorem AddCon.instPartialOrderCon.proof_2 {M : Type u_1} [Add M] :
                                                    (x x_1 x_2 : AddCon M) → x x_1x_1 x_2(x_3 x_4 : M) → x x_3 x_4x_2 x_3 x_4
                                                    Equations
                                                    theorem AddCon.instPartialOrderCon.proof_4 {M : Type u_1} [Add M] :
                                                    ∀ (x x_1 : AddCon M), x x_1x_1 xx = x_1
                                                    instance Con.instPartialOrderCon {M : Type u_1} [Mul M] :
                                                    Equations
                                                    theorem AddCon.instCompleteLatticeCon.proof_5 {M : Type u_1} [Add M] :
                                                    ∀ (x x_1 x_2 : AddCon M), x x_1x x_2∀ (x_3 x_4 : M), x x_3 x_4Setoid.Rel x_1.toSetoid x_3 x_4 Setoid.Rel x_2.toSetoid x_3 x_4
                                                    theorem AddCon.instCompleteLatticeCon.proof_6 {M : Type u_1} [Add M] (s : Set (AddCon M)) (a : AddCon M) :
                                                    a sa sSup s
                                                    theorem AddCon.instCompleteLatticeCon.proof_3 {M : Type u_1} [Add M] :
                                                    ∀ (x x_1 : AddCon M) (x_2 x_3 : M), ↑(x x_1) x_2 x_3Setoid.Rel x.toSetoid x_2 x_3

                                                    The complete lattice of additive congruence relations on a given type with an addition.

                                                    Equations
                                                    • One or more equations did not get rendered due to their size.
                                                    theorem AddCon.instCompleteLatticeCon.proof_10 {M : Type u_1} :
                                                    ∀ {w x y z : M}, Setoid.r w xSetoid.r y zSetoid.r y z
                                                    theorem AddCon.instCompleteLatticeCon.proof_11 {M : Type u_1} [Add M] :
                                                    ∀ {w x y z : M}, Setoid.r w xSetoid.r y zSetoid.r (w + y) (x + z)
                                                    theorem AddCon.instCompleteLatticeCon.proof_7 {M : Type u_1} [Add M] (s : Set (AddCon M)) (a : AddCon M) :
                                                    (∀ (b : AddCon M), b sb a) → sSup s a
                                                    theorem AddCon.instCompleteLatticeCon.proof_9 {M : Type u_1} [Add M] (s : Set (AddCon M)) (a : AddCon M) :
                                                    (∀ (b : AddCon M), b sa b) → a sInf s
                                                    theorem AddCon.instCompleteLatticeCon.proof_2 {M : Type u_1} [Add M] (c : AddCon M) (d : AddCon M) :
                                                    ∀ {w x y z : M}, Setoid.r w xSetoid.r y zSetoid.Rel c.toSetoid (w + y) (x + z) Setoid.Rel d.toSetoid (w + y) (x + z)
                                                    theorem AddCon.instCompleteLatticeCon.proof_8 {M : Type u_1} [Add M] (s : Set (AddCon M)) (a : AddCon M) :
                                                    a ssInf s a
                                                    theorem AddCon.instCompleteLatticeCon.proof_12 {M : Type u_1} [Add M] (c : AddCon M) (x : M) (y : M) (h : x y) :
                                                    c x y
                                                    theorem AddCon.instCompleteLatticeCon.proof_4 {M : Type u_1} [Add M] :
                                                    ∀ (x x_1 : AddCon M) (x_2 x_3 : M), ↑(x x_1) x_2 x_3Setoid.Rel x_1.toSetoid x_2 x_3

                                                    The complete lattice of congruence relations on a given type with a multiplication.

                                                    Equations
                                                    • One or more equations did not get rendered due to their size.
                                                    theorem AddCon.inf_def {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} :
                                                    Setoid.r = Setoid.r Setoid.r

                                                    The infimum of two additive congruence relations equals the infimum of the underlying binary operations.

                                                    theorem Con.inf_def {M : Type u_1} [Mul M] {c : Con M} {d : Con M} :
                                                    Setoid.r = Setoid.r Setoid.r

                                                    The infimum of two congruence relations equals the infimum of the underlying binary operations.

                                                    theorem AddCon.inf_iff_and {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} {x : M} {y : M} :
                                                    ↑(c d) x y c x y d x y

                                                    Definition of the infimum of two additive congruence relations.

                                                    theorem Con.inf_iff_and {M : Type u_1} [Mul M] {c : Con M} {d : Con M} {x : M} {y : M} :
                                                    ↑(c d) x y c x y d x y

                                                    Definition of the infimum of two congruence relations.

                                                    theorem AddCon.addConGen_eq {M : Type u_1} [Add M] (r : MMProp) :
                                                    addConGen r = sInf {s | (x y : M) → r x ys x y}

                                                    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 Con.conGen_eq {M : Type u_1} [Mul M] (r : MMProp) :
                                                    conGen r = sInf {s | (x y : M) → r x ys x y}

                                                    The inductively defined smallest congruence relation containing a binary relation r equals the infimum of the set of congruence relations containing r.

                                                    theorem AddCon.addConGen_le {M : Type u_1} [Add M] {r : MMProp} {c : AddCon M} (h : ∀ (x y : M), r x ySetoid.r x y) :

                                                    The smallest additive congruence relation containing a binary relation r is contained in any additive congruence relation containing r.

                                                    theorem Con.conGen_le {M : Type u_1} [Mul M] {r : MMProp} {c : Con M} (h : ∀ (x y : M), r x ySetoid.r x y) :

                                                    The smallest congruence relation containing a binary relation r is contained in any congruence relation containing r.

                                                    theorem AddCon.addConGen_mono {M : Type u_1} [Add M] {r : MMProp} {s : MMProp} (h : (x y : M) → r x ys x y) :

                                                    Given binary relations r, s with r contained in s, the smallest additive congruence relation containing s contains the smallest additive congruence relation containing r.

                                                    theorem Con.conGen_mono {M : Type u_1} [Mul M] {r : MMProp} {s : MMProp} (h : (x y : M) → r x ys x y) :

                                                    Given binary relations r, s with r contained in s, the smallest congruence relation containing s contains the smallest congruence relation containing r.

                                                    @[simp]
                                                    theorem AddCon.addConGen_of_addCon {M : Type u_1} [Add M] (c : AddCon M) :
                                                    addConGen c = c

                                                    Additive congruence relations equal the smallest additive congruence relation in which they are contained.

                                                    @[simp]
                                                    theorem Con.conGen_of_con {M : Type u_1} [Mul M] (c : Con M) :
                                                    conGen c = c

                                                    Congruence relations equal the smallest congruence relation in which they are contained.

                                                    theorem AddCon.addConGen_idem {M : Type u_1} [Add M] (r : MMProp) :

                                                    The map sending a binary relation to the smallest additive congruence relation in which it is contained is idempotent.

                                                    theorem Con.conGen_idem {M : Type u_1} [Mul M] (r : MMProp) :

                                                    The map sending a binary relation to the smallest congruence relation in which it is contained is idempotent.

                                                    theorem AddCon.sup_eq_addConGen {M : Type u_1} [Add M] (c : AddCon M) (d : AddCon M) :
                                                    c d = addConGen fun x y => c x y d x y

                                                    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 Con.sup_eq_conGen {M : Type u_1} [Mul M] (c : Con M) (d : Con M) :
                                                    c d = conGen fun x y => c x y d x y

                                                    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'.

                                                    theorem AddCon.sup_def {M : Type u_1} [Add M] {c : AddCon M} {d : AddCon M} :
                                                    c d = addConGen (Setoid.r Setoid.r)

                                                    The supremum of two additive congruence relations equals the smallest additive congruence relation containing the supremum of the underlying binary operations.

                                                    theorem Con.sup_def {M : Type u_1} [Mul M] {c : Con M} {d : Con M} :
                                                    c d = conGen (Setoid.r Setoid.r)

                                                    The supremum of two congruence relations equals the smallest congruence relation containing the supremum of the underlying binary operations.

                                                    theorem AddCon.sSup_eq_addConGen {M : Type u_1} [Add M] (S : Set (AddCon M)) :
                                                    sSup S = addConGen fun x y => c, c S c x y

                                                    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'.

                                                    abbrev AddCon.sSup_eq_addConGen.match_1 {M : Type u_1} [Add M] (S : Set (AddCon M)) :
                                                    (x x_1 : M) → ∀ (motive : (c, c S c x x_1) → Prop) (x_2 : c, c S c x x_1), (∀ (r : AddCon M) (hr : r S r x x_1), motive (_ : c, c S c x x_1)) → motive x_2
                                                    Equations
                                                    Instances For
                                                      theorem Con.sSup_eq_conGen {M : Type u_1} [Mul M] (S : Set (Con M)) :
                                                      sSup S = conGen fun x y => c, c S c x y

                                                      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'.

                                                      theorem AddCon.sSup_def {M : Type u_1} [Add M] {S : Set (AddCon M)} :
                                                      sSup S = addConGen (sSup (FunLike.coe '' S))

                                                      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 Con.sSup_def {M : Type u_1} [Mul M] {S : Set (Con M)} :
                                                      sSup S = conGen (sSup (FunLike.coe '' S))

                                                      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.

                                                      theorem AddCon.gi.proof_3 (M : Type u_1) [Add M] :
                                                      ∀ (x : MMProp) (x_1 : ↑(addConGen x) x), (fun r x => addConGen r) x x_1 = (fun r x => addConGen r) x x_1
                                                      def AddCon.gi (M : Type u_1) [Add M] :
                                                      GaloisInsertion addConGen FunLike.coe

                                                      There is a Galois insertion of additive congruence relations on a type with an addition M into binary relations on M.

                                                      Equations
                                                      • One or more equations did not get rendered due to their size.
                                                      Instances For
                                                        theorem AddCon.gi.proof_1 (M : Type u_1) [Add M] :
                                                        ∀ (x : MMProp) (c : AddCon M), addConGen x c x c
                                                        theorem AddCon.gi.proof_2 (M : Type u_1) [Add M] (x : AddCon M) :
                                                        x addConGen x
                                                        def Con.gi (M : Type u_1) [Mul M] :
                                                        GaloisInsertion conGen FunLike.coe

                                                        There is a Galois insertion of congruence relations on a type with a multiplication M into binary relations on M.

                                                        Equations
                                                        • One or more equations did not get rendered due to their size.
                                                        Instances For
                                                          def AddCon.mapGen {M : Type u_1} {N : Type u_2} [Add M] [Add N] (c : AddCon M) (f : MN) :

                                                          Given a function f, the smallest additive congruence relation containing the binary relation on f's image defined by 'x ≈ y iff the elements of f⁻¹(x) are related to the elements of f⁻¹(y) by an additive congruence relation c.'

                                                          Equations
                                                          Instances For
                                                            def Con.mapGen {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (c : Con M) (f : MN) :
                                                            Con N

                                                            Given a function f, the smallest congruence relation containing the binary relation on f's image defined by 'x ≈ y iff the elements of f⁻¹(x) are related to the elements of f⁻¹(y) by a congruence relation c.'

                                                            Equations
                                                            Instances For
                                                              def AddCon.mapOfSurjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] (c : AddCon M) (f : MN) (H : ∀ (x y : M), f (x + y) = f x + f y) (h : AddCon.addKer f H c) (hf : Function.Surjective f) :

                                                              Given a surjective addition-preserving function f whose kernel is contained in an additive congruence relation c, the additive congruence relation on f's codomain defined by 'x ≈ y iff the elements of f⁻¹(x) are related to the elements of f⁻¹(y) by c.'

                                                              Equations
                                                              • One or more equations did not get rendered due to their size.
                                                              Instances For
                                                                theorem AddCon.mapOfSurjective.proof_1 {M : Type u_2} {N : Type u_1} [Add M] [Add N] (c : AddCon M) (f : MN) (H : ∀ (x y : M), f (x + y) = f x + f y) (h : AddCon.addKer f H c) (hf : Function.Surjective f) :
                                                                ∀ {w x y z : N}, Setoid.r w xSetoid.r y zSetoid.r (w + y) (x + z)
                                                                def Con.mapOfSurjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (c : Con M) (f : MN) (H : ∀ (x y : M), f (x * y) = f x * f y) (h : Con.mulKer f H c) (hf : Function.Surjective f) :
                                                                Con N

                                                                Given a surjective multiplicative-preserving function f whose kernel is contained in a congruence relation c, the congruence relation on f's codomain defined by 'x ≈ y iff the elements of f⁻¹(x) are related to the elements of f⁻¹(y) by c.'

                                                                Equations
                                                                • One or more equations did not get rendered due to their size.
                                                                Instances For
                                                                  theorem AddCon.mapOfSurjective_eq_mapGen {M : Type u_1} {N : Type u_2} [Add M] [Add N] {c : AddCon M} {f : MN} (H : ∀ (x y : M), f (x + y) = f x + f y) (h : AddCon.addKer f H c) (hf : Function.Surjective f) :

                                                                  A specialization of 'the smallest additive congruence relation containing an additive congruence relation c equals c'.

                                                                  theorem Con.mapOfSurjective_eq_mapGen {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {c : Con M} {f : MN} (H : ∀ (x y : M), f (x * y) = f x * f y) (h : Con.mulKer f H c) (hf : Function.Surjective f) :

                                                                  A specialization of 'the smallest congruence relation containing a congruence relation c equals c'.

                                                                  theorem AddCon.comap.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : MN) (H : ∀ (x y : M), f (x + y) = f x + f y) (c : AddCon N) (w : M) (x : M) (y : M) (z : M) (h1 : Setoid.r w x) (h2 : Setoid.r y z) :
                                                                  c (f (w + y)) (f (x + z))
                                                                  def AddCon.comap {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : MN) (H : ∀ (x y : M), f (x + y) = f x + f y) (c : AddCon N) :

                                                                  Given types with additions M, N and an additive congruence relation c on N, an addition-preserving map f : M → N induces an additive congruence relation on f's domain defined by 'x ≈ y iff f(x) is related to f(y) by c.'

                                                                  Equations
                                                                  Instances For
                                                                    def Con.comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : MN) (H : ∀ (x y : M), f (x * y) = f x * f y) (c : Con N) :
                                                                    Con M

                                                                    Given types with multiplications M, N and a congruence relation c on N, a multiplication-preserving map f : M → N induces a congruence relation on f's domain defined by 'x ≈ y iff f(x) is related to f(y) by c.'

                                                                    Equations
                                                                    Instances For
                                                                      @[simp]
                                                                      theorem AddCon.comap_rel {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : MN} (H : ∀ (x y : M), f (x + y) = f x + f y) {c : AddCon N} {x : M} {y : M} :
                                                                      ↑(AddCon.comap f H c) x y c (f x) (f y)
                                                                      @[simp]
                                                                      theorem Con.comap_rel {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : MN} (H : ∀ (x y : M), f (x * y) = f x * f y) {c : Con N} {x : M} {y : M} :
                                                                      ↑(Con.comap f H c) x y c (f x) (f y)
                                                                      theorem AddCon.correspondence.proof_5 {M : Type u_1} [Add M] (c : AddCon M) (d : AddCon (AddCon.Quotient c)) (x : M) (y : M) (h : c x y) :
                                                                      d x y
                                                                      theorem AddCon.correspondence.proof_6 {M : Type u_1} [Add M] (c : AddCon M) (d : { d // c d }) :
                                                                      (fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) ((fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) d) = d
                                                                      theorem AddCon.correspondence.proof_4 {M : Type u_1} [Add M] (c : AddCon M) (x : M) (y : M) :
                                                                      ↑(x + y) = ↑(x + y)
                                                                      def AddCon.correspondence {M : Type u_1} [Add M] (c : AddCon M) :
                                                                      { d // c d } ≃o AddCon (AddCon.Quotient c)

                                                                      Given an additive congruence relation c on a type M with an addition, the order-preserving bijection between the set of additive congruence relations containing c and the additive congruence relations on the quotient of M by c.

                                                                      Equations
                                                                      • One or more equations did not get rendered due to their size.
                                                                      Instances For
                                                                        abbrev AddCon.correspondence.match_2 {M : Type u_1} [Add M] (c : AddCon M) (d : AddCon (AddCon.Quotient c)) (x : AddCon.Quotient c) (y : AddCon.Quotient c) (motive : ↑((fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) ((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) d)) x yProp) :
                                                                        (h : ↑((fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) ((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) d)) x y) → ((w w_1 : M) → (hx : w = x) → (hy : w_1 = y) → (H : Setoid.Rel (↑((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) d)).toSetoid w w_1) → motive (_ : a b, a = x b = y Setoid.Rel (↑((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) d)).toSetoid a b)) → motive h
                                                                        Equations
                                                                        • One or more equations did not get rendered due to their size.
                                                                        Instances For
                                                                          theorem AddCon.correspondence.proof_7 {M : Type u_1} [Add M] (c : AddCon M) (d : AddCon (AddCon.Quotient c)) :
                                                                          (fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) ((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) d) = d
                                                                          abbrev AddCon.correspondence.match_1 {M : Type u_1} [Add M] (c : AddCon M) (d : { d // c d }) (x : M) (y : M) (motive : ↑((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) ((fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) d)) x yProp) :
                                                                          (h : ↑((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) ((fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) d)) x y) → ((a b : M) → (hx : a = x) → (hy : b = y) → (H : Setoid.Rel (d).toSetoid a b) → motive (_ : a b, a = x b = y Setoid.Rel (d).toSetoid a b)) → motive h
                                                                          Equations
                                                                          • One or more equations did not get rendered due to their size.
                                                                          Instances For
                                                                            theorem AddCon.correspondence.proof_2 {M : Type u_1} [Add M] (c : AddCon M) (d : { d // c d }) :
                                                                            AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d
                                                                            theorem AddCon.correspondence.proof_8 {M : Type u_1} [Add M] (c : AddCon M) (s : { d // c d }) (t : { d // c d }) :
                                                                            { toFun := fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q), invFun := fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }, left_inv := (_ : ∀ (d : { d // c d }), (fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) ((fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) d) = d), right_inv := (_ : ∀ (d : AddCon (AddCon.Quotient c)), (fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) ((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) d) = d) } s { toFun := fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q), invFun := fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }, left_inv := (_ : ∀ (d : { d // c d }), (fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) ((fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) d) = d), right_inv := (_ : ∀ (d : AddCon (AddCon.Quotient c)), (fun d => AddCon.mapOfSurjective (d) AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) (_ : AddCon.addKer AddCon.toQuotient (_ : ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)) d) (_ : ∀ (q : Quotient c.toSetoid), a, Quotient.mk c.toSetoid a = q)) ((fun d => { val := AddCon.comap AddCon.toQuotient (_ : ∀ (x y : M), ↑(x + y) = ↑(x + y)) d, property := fun x y => (_ : c x yd x y) }) d) = d) } t s t
                                                                            theorem AddCon.correspondence.proof_1 {M : Type u_1} [Add M] (c : AddCon M) :
                                                                            ∀ (x x_1 : M), ↑(x + x_1) = ↑(x + x_1)
                                                                            theorem AddCon.correspondence.proof_3 {M : Type u_1} [Add M] (c : AddCon M) (q : Quotient c.toSetoid) :
                                                                            a, Quotient.mk c.toSetoid a = q
                                                                            def Con.correspondence {M : Type u_1} [Mul M] (c : Con M) :
                                                                            { d // c d } ≃o Con (Con.Quotient c)

                                                                            Given a congruence relation c on a type M with a multiplication, the order-preserving bijection between the set of congruence relations containing c and the congruence relations on the quotient of M by c.

                                                                            Equations
                                                                            • One or more equations did not get rendered due to their size.
                                                                            Instances For

                                                                              The quotient of an AddMonoid by an additive congruence relation is an AddMonoid.

                                                                              Equations
                                                                              theorem AddCon.addZeroClass.proof_1 {M : Type u_1} [AddZeroClass M] (c : AddCon M) (x : AddCon.Quotient c) :
                                                                              0 + x = x
                                                                              theorem AddCon.addZeroClass.proof_2 {M : Type u_1} [AddZeroClass M] (c : AddCon M) (x : AddCon.Quotient c) :
                                                                              x + 0 = x
                                                                              instance Con.mulOneClass {M : Type u_1} [MulOneClass M] (c : Con M) :

                                                                              The quotient of a monoid by a congruence relation is a monoid.

                                                                              Equations
                                                                              @[simp]
                                                                              theorem AddCon.coe_zero {M : Type u_1} [AddZeroClass M] {c : AddCon M} :
                                                                              0 = 0

                                                                              The 0 of the quotient of an AddMonoid by an additive congruence relation is the equivalence class of the AddMonoid's 0.

                                                                              @[simp]
                                                                              theorem Con.coe_one {M : Type u_1} [MulOneClass M] {c : Con M} :
                                                                              1 = 1

                                                                              The 1 of the quotient of a monoid by a congruence relation is the equivalence class of the monoid's 1.

                                                                              def AddCon.addSubmonoid {M : Type u_1} [AddZeroClass M] (c : AddCon M) :

                                                                              The AddSubmonoid of M × M defined by an additive congruence relation on an AddMonoid M.

                                                                              Equations
                                                                              • One or more equations did not get rendered due to their size.
                                                                              Instances For
                                                                                theorem AddCon.addSubmonoid.proof_1 {M : Type u_1} [AddZeroClass M] (c : AddCon M) :
                                                                                ∀ {a b : M × M}, c a.fst a.sndc b.fst b.sndc (a.fst + b.fst) (a.snd + b.snd)
                                                                                def Con.submonoid {M : Type u_1} [MulOneClass M] (c : Con M) :

                                                                                The submonoid of M × M defined by a congruence relation on a monoid M.

                                                                                Equations
                                                                                • One or more equations did not get rendered due to their size.
                                                                                Instances For
                                                                                  theorem AddCon.ofAddSubmonoid.proof_1 {M : Type u_1} [AddZeroClass M] (N : AddSubmonoid (M × M)) :
                                                                                  ∀ {w x y z : M}, (w, x) N(y, z) N(w, x) + (y, z) N
                                                                                  def AddCon.ofAddSubmonoid {M : Type u_1} [AddZeroClass M] (N : AddSubmonoid (M × M)) (H : Equivalence fun x y => (x, y) N) :

                                                                                  The additive congruence relation on an AddMonoid M from an add_submonoid of M × M for which membership is an equivalence relation.

                                                                                  Equations
                                                                                  • AddCon.ofAddSubmonoid N H = { toSetoid := { r := fun x y => (x, y) N, iseqv := H }, add' := (_ : ∀ {w x y z : M}, (w, x) N(y, z) N(w, x) + (y, z) N) }
                                                                                  Instances For
                                                                                    def Con.ofSubmonoid {M : Type u_1} [MulOneClass M] (N : Submonoid (M × M)) (H : Equivalence fun x y => (x, y) N) :
                                                                                    Con M

                                                                                    The congruence relation on a monoid M from a submonoid of M × M for which membership is an equivalence relation.

                                                                                    Equations
                                                                                    • Con.ofSubmonoid N H = { toSetoid := { r := fun x y => (x, y) N, iseqv := H }, mul' := (_ : ∀ {w x y z : M}, (w, x) N(y, z) N(w, x) * (y, z) N) }
                                                                                    Instances For
                                                                                      instance AddCon.toAddSubmonoid {M : Type u_1} [AddZeroClass M] :

                                                                                      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 is related to y by c.

                                                                                      Equations
                                                                                      • AddCon.toAddSubmonoid = { coe := fun c => c }
                                                                                      instance Con.toSubmonoid {M : Type u_1} [MulOneClass M] :
                                                                                      Coe (Con M) (Submonoid (M × M))

                                                                                      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.

                                                                                      Equations
                                                                                      • Con.toSubmonoid = { coe := fun c => c }
                                                                                      theorem AddCon.mem_coe {M : Type u_1} [AddZeroClass M] {c : AddCon M} {x : M} {y : M} :
                                                                                      (x, y) c (x, y) c
                                                                                      theorem Con.mem_coe {M : Type u_1} [MulOneClass M] {c : Con M} {x : M} {y : M} :
                                                                                      (x, y) c (x, y) c
                                                                                      theorem AddCon.to_addSubmonoid_inj {M : Type u_1} [AddZeroClass M] (c : AddCon M) (d : AddCon M) (H : c = d) :
                                                                                      c = d
                                                                                      theorem Con.to_submonoid_inj {M : Type u_1} [MulOneClass M] (c : Con M) (d : Con M) (H : c = d) :
                                                                                      c = d
                                                                                      theorem AddCon.le_iff {M : Type u_1} [AddZeroClass M] {c : AddCon M} {d : AddCon M} :
                                                                                      c d c d
                                                                                      theorem Con.le_iff {M : Type u_1} [MulOneClass M] {c : Con M} {d : Con M} :
                                                                                      c d c d
                                                                                      def AddCon.ker {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) :

                                                                                      The kernel of an AddMonoid homomorphism as an additive congruence relation.

                                                                                      Equations
                                                                                      Instances For
                                                                                        theorem AddCon.ker.proof_1 {M : Type u_2} {P : Type u_1} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (x : M) (y : M) :
                                                                                        f (x + y) = f x + f y
                                                                                        def Con.ker {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) :
                                                                                        Con M

                                                                                        The kernel of a monoid homomorphism as a congruence relation.

                                                                                        Equations
                                                                                        Instances For
                                                                                          @[simp]
                                                                                          theorem AddCon.ker_rel {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) {x : M} {y : M} :
                                                                                          ↑(AddCon.ker f) x y f x = f y

                                                                                          The definition of the additive congruence relation defined by an AddMonoid homomorphism's kernel.

                                                                                          @[simp]
                                                                                          theorem Con.ker_rel {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) {x : M} {y : M} :
                                                                                          ↑(Con.ker f) x y f x = f y

                                                                                          The definition of the congruence relation defined by a monoid homomorphism's kernel.

                                                                                          There exists an element of the quotient of an AddMonoid by a congruence relation (namely 0).

                                                                                          Equations
                                                                                          • AddCon.Quotient.inhabited = { default := 0 }
                                                                                          instance Con.Quotient.inhabited {M : Type u_1} [MulOneClass M] {c : Con M} :

                                                                                          There exists an element of the quotient of a monoid by a congruence relation (namely 1).

                                                                                          Equations
                                                                                          • Con.Quotient.inhabited = { default := 1 }
                                                                                          def AddCon.mk' {M : Type u_1} [AddZeroClass M] (c : AddCon M) :

                                                                                          The natural homomorphism from an AddMonoid to its quotient by an additive congruence relation.

                                                                                          Equations
                                                                                          • One or more equations did not get rendered due to their size.
                                                                                          Instances For
                                                                                            theorem AddCon.mk'.proof_1 {M : Type u_1} [AddZeroClass M] (c : AddCon M) :
                                                                                            0 = 0
                                                                                            theorem AddCon.mk'.proof_2 {M : Type u_1} [AddZeroClass M] (c : AddCon M) :
                                                                                            ∀ (x x_1 : M), ZeroHom.toFun { toFun := AddCon.toQuotient, map_zero' := (_ : 0 = 0) } (x + x_1) = ZeroHom.toFun { toFun := AddCon.toQuotient, map_zero' := (_ : 0 = 0) } (x + x_1)
                                                                                            def Con.mk' {M : Type u_1} [MulOneClass M] (c : Con M) :

                                                                                            The natural homomorphism from a monoid to its quotient by a congruence relation.

                                                                                            Equations
                                                                                            • One or more equations did not get rendered due to their size.
                                                                                            Instances For
                                                                                              @[simp]
                                                                                              theorem AddCon.mk'_ker {M : Type u_1} [AddZeroClass M] (c : AddCon M) :

                                                                                              The kernel of the natural homomorphism from an AddMonoid to its quotient by an additive congruence relation c equals c.

                                                                                              @[simp]
                                                                                              theorem Con.mk'_ker {M : Type u_1} [MulOneClass M] (c : Con M) :

                                                                                              The kernel of the natural homomorphism from a monoid to its quotient by a congruence relation c equals c.

                                                                                              The natural homomorphism from an AddMonoid to its quotient by a congruence relation is surjective.

                                                                                              theorem Con.mk'_surjective {M : Type u_1} [MulOneClass M] {c : Con M} :

                                                                                              The natural homomorphism from a monoid to its quotient by a congruence relation is surjective.

                                                                                              @[simp]
                                                                                              theorem AddCon.coe_mk' {M : Type u_1} [AddZeroClass M] {c : AddCon M} :
                                                                                              ↑(AddCon.mk' c) = AddCon.toQuotient
                                                                                              @[simp]
                                                                                              theorem Con.coe_mk' {M : Type u_1} [MulOneClass M] {c : Con M} :
                                                                                              ↑(Con.mk' c) = Con.toQuotient
                                                                                              @[simp]
                                                                                              theorem Con.mrange_mk' {M : Type u_1} [MulOneClass M] {c : Con M} :
                                                                                              theorem AddCon.ker_apply {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {f : M →+ P} {x : M} {y : M} :
                                                                                              ↑(AddCon.ker f) x y f x = f y
                                                                                              theorem Con.ker_apply {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {f : M →* P} {x : M} {y : M} :
                                                                                              ↑(Con.ker f) x y f x = f y
                                                                                              theorem AddCon.comap_eq {M : Type u_1} {N : Type u_2} [AddZeroClass M] [AddZeroClass N] {c : AddCon M} {f : N →+ M} :
                                                                                              AddCon.comap f (_ : ∀ (a b : N), f (a + b) = f a + f b) c = AddCon.ker (AddMonoidHom.comp (AddCon.mk' c) f)

                                                                                              Given an AddMonoid homomorphism f : N → M and an additive congruence relation c on M, the additive congruence relation induced on N by f equals the kernel of c's quotient homomorphism composed with f.

                                                                                              theorem Con.comap_eq {M : Type u_1} {N : Type u_2} [MulOneClass M] [MulOneClass N] {c : Con M} {f : N →* M} :
                                                                                              Con.comap f (_ : ∀ (a b : N), f (a * b) = f a * f b) c = Con.ker (MonoidHom.comp (Con.mk' c) f)

                                                                                              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.

                                                                                              theorem AddCon.lift.proof_2 {M : Type u_1} {P : Type u_2} [AddZeroClass M] [AddZeroClass P] (c : AddCon M) (f : M →+ P) (H : c AddCon.ker f) (x : AddCon.Quotient c) (y : AddCon.Quotient c) :
                                                                                              ZeroHom.toFun { toFun := fun x => AddCon.liftOn x f fun x x_1 h => H x x_1 h, map_zero' := (_ : (fun x => AddCon.liftOn x f fun x x_1 h => H x x_1 h) 0 = 0) } (x + y) = ZeroHom.toFun { toFun := fun x => AddCon.liftOn x f fun x x_1 h => H x x_1 h, map_zero' := (_ : (fun x => AddCon.liftOn x f fun x x_1 h => H x x_1 h) 0 = 0) } x + ZeroHom.toFun { toFun := fun x => AddCon.liftOn x f fun x x_1 h => H x x_1 h, map_zero' := (_ : (fun x => AddCon.liftOn x f fun x x_1 h => H x x_1 h) 0 = 0) } y
                                                                                              theorem AddCon.lift.proof_1 {M : Type u_2} {P : Type u_1} [AddZeroClass M] [AddZeroClass P] (c : AddCon M) (f : M →+ P) (H : c AddCon.ker f) :
                                                                                              (fun x => AddCon.liftOn x f fun x x_1 h => H x x_1 h) 0 = 0
                                                                                              def AddCon.lift {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (c : AddCon M) (f : M →+ P) (H : c AddCon.ker f) :

                                                                                              The homomorphism on the quotient of an AddMonoid by an additive congruence relation c induced by a homomorphism constant on c's equivalence classes.

                                                                                              Equations
                                                                                              • One or more equations did not get rendered due to their size.
                                                                                              Instances For
                                                                                                def Con.lift {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (c : Con M) (f : M →* P) (H : c Con.ker f) :

                                                                                                The homomorphism on the quotient of a monoid by a congruence relation c induced by a homomorphism constant on c's equivalence classes.

                                                                                                Equations
                                                                                                • One or more equations did not get rendered due to their size.
                                                                                                Instances For
                                                                                                  theorem AddCon.lift_mk' {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} {f : M →+ P} (H : c AddCon.ker f) (x : M) :
                                                                                                  ↑(AddCon.lift c f H) (↑(AddCon.mk' c) x) = f x

                                                                                                  The diagram describing the universal property for quotients of AddMonoids commutes.

                                                                                                  theorem Con.lift_mk' {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} {f : M →* P} (H : c Con.ker f) (x : M) :
                                                                                                  ↑(Con.lift c f H) (↑(Con.mk' c) x) = f x

                                                                                                  The diagram describing the universal property for quotients of monoids commutes.

                                                                                                  @[simp]
                                                                                                  theorem AddCon.lift_coe {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} {f : M →+ P} (H : c AddCon.ker f) (x : M) :
                                                                                                  ↑(AddCon.lift c f H) x = f x

                                                                                                  The diagram describing the universal property for quotients of AddMonoids commutes.

                                                                                                  @[simp]
                                                                                                  theorem Con.lift_coe {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} {f : M →* P} (H : c Con.ker f) (x : M) :
                                                                                                  ↑(Con.lift c f H) x = f x

                                                                                                  The diagram describing the universal property for quotients of monoids commutes.

                                                                                                  @[simp]
                                                                                                  theorem AddCon.lift_comp_mk' {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} {f : M →+ P} (H : c AddCon.ker f) :

                                                                                                  The diagram describing the universal property for quotients of AddMonoids commutes.

                                                                                                  @[simp]
                                                                                                  theorem Con.lift_comp_mk' {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} {f : M →* P} (H : c Con.ker f) :

                                                                                                  The diagram describing the universal property for quotients of monoids commutes.

                                                                                                  @[simp]
                                                                                                  theorem AddCon.lift_apply_mk' {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} (f : AddCon.Quotient c →+ P) :
                                                                                                  AddCon.lift c (AddMonoidHom.comp f (AddCon.mk' c)) (_ : ∀ (x y : M), c x yf x = f y) = f

                                                                                                  Given a homomorphism f from the quotient of an AddMonoid by an additive congruence relation, f equals the homomorphism on the quotient induced by f composed with the natural map from the AddMonoid to the quotient.

                                                                                                  @[simp]
                                                                                                  theorem Con.lift_apply_mk' {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} (f : Con.Quotient c →* P) :
                                                                                                  Con.lift c (MonoidHom.comp f (Con.mk' c)) (_ : ∀ (x y : M), c x yf x = f y) = f

                                                                                                  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.

                                                                                                  theorem AddCon.lift_funext {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} (f : AddCon.Quotient c →+ P) (g : AddCon.Quotient c →+ P) (h : ∀ (a : M), f a = g a) :
                                                                                                  f = g

                                                                                                  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 Con.lift_funext {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} (f : Con.Quotient c →* P) (g : Con.Quotient c →* P) (h : ∀ (a : M), f a = g a) :
                                                                                                  f = g

                                                                                                  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.

                                                                                                  theorem AddCon.lift_unique {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} {f : M →+ P} (H : c AddCon.ker f) (g : AddCon.Quotient c →+ P) (Hg : AddMonoidHom.comp g (AddCon.mk' c) = f) :
                                                                                                  g = AddCon.lift c f H

                                                                                                  The uniqueness part of the universal property for quotients of AddMonoids.

                                                                                                  theorem Con.lift_unique {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} {f : M →* P} (H : c Con.ker f) (g : Con.Quotient c →* P) (Hg : MonoidHom.comp g (Con.mk' c) = f) :
                                                                                                  g = Con.lift c f H

                                                                                                  The uniqueness part of the universal property for quotients of monoids.

                                                                                                  theorem AddCon.lift_range {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} {f : M →+ P} (H : c AddCon.ker f) :

                                                                                                  Given an additive congruence relation c on an AddMonoid and a homomorphism f constant on c's equivalence classes, f has the same image as the homomorphism that f induces on the quotient.

                                                                                                  abbrev AddCon.lift_range.match_1 {M : Type u_2} {P : Type u_1} [AddZeroClass M] [AddZeroClass P] {f : M →+ P} (x : P) (motive : x AddMonoidHom.mrange fProp) :
                                                                                                  (x : x AddMonoidHom.mrange f) → ((y : M) → (hy : f y = x) → motive (_ : y, f y = x)) → motive x
                                                                                                  Equations
                                                                                                  Instances For
                                                                                                    theorem Con.lift_range {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} {f : M →* P} (H : c Con.ker f) :

                                                                                                    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.

                                                                                                    theorem AddCon.lift_surjective_of_surjective {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {c : AddCon M} {f : M →+ P} (h : c AddCon.ker f) (hf : Function.Surjective f) :

                                                                                                    Surjective AddMonoid homomorphisms constant on an additive congruence relation c's equivalence classes induce a surjective homomorphism on c's quotient.

                                                                                                    theorem Con.lift_surjective_of_surjective {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {c : Con M} {f : M →* P} (h : c Con.ker f) (hf : Function.Surjective f) :

                                                                                                    Surjective monoid homomorphisms constant on a congruence relation c's equivalence classes induce a surjective homomorphism on c's quotient.

                                                                                                    theorem AddCon.ker_eq_lift_of_injective {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (c : AddCon M) (f : M →+ P) (H : c AddCon.ker f) (h : Function.Injective ↑(AddCon.lift c f H)) :

                                                                                                    Given an AddMonoid homomorphism f from M to P, the kernel of f is the unique additive congruence relation on M whose induced map from the quotient of M to P is injective.

                                                                                                    theorem Con.ker_eq_lift_of_injective {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (c : Con M) (f : M →* P) (H : c Con.ker f) (h : Function.Injective ↑(Con.lift c f H)) :

                                                                                                    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.

                                                                                                    theorem AddCon.kerLift.proof_1 {M : Type u_1} {P : Type u_2} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) :
                                                                                                    (x x_1 : M) → ↑(AddCon.ker f) x x_1↑(AddCon.ker f) x x_1
                                                                                                    def AddCon.kerLift {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) :

                                                                                                    The homomorphism induced on the quotient of an AddMonoid by the kernel of an AddMonoid homomorphism.

                                                                                                    Equations
                                                                                                    Instances For
                                                                                                      def Con.kerLift {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) :

                                                                                                      The homomorphism induced on the quotient of a monoid by the kernel of a monoid homomorphism.

                                                                                                      Equations
                                                                                                      Instances For
                                                                                                        @[simp]
                                                                                                        theorem AddCon.kerLift_mk {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] {f : M →+ P} (x : M) :
                                                                                                        ↑(AddCon.kerLift f) x = f x

                                                                                                        The diagram described by the universal property for quotients of AddMonoids, when the additive congruence relation is the kernel of the homomorphism, commutes.

                                                                                                        @[simp]
                                                                                                        theorem Con.kerLift_mk {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] {f : M →* P} (x : M) :
                                                                                                        ↑(Con.kerLift f) x = f x

                                                                                                        The diagram described by the universal property for quotients of monoids, when the congruence relation is the kernel of the homomorphism, commutes.

                                                                                                        @[simp]

                                                                                                        Given an AddMonoid homomorphism f, the induced homomorphism on the quotient by f's kernel has the same image as f.

                                                                                                        @[simp]

                                                                                                        Given a monoid homomorphism f, the induced homomorphism on the quotient by f's kernel has the same image as f.

                                                                                                        An AddMonoid homomorphism f induces an injective homomorphism on the quotient by f's kernel.

                                                                                                        theorem Con.kerLift_injective {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) :

                                                                                                        A monoid homomorphism f induces an injective homomorphism on the quotient by f's kernel.

                                                                                                        def AddCon.map {M : Type u_1} [AddZeroClass M] (c : AddCon M) (d : AddCon M) (h : c d) :

                                                                                                        Given additive congruence relations c, d on an AddMonoid such that d contains c, d's quotient map induces a homomorphism from the quotient by c to the quotient by d.

                                                                                                        Equations
                                                                                                        Instances For
                                                                                                          theorem AddCon.map.proof_1 {M : Type u_1} [AddZeroClass M] (c : AddCon M) (d : AddCon M) (h : c d) (x : M) (y : M) (hc : c x y) :
                                                                                                          ↑(AddCon.ker (AddCon.mk' d)) x y
                                                                                                          def Con.map {M : Type u_1} [MulOneClass M] (c : Con M) (d : Con M) (h : c d) :

                                                                                                          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.

                                                                                                          Equations
                                                                                                          Instances For
                                                                                                            theorem AddCon.map_apply {M : Type u_1} [AddZeroClass M] {c : AddCon M} {d : AddCon M} (h : c d) (x : AddCon.Quotient c) :
                                                                                                            ↑(AddCon.map c d h) x = ↑(AddCon.lift c (AddCon.mk' d) (_ : ∀ (x x_1 : M), c x x_1x = x_1)) x

                                                                                                            Given additive congruence relations c, d on an AddMonoid 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.

                                                                                                            theorem Con.map_apply {M : Type u_1} [MulOneClass M] {c : Con M} {d : Con M} (h : c d) (x : Con.Quotient c) :
                                                                                                            ↑(Con.map c d h) x = ↑(Con.lift c (Con.mk' d) (_ : ∀ (x x_1 : M), c x x_1x = x_1)) x

                                                                                                            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.

                                                                                                            noncomputable def AddCon.quotientKerEquivRange {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) :

                                                                                                            The first isomorphism theorem for AddMonoids.

                                                                                                            Equations
                                                                                                            • One or more equations did not get rendered due to their size.
                                                                                                            Instances For
                                                                                                              abbrev AddCon.quotientKerEquivRange.match_1 {M : Type u_2} {P : Type u_1} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (motive : { x // x AddMonoidHom.mrange (AddCon.kerLift f) }Prop) :
                                                                                                              (x : { x // x AddMonoidHom.mrange (AddCon.kerLift f) }) → ((w : P) → (z : AddCon.Quotient (AddCon.ker f)) → (hz : ↑(AddCon.kerLift f) z = w) → motive { val := w, property := (_ : y, ↑(AddCon.kerLift f) y = w) }) → motive x
                                                                                                              Equations
                                                                                                              Instances For
                                                                                                                noncomputable def Con.quotientKerEquivRange {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) :

                                                                                                                The first isomorphism theorem for monoids.

                                                                                                                Equations
                                                                                                                • One or more equations did not get rendered due to their size.
                                                                                                                Instances For
                                                                                                                  theorem AddCon.quotientKerEquivOfRightInverse.proof_1 {M : Type u_1} {P : Type u_2} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (g : PM) (hf : Function.RightInverse g f) (x : AddCon.Quotient (AddCon.ker f)) :
                                                                                                                  theorem AddCon.quotientKerEquivOfRightInverse.proof_2 {M : Type u_2} {P : Type u_1} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (g : PM) (hf : Function.RightInverse g f) (x : P) :
                                                                                                                  def AddCon.quotientKerEquivOfRightInverse {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (g : PM) (hf : Function.RightInverse g f) :

                                                                                                                  The first isomorphism theorem for AddMonoids in the case of a homomorphism with right inverse.

                                                                                                                  Equations
                                                                                                                  • One or more equations did not get rendered due to their size.
                                                                                                                  Instances For
                                                                                                                    @[simp]
                                                                                                                    theorem AddCon.quotientKerEquivOfRightInverse_symm_apply {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (g : PM) (hf : Function.RightInverse g f) :
                                                                                                                    @[simp]
                                                                                                                    theorem Con.quotientKerEquivOfRightInverse_symm_apply {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) (g : PM) (hf : Function.RightInverse g f) :
                                                                                                                    @[simp]
                                                                                                                    theorem Con.quotientKerEquivOfRightInverse_apply {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) (g : PM) (hf : Function.RightInverse g f) (a : Con.Quotient (Con.ker f)) :
                                                                                                                    @[simp]
                                                                                                                    theorem AddCon.quotientKerEquivOfRightInverse_apply {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (g : PM) (hf : Function.RightInverse g f) (a : AddCon.Quotient (AddCon.ker f)) :
                                                                                                                    def Con.quotientKerEquivOfRightInverse {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) (g : PM) (hf : Function.RightInverse g f) :

                                                                                                                    The first isomorphism theorem for monoids in the case of a homomorphism with right inverse.

                                                                                                                    Equations
                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                    Instances For
                                                                                                                      noncomputable def AddCon.quotientKerEquivOfSurjective {M : Type u_1} {P : Type u_3} [AddZeroClass M] [AddZeroClass P] (f : M →+ P) (hf : Function.Surjective f) :

                                                                                                                      The first isomorphism theorem for AddMonoids in the case of a surjective homomorphism.

                                                                                                                      For a computable version, see AddCon.quotientKerEquivOfRightInverse.

                                                                                                                      Equations
                                                                                                                      • One or more equations did not get rendered due to their size.
                                                                                                                      Instances For
                                                                                                                        noncomputable def Con.quotientKerEquivOfSurjective {M : Type u_1} {P : Type u_3} [MulOneClass M] [MulOneClass P] (f : M →* P) (hf : Function.Surjective f) :

                                                                                                                        The first isomorphism theorem for Monoids in the case of a surjective homomorphism.

                                                                                                                        For a computable version, see Con.quotientKerEquivOfRightInverse.

                                                                                                                        Equations
                                                                                                                        • One or more equations did not get rendered due to their size.
                                                                                                                        Instances For
                                                                                                                          noncomputable def AddCon.comapQuotientEquiv {M : Type u_1} {N : Type u_2} [AddZeroClass M] [AddZeroClass N] (c : AddCon M) (f : N →+ M) :
                                                                                                                          AddCon.Quotient (AddCon.comap f (_ : ∀ (a b : N), f (a + b) = f a + f b) c) ≃+ { x // x AddMonoidHom.mrange (AddMonoidHom.comp (AddCon.mk' c) f) }

                                                                                                                          The second isomorphism theorem for AddMonoids.

                                                                                                                          Equations
                                                                                                                          • One or more equations did not get rendered due to their size.
                                                                                                                          Instances For
                                                                                                                            noncomputable def Con.comapQuotientEquiv {M : Type u_1} {N : Type u_2} [MulOneClass M] [MulOneClass N] (c : Con M) (f : N →* M) :
                                                                                                                            Con.Quotient (Con.comap f (_ : ∀ (a b : N), f (a * b) = f a * f b) c) ≃* { x // x MonoidHom.mrange (MonoidHom.comp (Con.mk' c) f) }

                                                                                                                            The second isomorphism theorem for monoids.

                                                                                                                            Equations
                                                                                                                            • One or more equations did not get rendered due to their size.
                                                                                                                            Instances For
                                                                                                                              theorem AddCon.quotientQuotientEquivQuotient.proof_2 {M : Type u_1} [AddZeroClass M] (c : AddCon M) (d : AddCon M) (h : c d) :
                                                                                                                              Function.RightInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun
                                                                                                                              theorem AddCon.quotientQuotientEquivQuotient.proof_1 {M : Type u_1} [AddZeroClass M] (c : AddCon M) (d : AddCon M) (h : c d) :
                                                                                                                              Function.LeftInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun
                                                                                                                              theorem AddCon.quotientQuotientEquivQuotient.proof_3 {M : Type u_1} [AddZeroClass M] (c : AddCon M) (d : AddCon M) (h : c d) (x : AddCon.Quotient (AddCon.ker (AddCon.map c d h))) (y : AddCon.Quotient (AddCon.ker (AddCon.map c d h))) :
                                                                                                                              Equiv.toFun { toFun := (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun, invFun := (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun, left_inv := (_ : Function.LeftInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun), right_inv := (_ : Function.RightInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun) } (x + y) = Equiv.toFun { toFun := (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun, invFun := (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun, left_inv := (_ : Function.LeftInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun), right_inv := (_ : Function.RightInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun) } x + Equiv.toFun { toFun := (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun, invFun := (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun, left_inv := (_ : Function.LeftInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun), right_inv := (_ : Function.RightInverse (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).invFun (Setoid.quotientQuotientEquivQuotient c.toSetoid d.toSetoid h).toFun) } y

                                                                                                                              The third isomorphism theorem for AddMonoids.

                                                                                                                              Equations
                                                                                                                              • One or more equations did not get rendered due to their size.
                                                                                                                              Instances For
                                                                                                                                def Con.quotientQuotientEquivQuotient {M : Type u_1} [MulOneClass M] (c : Con M) (d : Con M) (h : c d) :

                                                                                                                                The third isomorphism theorem for monoids.

                                                                                                                                Equations
                                                                                                                                • One or more equations did not get rendered due to their size.
                                                                                                                                Instances For
                                                                                                                                  theorem AddCon.nsmul {M : Type u_4} [AddMonoid M] (c : AddCon M) (n : ) {w : M} {x : M} :
                                                                                                                                  c w xc (n w) (n x)

                                                                                                                                  Additive congruence relations preserve natural scaling.

                                                                                                                                  abbrev AddCon.nsmul.match_1 {M : Type u_1} [AddMonoid M] (c : AddCon M) (motive : (x x_1 : M) → c x x_1Prop) :
                                                                                                                                  (x : ) → (x_1 x_2 : M) → (x_3 : c x_1 x_2) → ((w x : M) → (x_4 : c w x) → motive 0 w x x_4) → ((n : ) → (w x : M) → (h : c w x) → motive (Nat.succ n) w x h) → motive x x_1 x_2 x_3
                                                                                                                                  Equations
                                                                                                                                  Instances For
                                                                                                                                    theorem Con.pow {M : Type u_4} [Monoid M] (c : Con M) (n : ) {w : M} {x : M} :
                                                                                                                                    c w xc (w ^ n) (x ^ n)

                                                                                                                                    Multiplicative congruence relations preserve natural powers.

                                                                                                                                    instance AddCon.zero {M : Type u_1} [AddZeroClass M] (c : AddCon M) :
                                                                                                                                    Equations
                                                                                                                                    instance Con.one {M : Type u_1} [MulOneClass M] (c : Con M) :
                                                                                                                                    Equations
                                                                                                                                    theorem AddCon.vadd {α : Type u_4} {M : Type u_5} [AddZeroClass M] [VAdd α M] [VAddAssocClass α M M] (c : AddCon M) (a : α) {w : M} {x : M} (h : c w x) :
                                                                                                                                    c (a +ᵥ w) (a +ᵥ x)
                                                                                                                                    theorem Con.smul {α : Type u_4} {M : Type u_5} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α) {w : M} {x : M} (h : c w x) :
                                                                                                                                    c (a w) (a x)
                                                                                                                                    instance AddCon.Quotient.nsmul {M : Type u_4} [AddMonoid M] (c : AddCon M) :
                                                                                                                                    Equations
                                                                                                                                    Equations

                                                                                                                                    The quotient of an AddSemigroup by an additive congruence relation is an AddSemigroup.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                                    theorem AddCon.addSemigroup.proof_3 {M : Type u_1} [AddSemigroup M] (c : AddCon M) (a : AddCon.Quotient c) (b : AddCon.Quotient c) (c : AddCon.Quotient c) :
                                                                                                                                    a + b + c = a + (b + c)
                                                                                                                                    theorem AddCon.addSemigroup.proof_2 {M : Type u_1} [AddSemigroup M] (c : AddCon M) :
                                                                                                                                    ∀ (x x_1 : M), Quotient.mk'' (x + x_1) = Quotient.mk'' (x + x_1)
                                                                                                                                    instance Con.semigroup {M : Type u_4} [Semigroup M] (c : Con M) :

                                                                                                                                    The quotient of a semigroup by a congruence relation is a semigroup.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.

                                                                                                                                    The quotient of an AddCommSemigroup by an additive congruence relation is an AddCommSemigroup.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                                    theorem AddCon.addCommSemigroup.proof_2 {M : Type u_1} [AddCommSemigroup M] (c : AddCon M) :
                                                                                                                                    ∀ (x x_1 : M), Quotient.mk'' (x + x_1) = Quotient.mk'' (x + x_1)

                                                                                                                                    The quotient of a commutative semigroup by a congruence relation is a semigroup.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                                    theorem AddCon.addMonoid.proof_3 {M : Type u_1} [AddMonoid M] (c : AddCon M) :
                                                                                                                                    ∀ (x x_1 : M), Quotient.mk'' (x + x_1) = Quotient.mk'' (x + x_1)
                                                                                                                                    theorem AddCon.addMonoid.proof_6 {M : Type u_1} [AddMonoid M] (c : AddCon M) (a : AddCon.Quotient c) :
                                                                                                                                    a + 0 = a
                                                                                                                                    instance AddCon.addMonoid {M : Type u_4} [AddMonoid M] (c : AddCon M) :

                                                                                                                                    The quotient of an AddMonoid by an additive congruence relation is an AddMonoid.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                                    theorem AddCon.addMonoid.proof_5 {M : Type u_1} [AddMonoid M] (c : AddCon M) (a : AddCon.Quotient c) :
                                                                                                                                    0 + a = a
                                                                                                                                    theorem AddCon.addMonoid.proof_8 {M : Type u_1} [AddMonoid M] (c : AddCon M) (n : ) (x : AddCon.Quotient c) :
                                                                                                                                    theorem AddCon.addMonoid.proof_1 {M : Type u_1} [AddMonoid M] (c : AddCon M) :
                                                                                                                                    Function.Surjective Quotient.mk''
                                                                                                                                    theorem AddCon.addMonoid.proof_4 {M : Type u_1} [AddMonoid M] (c : AddCon M) :
                                                                                                                                    ∀ (x : M) (x_1 : ), Quotient.mk'' (x_1 x) = Quotient.mk'' (x_1 x)
                                                                                                                                    instance Con.monoid {M : Type u_4} [Monoid M] (c : Con M) :

                                                                                                                                    The quotient of a monoid by a congruence relation is a monoid.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.

                                                                                                                                    The quotient of an AddCommMonoid by an additive congruence relation is an AddCommMonoid.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                                    theorem AddCon.addCommMonoid.proof_4 {M : Type u_1} [AddCommMonoid M] (c : AddCon M) :
                                                                                                                                    ∀ (x : M) (x_1 : ), Quotient.mk'' (x_1 x) = Quotient.mk'' (x_1 x)
                                                                                                                                    theorem AddCon.addCommMonoid.proof_3 {M : Type u_1} [AddCommMonoid M] (c : AddCon M) :
                                                                                                                                    ∀ (x x_1 : M), Quotient.mk'' (x + x_1) = Quotient.mk'' (x + x_1)
                                                                                                                                    theorem AddCon.addCommMonoid.proof_5 {M : Type u_1} [AddCommMonoid M] (c : AddCon M) (a : AddCon.Quotient c) (b : AddCon.Quotient c) :
                                                                                                                                    a + b = b + a
                                                                                                                                    instance Con.commMonoid {M : Type u_4} [CommMonoid M] (c : Con M) :

                                                                                                                                    The quotient of a CommMonoid by a congruence relation is a CommMonoid.

                                                                                                                                    Equations
                                                                                                                                    • One or more equations did not get rendered due to their size.
                                                                                                                                    theorem AddCon.map_of_add_left_rel_zero {M : Type u_1} [AddMonoid M] (c : AddCon M) (f : MM) (hf : (x : M) → c (f x + x) 0) {x : M} {y : M} (h : c x y) :
                                                                                                                                    c (f x) (f y)

                                                                                                                                    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 Con.map_of_mul_left_rel_one {M : Type u_1} [Monoid M] (c : Con M) (f : MM) (hf : (x : M) → c (f x * x) 1) {x : M} {y : M} (h : c x y) :
                                                                                                                                    c (f x) (f y)

                                                                                                                                    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.

                                                                                                                                    theorem AddCon.neg {M : Type u_1} [AddGroup M] (c : AddCon M) {x : M} {y : M} (h : c x y) :
                                                                                                                                    c (-x) (-y)

                                                                                                                                    Additive congruence relations preserve negation.

                                                                                                                                    theorem Con.inv {M : Type u_1} [Group M] (c : Con M) {x : M} {y : M} (h : c x y) :
                                                                                                                                    c x⁻¹ y⁻¹

                                                                                                                                    Multiplicative congruence relations preserve inversion.

                                                                                                                                    theorem AddCon.sub {M : Type u_1} [AddGroup M] (c : AddCon M) {w : M} {x : M} {y : M} {z : M} :
                                                                                                                                    c w xc y zc (w - y) (x - z)

                                                                                                                                    Additive congruence relations preserve subtraction.

                                                                                                                                    theorem Con.div {M : Type u_1} [Group M] (c : Con M) {w : M} {x : M} {y : M} {z : M} :
                                                                                                                                    c w xc y zc (w / y) (x / z)

                                                                                                                                    Multiplicative congruence relations preserve division.

                                                                                                                                    abbrev AddCon.zsmul.match_1 {M : Type u_1} [AddGroup M] (c : AddCon M) (motive : (x x_1 : M) → c x x_1Prop) :
                                                                                                                                    (x : ) → (x_1 x_2 : M) → (x_3 : c x_1 x_2) → ((n : ) → (w x : M) → (h : c w x) → motive (Int.ofNat n) w x h) → ((n : ) → (w x : M) → (h : c w x) → motive (Int.negSucc n) w x h) → motive x x_1 x_2 x_3
                                                                                                                                    Equations
                                                                                                                                    Instances For
                                                                                                                                      theorem AddCon.zsmul {M : Type u_1} [AddGroup M] (c : AddCon M) (n : ) {w : M} {x : M} :
                                                                                                                                      c w xc (n w) (n x)

                                                                                                                                      Additive congruence relations preserve integer scaling.

                                                                                                                                      theorem Con.zpow {M : Type u_1} [Group M] (c : Con M) (n : ) {w : M} {x : M} :
                                                                                                                                      c w xc (w ^ n) (x ^ n)

                                                                                                                                      Multiplicative congruence relations preserve integer powers.

                                                                                                                                      instance AddCon.hasNeg {M : Type u_1} [AddGroup M] (c : AddCon M) :

                                                                                                                                      The negation induced on the quotient by an additive congruence relation on a type with a negation.

                                                                                                                                      Equations
                                                                                                                                      instance Con.hasInv {M : Type u_1} [Group M] (c : Con M) :

                                                                                                                                      The inversion induced on the quotient by a congruence relation on a type with an inversion.

                                                                                                                                      Equations
                                                                                                                                      instance AddCon.hasSub {M : Type u_1} [AddGroup M] (c : AddCon M) :

                                                                                                                                      The subtraction induced on the quotient by an additive congruence relation on a type with a subtraction.

                                                                                                                                      Equations
                                                                                                                                      instance Con.hasDiv {M : Type u_1} [Group M] (c : Con M) :

                                                                                                                                      The division induced on the quotient by a congruence relation on a type with a division.

                                                                                                                                      Equations
                                                                                                                                      instance AddCon.Quotient.zsmul {M : Type u_4} [AddGroup M] (c : AddCon M) :

                                                                                                                                      The integer scaling induced on the quotient by a congruence relation on a type with a subtraction.

                                                                                                                                      Equations
                                                                                                                                      instance Con.zpowinst {M : Type u_1} [Group M] (c : Con M) :

                                                                                                                                      The integer power induced on the quotient by a congruence relation on a type with a division.

                                                                                                                                      Equations
                                                                                                                                      theorem AddCon.addGroup.proof_12 {M : Type u_1} [AddGroup M] (c : AddCon M) (a : AddCon.Quotient c) :
                                                                                                                                      -a + a = 0
                                                                                                                                      theorem AddCon.addGroup.proof_7 {M : Type u_1} [AddGroup M] (c : AddCon M) :
                                                                                                                                      ∀ (x : M) (x_1 : ), Quotient.mk'' (x_1 x) = Quotient.mk'' (x_1 x)
                                                                                                                                      theorem AddCon.addGroup.proof_8 {M : Type u_1} [AddGroup M] (c : AddCon M) (a : AddCon.Quotient c) (b : AddCon.Quotient c) :
                                                                                                                                      a - b = a + -b
                                                                                                                                      theorem AddCon.addGroup.proof_5 {M : Type u_1} [AddGroup M] (c : AddCon M) :
                                                                                                                                      ∀ (x x_1 : M), Quotient.mk'' (x - x_1) = Quotient.mk'' (x - x_1)
                                                                                                                                      theorem AddCon.addGroup.proof_6 {M : Type u_1} [AddGroup M] (c : AddCon M) :
                                                                                                                                      ∀ (x : M) (x_1 : ), Quotient.mk'' (x_1 x) = Quotient.mk'' (x_1 x)
                                                                                                                                      theorem AddCon.addGroup.proof_4 {M : Type u_1} [AddGroup M] (c : AddCon M) :
                                                                                                                                      ∀ (x : M), Quotient.mk'' (-x) = Quotient.mk'' (-x)
                                                                                                                                      theorem AddCon.addGroup.proof_1 {M : Type u_1} [AddGroup M] (c : AddCon M) :
                                                                                                                                      Function.Surjective Quotient.mk''
                                                                                                                                      instance AddCon.addGroup {M : Type u_1} [AddGroup M] (c : AddCon M) :

                                                                                                                                      The quotient of an AddGroup by an additive congruence relation is an AddGroup.

                                                                                                                                      Equations
                                                                                                                                      • One or more equations did not get rendered due to their size.
                                                                                                                                      theorem AddCon.addGroup.proof_3 {M : Type u_1} [AddGroup M] (c : AddCon M) :
                                                                                                                                      ∀ (x x_1 : M), Quotient.mk'' (x + x_1) = Quotient.mk'' (x + x_1)
                                                                                                                                      instance Con.group {M : Type u_1} [Group M] (c : Con M) :

                                                                                                                                      The quotient of a group by a congruence relation is a group.

                                                                                                                                      Equations
                                                                                                                                      • One or more equations did not get rendered due to their size.
                                                                                                                                      theorem AddCon.liftOnAddUnits.proof_2 {M : Type u_1} [AddMonoid M] {c : AddCon M} (x : M) (y : M) (hyx : y + x = 0) :
                                                                                                                                      c (y + x) 0
                                                                                                                                      theorem AddCon.liftOnAddUnits.proof_3 {M : Type u_1} {α : Type u_2} [AddMonoid M] {c : AddCon M} (f : (x y : M) → c (x + y) 0c (y + x) 0α) (Hf : ∀ (x y : M) (hxy : c (x + y) 0) (hyx : c (y + x) 0) (x' y' : M) (hxy' : c (x' + y') 0) (hyx' : c (y' + x') 0), c x x'c y y'f x y hxy hyx = f x' y' hxy' hyx') (x : M) (y : M) (x' : M) (y' : M) (hx : c x x') (hy : c y y') :
                                                                                                                                      HEq ((fun x y hxy hyx => f x y (_ : c (x + y) 0) (_ : c (y + x) 0)) x y) ((fun x y hxy hyx => f x y (_ : c (x + y) 0) (_ : c (y + x) 0)) x' y')
                                                                                                                                      def AddCon.liftOnAddUnits {M : Type u_1} {α : Type u_4} [AddMonoid M] {c : AddCon M} (u : AddUnits (AddCon.Quotient c)) (f : (x y : M) → c (x + y) 0c (y + x) 0α) (Hf : ∀ (x y : M) (hxy : c (x + y) 0) (hyx : c (y + x) 0) (x' y' : M) (hxy' : c (x' + y') 0) (hyx' : c (y' + x') 0), c x x'c y y'f x y hxy hyx = f x' y' hxy' hyx') :
                                                                                                                                      α

                                                                                                                                      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'.

                                                                                                                                      Equations
                                                                                                                                      • One or more equations did not get rendered due to their size.
                                                                                                                                      Instances For
                                                                                                                                        theorem AddCon.liftOnAddUnits.proof_1 {M : Type u_1} [AddMonoid M] {c : AddCon M} (x : M) (y : M) (hxy : x + y = 0) :
                                                                                                                                        c (x + y) 0
                                                                                                                                        theorem AddCon.liftOnAddUnits.proof_4 {M : Type u_1} [AddMonoid M] {c : AddCon M} (u : AddUnits (AddCon.Quotient c)) :
                                                                                                                                        u + u.neg = 0
                                                                                                                                        theorem AddCon.liftOnAddUnits.proof_5 {M : Type u_1} [AddMonoid M] {c : AddCon M} (u : AddUnits (AddCon.Quotient c)) :
                                                                                                                                        u.neg + u = 0
                                                                                                                                        def Con.liftOnUnits {M : Type u_1} {α : Type u_4} [Monoid M] {c : Con M} (u : (Con.Quotient c)ˣ) (f : (x y : M) → c (x * y) 1c (y * x) 1α) (Hf : ∀ (x y : M) (hxy : c (x * y) 1) (hyx : c (y * x) 1) (x' y' : M) (hxy' : c (x' * y') 1) (hyx' : c (y' * x') 1), c x x'c y y'f x y hxy hyx = f x' y' hxy' hyx') :
                                                                                                                                        α

                                                                                                                                        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'.

                                                                                                                                        Equations
                                                                                                                                        • One or more equations did not get rendered due to their size.
                                                                                                                                        Instances For
                                                                                                                                          @[simp]
                                                                                                                                          theorem AddCon.liftOnAddUnits_mk {M : Type u_1} {α : Type u_4} [AddMonoid M] {c : AddCon M} (f : (x y : M) → c (x + y) 0c (y + x) 0α) (Hf : ∀ (x y : M) (hxy : c (x + y) 0) (hyx : c (y + x) 0) (x' y' : M) (hxy' : c (x' + y') 0) (hyx' : c (y' + x') 0), c x x'c y y'f x y hxy hyx = f x' y' hxy' hyx') (x : M) (y : M) (hxy : x + y = 0) (hyx : y + x = 0) :
                                                                                                                                          AddCon.liftOnAddUnits { val := x, neg := y, val_neg := hxy, neg_val := hyx } f Hf = f x y (_ : c (x + y) 0) (_ : c (y + x) 0)
                                                                                                                                          @[simp]
                                                                                                                                          theorem Con.liftOnUnits_mk {M : Type u_1} {α : Type u_4} [Monoid M] {c : Con M} (f : (x y : M) → c (x * y) 1c (y * x) 1α) (Hf : ∀ (x y : M) (hxy : c (x * y) 1) (hyx : c (y * x) 1) (x' y' : M) (hxy' : c (x' * y') 1) (hyx' : c (y' * x') 1), c x x'c y y'f x y hxy hyx = f x' y' hxy' hyx') (x : M) (y : M) (hxy : x * y = 1) (hyx : y * x = 1) :
                                                                                                                                          Con.liftOnUnits { val := x, inv := y, val_inv := hxy, inv_val := hyx } f Hf = f x y (_ : c (x * y) 1) (_ : c (y * x) 1)
                                                                                                                                          theorem AddCon.induction_on_addUnits {M : Type u_1} [AddMonoid M] {c : AddCon M} {p : AddUnits (AddCon.Quotient c)Prop} (u : AddUnits (AddCon.Quotient c)) (H : (x y : M) → (hxy : c (x + y) 0) → (hyx : c (y + x) 0) → p { val := x, neg := y, val_neg := (_ : ↑((fun x x_1 => x + x_1) x y) = 0), neg_val := (_ : ↑((fun x x_1 => x + x_1) y x) = 0) }) :
                                                                                                                                          p u
                                                                                                                                          theorem Con.induction_on_units {M : Type u_1} [Monoid M] {c : Con M} {p : (Con.Quotient c)ˣProp} (u : (Con.Quotient c)ˣ) (H : (x y : M) → (hxy : c (x * y) 1) → (hyx : c (y * x) 1) → p { val := x, inv := y, val_inv := (_ : ↑((fun x x_1 => x * x_1) x y) = 1), inv_val := (_ : ↑((fun x x_1 => x * x_1) y x) = 1) }) :
                                                                                                                                          p u
                                                                                                                                          instance AddCon.instVAdd {α : Type u_4} {M : Type u_5} [AddZeroClass M] [VAdd α M] [VAddAssocClass α M M] (c : AddCon M) :
                                                                                                                                          Equations
                                                                                                                                          instance Con.instSMul {α : Type u_4} {M : Type u_5} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) :
                                                                                                                                          Equations
                                                                                                                                          theorem AddCon.coe_vadd {α : Type u_4} {M : Type u_5} [AddZeroClass M] [VAdd α M] [VAddAssocClass α M M] (c : AddCon M) (a : α) (x : M) :
                                                                                                                                          ↑(a +ᵥ x) = a +ᵥ x
                                                                                                                                          theorem Con.coe_smul {α : Type u_4} {M : Type u_5} [MulOneClass M] [SMul α M] [IsScalarTower α M M] (c : Con M) (a : α) (x : M) :
                                                                                                                                          ↑(a x) = a x
                                                                                                                                          instance AddCon.addAction {α : Type u_4} {M : Type u_5} [AddMonoid α] [AddZeroClass M] [AddAction α M] [VAddAssocClass α M M] (c : AddCon M) :
                                                                                                                                          Equations
                                                                                                                                          theorem AddCon.addAction.proof_1 {α : Type u_2} {M : Type u_1} [AddMonoid α] [AddZeroClass M] [AddAction α M] [VAddAssocClass α M M] (c : AddCon M) (q : Quotient c.toSetoid) :
                                                                                                                                          0 +ᵥ q = q
                                                                                                                                          theorem AddCon.addAction.proof_2 {α : Type u_2} {M : Type u_1} [AddMonoid α] [AddZeroClass M] [AddAction α M] [VAddAssocClass α M M] (c : AddCon M) :
                                                                                                                                          ∀ (x x_1 : α) (q : Quotient c.toSetoid), x + x_1 +ᵥ q = x +ᵥ (x_1 +ᵥ q)
                                                                                                                                          instance Con.mulAction {α : Type u_4} {M : Type u_5} [Monoid α] [MulOneClass M] [MulAction α M] [IsScalarTower α M M] (c : Con M) :
                                                                                                                                          Equations
                                                                                                                                          instance Con.mulDistribMulAction {α : Type u_4} {M : Type u_5} [Monoid α] [Monoid M] [MulDistribMulAction α M] [IsScalarTower α M M] (c : Con M) :
                                                                                                                                          Equations
                                                                                                                                          • One or more equations did not get rendered due to their size.