mathlib documentation

group_theory.​submonoid.​basic

group_theory.​submonoid.​basic

Submonoids: definition and complete_lattice structure

This file defines bundled multiplicative and additive submonoids. We also define a complete_lattice 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 monoid_hom.of_mdense.

Main definitions

For each of the following definitions in the submonoid namespace, there is a corresponding definition in the add_submonoid namespace.

Implementation notes

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

This file is designed to have very few dependencies. In particular, it should not use natural numbers.

Tags

submonoid, submonoids

structure submonoid (M : Type u_3) [monoid M] :
Type u_3

A submonoid of a monoid M is a subset containing 1 and closed under multiplication.

structure add_submonoid (M : Type u_3) [add_monoid M] :
Type u_3

An additive submonoid of an additive monoid M is a subset containing 0 and closed under addition.

@[instance]
def submonoid.​has_coe {M : Type u_1} [monoid M] :

Equations
@[instance]
def add_submonoid.​has_coe {M : Type u_1} [add_monoid M] :

@[instance]

Equations
@[instance]
def submonoid.​has_mem {M : Type u_1} [monoid M] :

Equations
@[instance]
def add_submonoid.​has_mem {M : Type u_1} [add_monoid M] :

@[simp]
theorem submonoid.​mem_carrier {M : Type u_1} [monoid M] {s : submonoid M} {x : M} :
x ∈ s.carrier ↔ x ∈ s

@[simp]
theorem add_submonoid.​mem_carrier {M : Type u_1} [add_monoid M] {s : add_submonoid M} {x : M} :
x ∈ s.carrier ↔ x ∈ s

@[simp]
theorem submonoid.​mem_coe {M : Type u_1} [monoid M] {S : submonoid M} {m : M} :
m ∈ ↑S ↔ m ∈ S

@[simp]
theorem add_submonoid.​mem_coe {M : Type u_1} [add_monoid M] {S : add_submonoid M} {m : M} :
m ∈ ↑S ↔ m ∈ S

@[simp]
theorem submonoid.​coe_coe {M : Type u_1} [monoid M] (s : submonoid M) :

@[simp]
theorem add_submonoid.​coe_coe {M : Type u_1} [add_monoid M] (s : add_submonoid M) :

theorem add_submonoid.​exists {M : Type u_1} [add_monoid M] {s : add_submonoid M} {p : ↥s → Prop} :
(∃ (x : ↥s), p x) ↔ ∃ (x : M) (H : x ∈ s), p ⟨x, H⟩

theorem submonoid.​exists {M : Type u_1} [monoid M] {s : submonoid M} {p : ↥s → Prop} :
(∃ (x : ↥s), p x) ↔ ∃ (x : M) (H : x ∈ s), p ⟨x, H⟩

theorem submonoid.​forall {M : Type u_1} [monoid M] {s : submonoid M} {p : ↥s → Prop} :
(∀ (x : ↥s), p x) ↔ ∀ (x : M) (H : x ∈ s), p ⟨x, H⟩

theorem add_submonoid.​forall {M : Type u_1} [add_monoid M] {s : add_submonoid M} {p : ↥s → Prop} :
(∀ (x : ↥s), p x) ↔ ∀ (x : M) (H : x ∈ s), p ⟨x, H⟩

theorem submonoid.​ext' {M : Type u_1} [monoid M] ⦃S T : submonoid M⦄ :
↑S = ↑T → S = T

Two submonoids are equal if the underlying subsets are equal.

theorem add_submonoid.​ext' {M : Type u_1} [add_monoid M] ⦃S T : add_submonoid M⦄ :
↑S = ↑T → S = T

Two add_submonoids are equal if the underlying subsets are equal.

theorem submonoid.​ext'_iff {M : Type u_1} [monoid M] {S T : submonoid M} :
S = T ↔ ↑S = ↑T

Two submonoids are equal if and only if the underlying subsets are equal.

theorem add_submonoid.​ext'_iff {M : Type u_1} [add_monoid M] {S T : add_submonoid M} :
S = T ↔ ↑S = ↑T

Two add_submonoids are equal if and only if the underlying subsets are equal.

@[ext]
theorem submonoid.​ext {M : Type u_1} [monoid M] {S T : submonoid M} :
(∀ (x : M), x ∈ S ↔ x ∈ T) → S = T

Two submonoids are equal if they have the same elements.

@[ext]
theorem add_submonoid.​ext {M : Type u_1} [add_monoid M] {S T : add_submonoid M} :
(∀ (x : M), x ∈ S ↔ x ∈ T) → S = T

Two add_submonoids are equal if they have the same elements.

def submonoid.​copy {M : Type u_1} [monoid M] (S : submonoid M) (s : set M) :
s = ↑S → submonoid M

Copy a submonoid replacing carrier with a set that is equal to it.

Equations
def add_submonoid.​copy {M : Type u_1} [add_monoid M] (S : add_submonoid M) (s : set M) :

Copy an additive submonoid replacing carrier with a set that is equal to it.

@[simp]
theorem submonoid.​coe_copy {M : Type u_1} [monoid M] {S : submonoid M} {s : set M} (hs : s = ↑S) :
↑(S.copy s hs) = s

@[simp]
theorem add_submonoid.​coe_copy {M : Type u_1} [add_monoid M] {S : add_submonoid M} {s : set M} (hs : s = ↑S) :
↑(S.copy s hs) = s

theorem submonoid.​copy_eq {M : Type u_1} [monoid M] {S : submonoid M} {s : set M} (hs : s = ↑S) :
S.copy s hs = S

theorem add_submonoid.​copy_eq {M : Type u_1} [add_monoid M] {S : add_submonoid M} {s : set M} (hs : s = ↑S) :
S.copy s hs = S

theorem add_submonoid.​zero_mem {M : Type u_1} [add_monoid M] (S : add_submonoid M) :
0 ∈ S

An add_submonoid contains the monoid's 0.

theorem submonoid.​one_mem {M : Type u_1} [monoid M] (S : submonoid M) :
1 ∈ S

A submonoid contains the monoid's 1.

theorem submonoid.​mul_mem {M : Type u_1} [monoid M] (S : submonoid M) {x y : M} :
x ∈ S → y ∈ S → x * y ∈ S

A submonoid is closed under multiplication.

theorem add_submonoid.​add_mem {M : Type u_1} [add_monoid M] (S : add_submonoid M) {x y : M} :
x ∈ S → y ∈ S → x + y ∈ S

An add_submonoid is closed under addition.

@[simp]
theorem add_submonoid.​coe_eq_coe {M : Type u_1} [add_monoid M] (S : add_submonoid M) (x y : ↥S) :
↑x = ↑y ↔ x = y

@[simp]
theorem submonoid.​coe_eq_coe {M : Type u_1} [monoid M] (S : submonoid M) (x y : ↥S) :
↑x = ↑y ↔ x = y

@[instance]
def submonoid.​has_le {M : Type u_1} [monoid M] :

Equations
@[instance]
def add_submonoid.​has_le {M : Type u_1} [add_monoid M] :

theorem add_submonoid.​le_def {M : Type u_1} [add_monoid M] {S T : add_submonoid M} :
S ≤ T ↔ ∀ ⦃x : M⦄, x ∈ S → x ∈ T

theorem submonoid.​le_def {M : Type u_1} [monoid M] {S T : submonoid M} :
S ≤ T ↔ ∀ ⦃x : M⦄, x ∈ S → x ∈ T

@[simp]
theorem add_submonoid.​coe_subset_coe {M : Type u_1} [add_monoid M] {S T : add_submonoid M} :
↑S ⊆ ↑T ↔ S ≤ T

@[simp]
theorem submonoid.​coe_subset_coe {M : Type u_1} [monoid M] {S T : submonoid M} :
↑S ⊆ ↑T ↔ S ≤ T

@[instance]

Equations
@[instance]

@[simp]
theorem submonoid.​coe_ssubset_coe {M : Type u_1} [monoid M] {S T : submonoid M} :
↑S ⊂ ↑T ↔ S < T

@[simp]
theorem add_submonoid.​coe_ssubset_coe {M : Type u_1} [add_monoid M] {S T : add_submonoid M} :
↑S ⊂ ↑T ↔ S < T

@[instance]
def submonoid.​has_top {M : Type u_1} [monoid M] :

The submonoid M of the monoid M.

Equations
@[instance]

The additive submonoid M of the add_monoid M.

@[instance]
def submonoid.​has_bot {M : Type u_1} [monoid M] :

The trivial submonoid {1} of an monoid M.

Equations
@[instance]

The trivial add_submonoid {0} of an add_monoid M.

@[instance]
def submonoid.​inhabited {M : Type u_1} [monoid M] :

Equations
@[instance]

@[simp]
theorem add_submonoid.​mem_bot {M : Type u_1} [add_monoid M] {x : M} :
x ∈ ⊥ ↔ x = 0

@[simp]
theorem submonoid.​mem_bot {M : Type u_1} [monoid M] {x : M} :
x ∈ ⊥ ↔ x = 1

@[simp]
theorem add_submonoid.​mem_top {M : Type u_1} [add_monoid M] (x : M) :

@[simp]
theorem submonoid.​mem_top {M : Type u_1} [monoid M] (x : M) :

@[simp]
theorem add_submonoid.​coe_top {M : Type u_1} [add_monoid M] :

@[simp]
theorem submonoid.​coe_top {M : Type u_1} [monoid M] :

@[simp]
theorem submonoid.​coe_bot {M : Type u_1} [monoid M] :
↑⊥ = {1}

@[simp]
theorem add_submonoid.​coe_bot {M : Type u_1} [add_monoid M] :
↑⊥ = {0}

@[instance]
def submonoid.​has_inf {M : Type u_1} [monoid M] :

The inf of two submonoids is their intersection.

Equations
@[instance]

The inf of two add_submonoids is their intersection.

@[simp]
theorem add_submonoid.​coe_inf {M : Type u_1} [add_monoid M] (p p' : add_submonoid M) :
↑(p ⊓ p') = ↑p ∩ ↑p'

@[simp]
theorem submonoid.​coe_inf {M : Type u_1} [monoid M] (p p' : submonoid M) :
↑(p ⊓ p') = ↑p ∩ ↑p'

@[simp]
theorem submonoid.​mem_inf {M : Type u_1} [monoid M] {p p' : submonoid M} {x : M} :
x ∈ p ⊓ p' ↔ x ∈ p ∧ x ∈ p'

@[simp]
theorem add_submonoid.​mem_inf {M : Type u_1} [add_monoid M] {p p' : add_submonoid M} {x : M} :
x ∈ p ⊓ p' ↔ x ∈ p ∧ x ∈ p'

@[instance]
def submonoid.​has_Inf {M : Type u_1} [monoid M] :

Equations
@[instance]

@[simp]
theorem submonoid.​coe_Inf {M : Type u_1} [monoid M] (S : set (submonoid M)) :
↑(has_Inf.Inf S) = ⋂ (s : submonoid M) (H : s ∈ S), ↑s

@[simp]
theorem add_submonoid.​coe_Inf {M : Type u_1} [add_monoid M] (S : set (add_submonoid M)) :
↑(has_Inf.Inf S) = ⋂ (s : add_submonoid M) (H : s ∈ S), ↑s

theorem add_submonoid.​mem_Inf {M : Type u_1} [add_monoid M] {S : set (add_submonoid M)} {x : M} :
x ∈ has_Inf.Inf S ↔ ∀ (p : add_submonoid M), p ∈ S → x ∈ p

theorem submonoid.​mem_Inf {M : Type u_1} [monoid M] {S : set (submonoid M)} {x : M} :
x ∈ has_Inf.Inf S ↔ ∀ (p : submonoid M), p ∈ S → x ∈ p

theorem add_submonoid.​mem_infi {M : Type u_1} [add_monoid M] {ι : Sort u_2} {S : ι → add_submonoid M} {x : M} :
(x ∈ ⨅ (i : ι), S i) ↔ ∀ (i : ι), x ∈ S i

theorem submonoid.​mem_infi {M : Type u_1} [monoid M] {ι : Sort u_2} {S : ι → submonoid M} {x : M} :
(x ∈ ⨅ (i : ι), S i) ↔ ∀ (i : ι), x ∈ S i

@[simp]
theorem submonoid.​coe_infi {M : Type u_1} [monoid M] {ι : Sort u_2} {S : ι → submonoid M} :
(↑⨅ (i : ι), S i) = ⋂ (i : ι), ↑(S i)

@[simp]
theorem add_submonoid.​coe_infi {M : Type u_1} [add_monoid M] {ι : Sort u_2} {S : ι → add_submonoid M} :
(↑⨅ (i : ι), S i) = ⋂ (i : ι), ↑(S i)

@[instance]

The add_submonoids of an add_monoid form a complete lattice.

@[instance]

Submonoids of a monoid form a complete lattice.

Equations
def add_submonoid.​closure {M : Type u_1} [add_monoid M] :

The add_submonoid generated by a set

def submonoid.​closure {M : Type u_1} [monoid M] :
set M → submonoid M

The submonoid generated by a set.

Equations
theorem submonoid.​mem_closure {M : Type u_1} [monoid M] {s : set M} {x : M} :
x ∈ submonoid.closure s ↔ ∀ (S : submonoid M), s ⊆ ↑S → x ∈ S

theorem add_submonoid.​mem_closure {M : Type u_1} [add_monoid M] {s : set M} {x : M} :
x ∈ add_submonoid.closure s ↔ ∀ (S : add_submonoid M), s ⊆ ↑S → x ∈ S

@[simp]
theorem add_submonoid.​subset_closure {M : Type u_1} [add_monoid M] {s : set M} :

The add_submonoid generated by a set includes the set.

@[simp]
theorem submonoid.​subset_closure {M : Type u_1} [monoid M] {s : set M} :

The submonoid generated by a set includes the set.

@[simp]
theorem submonoid.​closure_le {M : Type u_1} [monoid M] {s : set M} {S : submonoid M} :

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

@[simp]
theorem add_submonoid.​closure_le {M : Type u_1} [add_monoid M] {s : set M} {S : add_submonoid M} :

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

theorem submonoid.​closure_mono {M : Type u_1} [monoid M] ⦃s t : set M⦄ :

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

theorem add_submonoid.​closure_mono {M : Type u_1} [add_monoid M] ⦃s t : set M⦄ :

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} [monoid M] {s : set M} {S : submonoid M} :

theorem add_submonoid.​closure_induction {M : Type u_1} [add_monoid M] {s : set M} {p : M → Prop} {x : M} :
x ∈ add_submonoid.closure s → (∀ (x : M), x ∈ s → p x) → p 0 → (∀ (x y : M), p x → p y → p (x + y)) → p x

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.

theorem submonoid.​closure_induction {M : Type u_1} [monoid M] {s : set M} {p : M → Prop} {x : M} :
x ∈ submonoid.closure s → (∀ (x : M), x ∈ s → p x) → p 1 → (∀ (x y : M), p x → p y → p (x * y)) → p x

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.​dense_induction {M : Type u_1} [monoid M] {p : M → Prop} (x : M) {s : set M} :
submonoid.closure s = ⊤ → (∀ (x : M), x ∈ s → p x) → p 1 → (∀ (x y : M), p x → p y → p (x * y)) → 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 add_submonoid.​dense_induction {M : Type u_1} [add_monoid M] {p : M → Prop} (x : M) {s : set M} :
add_submonoid.closure s = ⊤ → (∀ (x : M), x ∈ s → p x) → p 0 → (∀ (x y : M), p x → p y → p (x + y)) → p x

If s is a dense set in an additive monoid M, add_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 0, and verify that p x and p y imply p (x + y).

closure forms a Galois insertion with the coercion to set.

closure forms a Galois insertion with the coercion to set.

Equations
@[simp]

Additive closure of an additive submonoid S equals S

@[simp]
theorem submonoid.​closure_eq {M : Type u_1} [monoid M] (S : submonoid M) :

Closure of a submonoid S equals S.

@[simp]

@[simp]

theorem add_submonoid.​closure_Union {M : Type u_1} [add_monoid M] {ι : Sort u_2} (s : ι → set M) :
add_submonoid.closure (⋃ (i : ι), s i) = ⨆ (i : ι), add_submonoid.closure (s i)

theorem submonoid.​closure_Union {M : Type u_1} [monoid M] {ι : Sort u_2} (s : ι → set M) :
submonoid.closure (⋃ (i : ι), s i) = ⨆ (i : ι), submonoid.closure (s i)

def monoid_hom.​eq_mlocus {M : Type u_1} [monoid M] {N : Type u_3} [monoid N] :
(M →* N) → (M →* N) → submonoid M

The submonoid of elements x : M such that f x = g x

Equations
def add_monoid_hom.​eq_mlocus {M : Type u_1} [add_monoid M] {N : Type u_3} [add_monoid N] :
(M →+ N) → (M →+ N) → add_submonoid M

The additive submonoid of elements x : M such that f x = g x

theorem monoid_hom.​eq_on_mclosure {M : Type u_1} [monoid M] {N : Type u_3} [monoid N] {f g : M →* N} {s : set M} :

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

theorem add_monoid_hom.​eq_on_mclosure {M : Type u_1} [add_monoid M] {N : Type u_3} [add_monoid N] {f g : M →+ N} {s : set M} :

theorem monoid_hom.​eq_of_eq_on_mtop {M : Type u_1} [monoid M] {N : Type u_3} [monoid N] {f g : M →* N} :

theorem add_monoid_hom.​eq_of_eq_on_mtop {M : Type u_1} [add_monoid M] {N : Type u_3} [add_monoid N] {f g : M →+ N} :

theorem monoid_hom.​eq_of_eq_on_mdense {M : Type u_1} [monoid M] {N : Type u_3} [monoid N] {s : set M} (hs : submonoid.closure s = ⊤) {f g : M →* N} :
set.eq_on ⇑f ⇑g s → f = g

theorem add_monoid_hom.​eq_of_eq_on_mdense {M : Type u_1} [add_monoid M] {N : Type u_3} [add_monoid N] {s : set M} (hs : add_submonoid.closure s = ⊤) {f g : M →+ N} :
set.eq_on ⇑f ⇑g s → f = g

def add_monoid_hom.​of_mdense {M : Type u_1} [add_monoid M] {s : set M} {N : Type u_3} [add_monoid N] (f : M → N) :
add_submonoid.closure s = ⊤ → f 0 = 0 → (∀ (x y : M), y ∈ s → 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 add_monoid_hom.of_mdense defines an additive monoid homomorphism from M asking for a proof of f (x + y) = f x + f y only for y ∈ s.

def monoid_hom.​of_mdense {M : Type u_1} [monoid M] {s : set M} {N : Type u_3} [monoid N] (f : M → N) :
submonoid.closure s = ⊤ → f 1 = 1 → (∀ (x y : M), y ∈ s → 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 monoid_hom.of_mdense defines a monoid homomorphism from M asking for a proof of f (x * y) = f x * f y only for y ∈ s.

Equations
@[simp]
theorem add_monoid_hom.​coe_of_mdense {M : Type u_1} [add_monoid M] {s : set M} {N : Type u_3} [add_monoid N] (f : M → N) (hs : add_submonoid.closure s = ⊤) (h1 : f 0 = 0) (hmul : ∀ (x y : M), y ∈ s → f (x + y) = f x + f y) :

@[simp]
theorem monoid_hom.​coe_of_mdense {M : Type u_1} [monoid M] {s : set M} {N : Type u_3} [monoid N] (f : M → N) (hs : submonoid.closure s = ⊤) (h1 : f 1 = 1) (hmul : ∀ (x y : M), y ∈ s → f (x * y) = f x * f y) :
⇑(monoid_hom.of_mdense f hs h1 hmul) = f