HepLean Documentation

Mathlib.Algebra.Group.Submonoid.Basic

Submonoids: CompleteLattice structure #

This file defines a CompleteLattice structure on Submonoids, define the closure of a set as the minimal submonoid that includes this set, and prove a few results about extending properties from a dense set (i.e. a set with closure s = ⊤) to the whole monoid, see Submonoid.dense_induction and MonoidHom.ofClosureEqTopLeft/MonoidHom.ofClosureEqTopRight.

Main definitions #

For each of the following definitions in the Submonoid namespace, there is a corresponding definition in the AddSubmonoid namespace.

Implementation notes #

Submonoid inclusion is denoted rather than , although is defined as membership of a submonoid's underlying set.

Note that Submonoid M does not actually require Monoid M, instead requiring only the weaker MulOneClass M.

This file is designed to have very few dependencies. In particular, it should not use natural numbers. Submonoid is implemented by extending Subsemigroup requiring one_mem'.

Tags #

submonoid, submonoids

Equations
  • Submonoid.instInfSet = { sInf := fun (s : Set (Submonoid M)) => { carrier := ts, t, mul_mem' := , one_mem' := } }
Equations
  • AddSubmonoid.instInfSet = { sInf := fun (s : Set (AddSubmonoid M)) => { carrier := ts, t, add_mem' := , zero_mem' := } }
@[simp]
theorem Submonoid.coe_sInf {M : Type u_1} [MulOneClass M] (S : Set (Submonoid M)) :
(sInf S) = sS, s
@[simp]
theorem AddSubmonoid.coe_sInf {M : Type u_1} [AddZeroClass M] (S : Set (AddSubmonoid M)) :
(sInf S) = sS, s
theorem Submonoid.mem_sInf {M : Type u_1} [MulOneClass M] {S : Set (Submonoid M)} {x : M} :
x sInf S pS, x p
theorem AddSubmonoid.mem_sInf {M : Type u_1} [AddZeroClass M] {S : Set (AddSubmonoid M)} {x : M} :
x sInf S pS, x p
theorem Submonoid.mem_iInf {M : Type u_1} [MulOneClass M] {ι : Sort u_4} {S : ιSubmonoid M} {x : M} :
x ⨅ (i : ι), S i ∀ (i : ι), x S i
theorem AddSubmonoid.mem_iInf {M : Type u_1} [AddZeroClass M] {ι : Sort u_4} {S : ιAddSubmonoid M} {x : M} :
x ⨅ (i : ι), S i ∀ (i : ι), x S i
@[simp]
theorem Submonoid.coe_iInf {M : Type u_1} [MulOneClass M] {ι : Sort u_4} {S : ιSubmonoid M} :
(⨅ (i : ι), S i) = ⋂ (i : ι), (S i)
@[simp]
theorem AddSubmonoid.coe_iInf {M : Type u_1} [AddZeroClass M] {ι : Sort u_4} {S : ιAddSubmonoid M} :
(⨅ (i : ι), S i) = ⋂ (i : ι), (S i)

Submonoids of a monoid form a complete lattice.

Equations

The AddSubmonoids of an AddMonoid form a complete lattice.

Equations
def Submonoid.closure {M : Type u_1} [MulOneClass M] (s : Set M) :

The Submonoid generated by a set.

Equations
Instances For

    The AddSubmonoid generated by a set

    Equations
    Instances For
      theorem Submonoid.mem_closure {M : Type u_1} [MulOneClass M] {s : Set M} {x : M} :
      x Submonoid.closure s ∀ (S : Submonoid M), s Sx S
      theorem AddSubmonoid.mem_closure {M : Type u_1} [AddZeroClass M] {s : Set M} {x : M} :
      x AddSubmonoid.closure s ∀ (S : AddSubmonoid M), s Sx S
      @[simp]
      theorem Submonoid.subset_closure {M : Type u_1} [MulOneClass M] {s : Set M} :

      The submonoid generated by a set includes the set.

      @[simp]

      The AddSubmonoid generated by a set includes the set.

      theorem Submonoid.not_mem_of_not_mem_closure {M : Type u_1} [MulOneClass M] {s : Set M} {P : M} (hP : PSubmonoid.closure s) :
      Ps
      theorem AddSubmonoid.not_mem_of_not_mem_closure {M : Type u_1} [AddZeroClass M] {s : Set M} {P : M} (hP : PAddSubmonoid.closure s) :
      Ps
      @[simp]
      theorem Submonoid.closure_le {M : Type u_1} [MulOneClass M] {s : Set M} {S : Submonoid M} :

      A submonoid S includes closure s if and only if it includes s.

      @[simp]
      theorem AddSubmonoid.closure_le {M : Type u_1} [AddZeroClass M] {s : Set M} {S : AddSubmonoid M} :

      An additive submonoid S includes closure s if and only if it includes s

      theorem Submonoid.closure_mono {M : Type u_1} [MulOneClass M] ⦃s t : Set M (h : s t) :

      Submonoid closure of a set is monotone in its argument: if s ⊆ t, then closure s ≤ closure t.

      Additive submonoid closure of a set is monotone in its argument: if s ⊆ t, then closure s ≤ closure t

      theorem Submonoid.closure_eq_of_le {M : Type u_1} [MulOneClass M] {s : Set M} {S : Submonoid M} (h₁ : s S) (h₂ : S Submonoid.closure s) :
      theorem AddSubmonoid.closure_eq_of_le {M : Type u_1} [AddZeroClass M] {s : Set M} {S : AddSubmonoid M} (h₁ : s S) (h₂ : S AddSubmonoid.closure s) :
      theorem Submonoid.closure_induction {M : Type u_1} [MulOneClass M] {s : Set M} {p : (x : M) → x Submonoid.closure sProp} (mem : ∀ (x : M) (h : x s), p x ) (one : p 1 ) (mul : ∀ (x y : M) (hx : x Submonoid.closure s) (hy : y Submonoid.closure s), p x hxp y hyp (x * y) ) {x : M} (hx : x Submonoid.closure s) :
      p x hx

      An induction principle for closure membership. If p holds for 1 and all elements of s, and is preserved under multiplication, then p holds for all elements of the closure of s.

      theorem AddSubmonoid.closure_induction {M : Type u_1} [AddZeroClass M] {s : Set M} {p : (x : M) → x AddSubmonoid.closure sProp} (mem : ∀ (x : M) (h : x s), p x ) (one : p 0 ) (mul : ∀ (x y : M) (hx : x AddSubmonoid.closure s) (hy : y AddSubmonoid.closure s), p x hxp y hyp (x + y) ) {x : M} (hx : x AddSubmonoid.closure s) :
      p x hx

      An induction principle for additive closure membership. If p holds for 0 and all elements of s, and is preserved under addition, then p holds for all elements of the additive closure of s.

      @[deprecated Submonoid.closure_induction]
      theorem Submonoid.closure_induction' {M : Type u_1} [MulOneClass M] {s : Set M} {p : (x : M) → x Submonoid.closure sProp} (mem : ∀ (x : M) (h : x s), p x ) (one : p 1 ) (mul : ∀ (x y : M) (hx : x Submonoid.closure s) (hy : y Submonoid.closure s), p x hxp y hyp (x * y) ) {x : M} (hx : x Submonoid.closure s) :
      p x hx

      Alias of Submonoid.closure_induction.


      An induction principle for closure membership. If p holds for 1 and all elements of s, and is preserved under multiplication, then p holds for all elements of the closure of s.

      theorem Submonoid.closure_induction₂ {M : Type u_1} [MulOneClass M] {s : Set M} {p : (x y : M) → x Submonoid.closure sy Submonoid.closure sProp} (mem : ∀ (x y : M) (hx : x s) (hy : y s), p x y ) (one_left : ∀ (x : M) (hx : x Submonoid.closure s), p 1 x hx) (one_right : ∀ (x : M) (hx : x Submonoid.closure s), p x 1 hx ) (mul_left : ∀ (x y z : M) (hx : x Submonoid.closure s) (hy : y Submonoid.closure s) (hz : z Submonoid.closure s), p x z hx hzp y z hy hzp (x * y) z hz) (mul_right : ∀ (x y z : M) (hx : x Submonoid.closure s) (hy : y Submonoid.closure s) (hz : z Submonoid.closure s), p z x hz hxp z y hz hyp z (x * y) hz ) {x y : M} (hx : x Submonoid.closure s) (hy : y Submonoid.closure s) :
      p x y hx hy

      An induction principle for closure membership for predicates with two arguments.

      theorem AddSubmonoid.closure_induction₂ {M : Type u_1} [AddZeroClass M] {s : Set M} {p : (x y : M) → x AddSubmonoid.closure sy AddSubmonoid.closure sProp} (mem : ∀ (x y : M) (hx : x s) (hy : y s), p x y ) (one_left : ∀ (x : M) (hx : x AddSubmonoid.closure s), p 0 x hx) (one_right : ∀ (x : M) (hx : x AddSubmonoid.closure s), p x 0 hx ) (mul_left : ∀ (x y z : M) (hx : x AddSubmonoid.closure s) (hy : y AddSubmonoid.closure s) (hz : z AddSubmonoid.closure s), p x z hx hzp y z hy hzp (x + y) z hz) (mul_right : ∀ (x y z : M) (hx : x AddSubmonoid.closure s) (hy : y AddSubmonoid.closure s) (hz : z AddSubmonoid.closure s), p z x hz hxp z y hz hyp z (x + y) hz ) {x y : M} (hx : x AddSubmonoid.closure s) (hy : y AddSubmonoid.closure s) :
      p x y hx hy

      An induction principle for additive closure membership for predicates with two arguments.

      theorem Submonoid.dense_induction {M : Type u_1} [MulOneClass M] {p : MProp} (s : Set M) (closure : Submonoid.closure s = ) (mem : xs, p x) (one : p 1) (mul : ∀ (x y : M), p xp yp (x * y)) (x : M) :
      p x

      If s is a dense set in a monoid M, Submonoid.closure s = ⊤, then in order to prove that some predicate p holds for all x : M it suffices to verify p x for x ∈ s, verify p 1, and verify that p x and p y imply p (x * y).

      theorem AddSubmonoid.dense_induction {M : Type u_1} [AddZeroClass M] {p : MProp} (s : Set M) (closure : AddSubmonoid.closure s = ) (mem : xs, p x) (one : p 0) (mul : ∀ (x y : M), p xp yp (x + y)) (x : M) :
      p x

      If s is a dense set in an additive monoid M, AddSubmonoid.closure s = ⊤, then in order to prove that some predicate p holds for all x : M it suffices to verify p x for x ∈ s, verify p 0, and verify that p x and p y imply p (x + y).

      The Submonoid.closure of a set is the union of {1} and its Subsemigroup.closure.

      def Submonoid.gi (M : Type u_1) [MulOneClass M] :
      GaloisInsertion Submonoid.closure SetLike.coe

      closure forms a Galois insertion with the coercion to set.

      Equations
      Instances For
        def AddSubmonoid.gi (M : Type u_1) [AddZeroClass M] :
        GaloisInsertion AddSubmonoid.closure SetLike.coe

        closure forms a Galois insertion with the coercion to set.

        Equations
        Instances For
          @[simp]
          theorem Submonoid.closure_eq {M : Type u_1} [MulOneClass M] (S : Submonoid M) :

          Closure of a submonoid S equals S.

          @[simp]

          Additive closure of an additive submonoid S equals S

          @[simp]
          theorem Submonoid.sup_eq_closure {M : Type u_1} [MulOneClass M] (N N' : Submonoid M) :
          N N' = Submonoid.closure (N N')
          theorem AddSubmonoid.sup_eq_closure {M : Type u_1} [AddZeroClass M] (N N' : AddSubmonoid M) :
          N N' = AddSubmonoid.closure (N N')
          theorem Submonoid.closure_iUnion {M : Type u_1} [MulOneClass M] {ι : Sort u_4} (s : ιSet M) :
          Submonoid.closure (⋃ (i : ι), s i) = ⨆ (i : ι), Submonoid.closure (s i)
          theorem AddSubmonoid.closure_iUnion {M : Type u_1} [AddZeroClass M] {ι : Sort u_4} (s : ιSet M) :
          AddSubmonoid.closure (⋃ (i : ι), s i) = ⨆ (i : ι), AddSubmonoid.closure (s i)
          theorem Submonoid.mem_iSup {M : Type u_1} [MulOneClass M] {ι : Sort u_4} (p : ιSubmonoid M) {m : M} :
          m ⨆ (i : ι), p i ∀ (N : Submonoid M), (∀ (i : ι), p i N)m N
          theorem AddSubmonoid.mem_iSup {M : Type u_1} [AddZeroClass M] {ι : Sort u_4} (p : ιAddSubmonoid M) {m : M} :
          m ⨆ (i : ι), p i ∀ (N : AddSubmonoid M), (∀ (i : ι), p i N)m N
          theorem Submonoid.iSup_eq_closure {M : Type u_1} [MulOneClass M] {ι : Sort u_4} (p : ιSubmonoid M) :
          ⨆ (i : ι), p i = Submonoid.closure (⋃ (i : ι), (p i))
          theorem AddSubmonoid.iSup_eq_closure {M : Type u_1} [AddZeroClass M] {ι : Sort u_4} (p : ιAddSubmonoid M) :
          ⨆ (i : ι), p i = AddSubmonoid.closure (⋃ (i : ι), (p i))
          theorem Submonoid.disjoint_def {M : Type u_1} [MulOneClass M] {p₁ p₂ : Submonoid M} :
          Disjoint p₁ p₂ ∀ {x : M}, x p₁x p₂x = 1
          theorem AddSubmonoid.disjoint_def {M : Type u_1} [AddZeroClass M] {p₁ p₂ : AddSubmonoid M} :
          Disjoint p₁ p₂ ∀ {x : M}, x p₁x p₂x = 0
          theorem Submonoid.disjoint_def' {M : Type u_1} [MulOneClass M] {p₁ p₂ : Submonoid M} :
          Disjoint p₁ p₂ ∀ {x y : M}, x p₁y p₂x = yx = 1
          theorem AddSubmonoid.disjoint_def' {M : Type u_1} [AddZeroClass M] {p₁ p₂ : AddSubmonoid M} :
          Disjoint p₁ p₂ ∀ {x y : M}, x p₁y p₂x = yx = 0
          theorem MonoidHom.eqOn_closureM {M : Type u_1} {N : Type u_2} [MulOneClass M] [MulOneClass N] {f g : M →* N} {s : Set M} (h : Set.EqOn (⇑f) (⇑g) s) :
          Set.EqOn f g (Submonoid.closure s)

          If two monoid homomorphisms are equal on a set, then they are equal on its submonoid closure.

          theorem AddMonoidHom.eqOn_closureM {M : Type u_1} {N : Type u_2} [AddZeroClass M] [AddZeroClass N] {f g : M →+ N} {s : Set M} (h : Set.EqOn (⇑f) (⇑g) s) :

          If two monoid homomorphisms are equal on a set, then they are equal on its submonoid closure.

          theorem MonoidHom.eq_of_eqOn_denseM {M : Type u_1} {N : Type u_2} [MulOneClass M] [MulOneClass N] {s : Set M} (hs : Submonoid.closure s = ) {f g : M →* N} (h : Set.EqOn (⇑f) (⇑g) s) :
          f = g
          theorem AddMonoidHom.eq_of_eqOn_denseM {M : Type u_1} {N : Type u_2} [AddZeroClass M] [AddZeroClass N] {s : Set M} (hs : AddSubmonoid.closure s = ) {f g : M →+ N} (h : Set.EqOn (⇑f) (⇑g) s) :
          f = g
          def IsUnit.submonoid (M : Type u_4) [Monoid M] :

          The submonoid consisting of the units of a monoid

          Equations
          Instances For

            The additive submonoid consisting of the additive units of an additive monoid

            Equations
            Instances For
              def MonoidHom.ofClosureMEqTopLeft {M : Type u_4} {N : Type u_5} [Monoid M] [Monoid N] {s : Set M} (f : MN) (hs : Submonoid.closure s = ) (h1 : f 1 = 1) (hmul : xs, ∀ (y : M), f (x * y) = f x * f y) :
              M →* N

              Let s be a subset of a monoid M such that the closure of s is the whole monoid. Then MonoidHom.ofClosureEqTopLeft defines a monoid homomorphism from M asking for a proof of f (x * y) = f x * f y only for x ∈ s.

              Equations
              Instances For
                def AddMonoidHom.ofClosureMEqTopLeft {M : Type u_4} {N : Type u_5} [AddMonoid M] [AddMonoid N] {s : Set M} (f : MN) (hs : AddSubmonoid.closure s = ) (h1 : f 0 = 0) (hmul : xs, ∀ (y : M), f (x + y) = f x + f y) :
                M →+ N

                Let s be a subset of an additive monoid M such that the closure of s is the whole monoid. Then AddMonoidHom.ofClosureEqTopLeft defines an additive monoid homomorphism from M asking for a proof of f (x + y) = f x + f y only for x ∈ s.

                Equations
                Instances For
                  @[simp]
                  theorem MonoidHom.coe_ofClosureMEqTopLeft {M : Type u_1} {N : Type u_2} [Monoid M] [Monoid N] {s : Set M} (f : MN) (hs : Submonoid.closure s = ) (h1 : f 1 = 1) (hmul : xs, ∀ (y : M), f (x * y) = f x * f y) :
                  (MonoidHom.ofClosureMEqTopLeft f hs h1 hmul) = f
                  @[simp]
                  theorem AddMonoidHom.coe_ofClosureMEqTopLeft {M : Type u_1} {N : Type u_2} [AddMonoid M] [AddMonoid N] {s : Set M} (f : MN) (hs : AddSubmonoid.closure s = ) (h1 : f 0 = 0) (hmul : xs, ∀ (y : M), f (x + y) = f x + f y) :
                  def MonoidHom.ofClosureMEqTopRight {M : Type u_4} {N : Type u_5} [Monoid M] [Monoid N] {s : Set M} (f : MN) (hs : Submonoid.closure s = ) (h1 : f 1 = 1) (hmul : ∀ (x y : M), y sf (x * y) = f x * f y) :
                  M →* N

                  Let s be a subset of a monoid M such that the closure of s is the whole monoid. Then MonoidHom.ofClosureEqTopRight defines a monoid homomorphism from M asking for a proof of f (x * y) = f x * f y only for y ∈ s.

                  Equations
                  Instances For
                    def AddMonoidHom.ofClosureMEqTopRight {M : Type u_4} {N : Type u_5} [AddMonoid M] [AddMonoid N] {s : Set M} (f : MN) (hs : AddSubmonoid.closure s = ) (h1 : f 0 = 0) (hmul : ∀ (x y : M), y sf (x + y) = f x + f y) :
                    M →+ N

                    Let s be a subset of an additive monoid M such that the closure of s is the whole monoid. Then AddMonoidHom.ofClosureEqTopRight defines an additive monoid homomorphism from M asking for a proof of f (x + y) = f x + f y only for y ∈ s.

                    Equations
                    Instances For
                      @[simp]
                      theorem MonoidHom.coe_ofClosureMEqTopRight {M : Type u_1} {N : Type u_2} [Monoid M] [Monoid N] {s : Set M} (f : MN) (hs : Submonoid.closure s = ) (h1 : f 1 = 1) (hmul : ∀ (x y : M), y sf (x * y) = f x * f y) :
                      (MonoidHom.ofClosureMEqTopRight f hs h1 hmul) = f
                      @[simp]
                      theorem AddMonoidHom.coe_ofClosureMEqTopRight {M : Type u_1} {N : Type u_2} [AddMonoid M] [AddMonoid N] {s : Set M} (f : MN) (hs : AddSubmonoid.closure s = ) (h1 : f 0 = 0) (hmul : ∀ (x y : M), y sf (x + y) = f x + f y) :