# Documentation

Mathlib.GroupTheory.Subsemigroup.Operations

# Operations on Subsemigroups #

In this file we define various operations on Subsemigroups and MulHoms.

## Main definitions #

### Conversion between multiplicative and additive definitions #

• Subsemigroup.toAddSubsemigroup, Subsemigroup.toAddSubsemigroup', AddSubsemigroup.toSubsemigroup, AddSubsemigroup.toSubsemigroup': convert between multiplicative and additive subsemigroups of M, Multiplicative M, and Additive M. These are stated as OrderIsos.

### (Commutative) semigroup structure on a subsemigroup #

• Subsemigroup.toSemigroup, Subsemigroup.toCommSemigroup: a subsemigroup inherits a (commutative) semigroup structure.

### Operations on subsemigroups #

• Subsemigroup.comap: preimage of a subsemigroup under a semigroup homomorphism as a subsemigroup of the domain;
• Subsemigroup.map: image of a subsemigroup under a semigroup homomorphism as a subsemigroup of the codomain;
• Subsemigroup.prod: product of two subsemigroups s : Subsemigroup M and t : Subsemigroup N as a subsemigroup of M × N;

### Semigroup homomorphisms between subsemigroups #

• Subsemigroup.subtype: embedding of a subsemigroup into the ambient semigroup.
• Subsemigroup.inclusion: given two subsemigroups S, T such that S ≤ T, S.inclusion T is the inclusion of S into T as a semigroup homomorphism;
• MulEquiv.subsemigroupCongr: converts a proof of S = T into a semigroup isomorphism between S and T.
• Subsemigroup.prodEquiv: semigroup isomorphism between s.prod t and s × t;

### Operations on MulHoms #

• MulHom.srange: range of a semigroup homomorphism as a subsemigroup of the codomain;
• MulHom.restrict: restrict a semigroup homomorphism to a subsemigroup;
• MulHom.codRestrict: restrict the codomain of a semigroup homomorphism to a subsemigroup;
• MulHom.srangeRestrict: restrict a semigroup homomorphism to its range;

### Implementation notes #

This file follows closely GroupTheory/Submonoid/Operations.lean, omitting only that which is necessary.

## Tags #

subsemigroup, range, product, map, comap

### Conversion to/from Additive/Multiplicative#

@[simp]
theorem Subsemigroup.toAddSubsemigroup_apply_coe {M : Type u_1} [Mul M] (S : ) :
@[simp]
theorem Subsemigroup.toAddSubsemigroup_symm_apply_coe {M : Type u_1} [Mul M] (S : ) :

Subsemigroups of semigroup M are isomorphic to additive subsemigroups of Additive M.

Instances For
@[inline, reducible]

Additive subsemigroups of an additive semigroup Additive M are isomorphic to subsemigroups of M.

Instances For
theorem Subsemigroup.toAddSubsemigroup_closure {M : Type u_1} [Mul M] (S : Set M) :
theorem AddSubsemigroup.toSubsemigroup'_closure {M : Type u_1} [Mul M] (S : Set ()) :
@[simp]
theorem AddSubsemigroup.toSubsemigroup_apply_coe {A : Type u_5} [Add A] (S : ) :
@[simp]
theorem AddSubsemigroup.toSubsemigroup_symm_apply_coe {A : Type u_5} [Add A] (S : ) :

Additive subsemigroups of an additive semigroup A are isomorphic to multiplicative subsemigroups of Multiplicative A.

Instances For
@[inline, reducible]

Subsemigroups of a semigroup Multiplicative A are isomorphic to additive subsemigroups of A.

Instances For
theorem AddSubsemigroup.toSubsemigroup_closure {A : Type u_5} [Add A] (S : Set A) :
theorem Subsemigroup.toAddSubsemigroup'_closure {A : Type u_5} [Add A] (S : ) :

### comap and map#

theorem AddSubsemigroup.comap.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (S : ) :
∀ {a b : M}, a f ⁻¹' Sb f ⁻¹' Sf (a + b) S
def AddSubsemigroup.comap {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (S : ) :

The preimage of an AddSubsemigroup along an AddSemigroup homomorphism is an AddSubsemigroup.

Instances For
def Subsemigroup.comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (S : ) :

The preimage of a subsemigroup along a semigroup homomorphism is a subsemigroup.

Instances For
@[simp]
theorem AddSubsemigroup.coe_comap {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (f : AddHom M N) :
↑() = f ⁻¹' S
@[simp]
theorem Subsemigroup.coe_comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) (f : M →ₙ* N) :
↑() = f ⁻¹' S
@[simp]
theorem AddSubsemigroup.mem_comap {M : Type u_1} {N : Type u_2} [Add M] [Add N] {S : } {f : AddHom M N} {x : M} :
f x S
@[simp]
theorem Subsemigroup.mem_comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {S : } {f : M →ₙ* N} {x : M} :
x f x S
theorem AddSubsemigroup.comap_comap {M : Type u_1} {N : Type u_2} {P : Type u_3} [Add M] [Add N] [Add P] (S : ) (g : AddHom N P) (f : AddHom M N) :
theorem Subsemigroup.comap_comap {M : Type u_1} {N : Type u_2} {P : Type u_3} [Mul M] [Mul N] [Mul P] (S : ) (g : N →ₙ* P) (f : M →ₙ* N) :
=
@[simp]
theorem AddSubsemigroup.comap_id {P : Type u_3} [Add P] (S : ) :
= S
@[simp]
theorem Subsemigroup.comap_id {P : Type u_3} [Mul P] (S : ) :
= S
theorem AddSubsemigroup.map.proof_1 {M : Type u_2} {N : Type u_1} [Add M] [Add N] (f : AddHom M N) (S : ) :
∀ {a b : N}, a f '' Sb f '' Sa + b f '' S
def AddSubsemigroup.map {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (S : ) :

The image of an AddSubsemigroup along an AddSemigroup homomorphism is an AddSubsemigroup.

Instances For
def Subsemigroup.map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (S : ) :

The image of a subsemigroup along a semigroup homomorphism is a subsemigroup.

Instances For
@[simp]
theorem AddSubsemigroup.coe_map {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (S : ) :
↑() = f '' S
@[simp]
theorem Subsemigroup.coe_map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (S : ) :
↑() = f '' S
@[simp]
theorem AddSubsemigroup.mem_map {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} {S : } {y : N} :
y x, x S f x = y
@[simp]
theorem Subsemigroup.mem_map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} {S : } {y : N} :
y x, x S f x = y
theorem AddSubsemigroup.mem_map_of_mem {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) {S : } {x : M} (hx : x S) :
f x
theorem Subsemigroup.mem_map_of_mem {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) {S : } {x : M} (hx : x S) :
f x
theorem AddSubsemigroup.apply_coe_mem_map {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (S : ) (x : { x // x S }) :
f x
theorem Subsemigroup.apply_coe_mem_map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (S : ) (x : { x // x S }) :
f x
theorem AddSubsemigroup.map_map {M : Type u_1} {N : Type u_2} {P : Type u_3} [Add M] [Add N] [Add P] (S : ) (g : AddHom N P) (f : AddHom M N) :
=
theorem Subsemigroup.map_map {M : Type u_1} {N : Type u_2} {P : Type u_3} [Mul M] [Mul N] [Mul P] (S : ) (g : N →ₙ* P) (f : M →ₙ* N) :
@[simp]
theorem AddSubsemigroup.mem_map_iff_mem {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) {S : } {x : M} :
f x x S
@[simp]
theorem Subsemigroup.mem_map_iff_mem {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) {S : } {x : M} :
f x x S
theorem AddSubsemigroup.map_le_iff_le_comap {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} {S : } {T : } :
T
theorem Subsemigroup.map_le_iff_le_comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} {S : } {T : } :
T S
theorem Subsemigroup.gc_map_comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) :
theorem AddSubsemigroup.map_le_of_le_comap {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) {T : } {f : AddHom M N} :
T
theorem Subsemigroup.map_le_of_le_comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) {T : } {f : M →ₙ* N} :
S T
theorem AddSubsemigroup.le_comap_of_map_le {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) {T : } {f : AddHom M N} :
T
theorem Subsemigroup.le_comap_of_map_le {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) {T : } {f : M →ₙ* N} :
TS
theorem AddSubsemigroup.le_comap_map {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) {f : AddHom M N} :
theorem Subsemigroup.le_comap_map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) {f : M →ₙ* N} :
S
theorem AddSubsemigroup.map_comap_le {M : Type u_1} {N : Type u_2} [Add M] [Add N] {S : } {f : AddHom M N} :
theorem Subsemigroup.map_comap_le {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {S : } {f : M →ₙ* N} :
S
theorem Subsemigroup.monotone_map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} :
theorem Subsemigroup.monotone_comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} :
@[simp]
theorem AddSubsemigroup.map_comap_map {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) {f : AddHom M N} :
@[simp]
theorem Subsemigroup.map_comap_map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) {f : M →ₙ* N} :
=
@[simp]
theorem AddSubsemigroup.comap_map_comap {M : Type u_1} {N : Type u_2} [Add M] [Add N] {S : } {f : AddHom M N} :
@[simp]
theorem Subsemigroup.comap_map_comap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {S : } {f : M →ₙ* N} :
=
theorem AddSubsemigroup.map_sup {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (T : ) (f : AddHom M N) :
theorem Subsemigroup.map_sup {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) (T : ) (f : M →ₙ* N) :
theorem AddSubsemigroup.map_iSup {M : Type u_1} {N : Type u_2} [Add M] [Add N] {ι : Sort u_5} (f : AddHom M N) (s : ι) :
= ⨆ (i : ι), AddSubsemigroup.map f (s i)
theorem Subsemigroup.map_iSup {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {ι : Sort u_5} (f : M →ₙ* N) (s : ι) :
Subsemigroup.map f (iSup s) = ⨆ (i : ι), Subsemigroup.map f (s i)
theorem AddSubsemigroup.comap_inf {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (T : ) (f : AddHom M N) :
theorem Subsemigroup.comap_inf {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) (T : ) (f : M →ₙ* N) :
theorem AddSubsemigroup.comap_iInf {M : Type u_1} {N : Type u_2} [Add M] [Add N] {ι : Sort u_5} (f : AddHom M N) (s : ι) :
= ⨅ (i : ι), AddSubsemigroup.comap f (s i)
theorem Subsemigroup.comap_iInf {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {ι : Sort u_5} (f : M →ₙ* N) (s : ι) :
= ⨅ (i : ι), Subsemigroup.comap f (s i)
@[simp]
@[simp]
theorem Subsemigroup.map_bot {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) :
@[simp]
@[simp]
theorem Subsemigroup.comap_top {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) :
abbrev AddSubsemigroup.map_id.match_1 {M : Type u_1} [Add M] (S : ) :
(x : M) → ∀ (motive : x Prop) (x_1 : x ), (∀ (h : x S), motive (_ : a, a S ↑() a = x)) → motive x_1
Instances For
@[simp]
theorem AddSubsemigroup.map_id {M : Type u_1} [Add M] (S : ) :
= S
@[simp]
theorem Subsemigroup.map_id {M : Type u_1} [Mul M] (S : ) :
= S
theorem AddSubsemigroup.gciMapComap.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) (x : M) :
x S
def AddSubsemigroup.gciMapComap {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :

map f and comap f form a GaloisCoinsertion when f is injective.

Instances For
def Subsemigroup.gciMapComap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :

map f and comap f form a GaloisCoinsertion when f is injective.

Instances For
theorem AddSubsemigroup.comap_map_eq_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) :
theorem Subsemigroup.comap_map_eq_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) (S : ) :
= S
theorem AddSubsemigroup.comap_surjective_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :
theorem Subsemigroup.comap_surjective_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :
theorem AddSubsemigroup.map_injective_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :
theorem Subsemigroup.map_injective_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :
theorem AddSubsemigroup.comap_inf_map_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) (T : ) :
= S T
theorem Subsemigroup.comap_inf_map_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) (S : ) (T : ) :
theorem AddSubsemigroup.comap_iInf_map_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {ι : Type u_5} {f : AddHom M N} (hf : ) (S : ι) :
AddSubsemigroup.comap f (⨅ (i : ι), AddSubsemigroup.map f (S i)) = iInf S
theorem Subsemigroup.comap_iInf_map_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {ι : Type u_5} {f : M →ₙ* N} (hf : ) (S : ι) :
Subsemigroup.comap f (⨅ (i : ι), Subsemigroup.map f (S i)) = iInf S
theorem AddSubsemigroup.comap_sup_map_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) (T : ) :
= S T
theorem Subsemigroup.comap_sup_map_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) (S : ) (T : ) :
theorem AddSubsemigroup.comap_iSup_map_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {ι : Type u_5} {f : AddHom M N} (hf : ) (S : ι) :
AddSubsemigroup.comap f (⨆ (i : ι), AddSubsemigroup.map f (S i)) = iSup S
theorem Subsemigroup.comap_iSup_map_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {ι : Type u_5} {f : M →ₙ* N} (hf : ) (S : ι) :
Subsemigroup.comap f (⨆ (i : ι), Subsemigroup.map f (S i)) = iSup S
theorem AddSubsemigroup.map_le_map_iff_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) {S : } {T : } :
S T
theorem Subsemigroup.map_le_map_iff_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) {S : } {T : } :
S T
theorem AddSubsemigroup.map_strictMono_of_injective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :
theorem Subsemigroup.map_strictMono_of_injective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :
abbrev AddSubsemigroup.giMapComap.match_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (x : N) (motive : (a, f a = x) → Prop) :
(x : a, f a = x) → ((y : M) → (hy : f y = x) → motive (_ : a, f a = x)) → motive x
Instances For
def AddSubsemigroup.giMapComap {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :

map f and comap f form a GaloisInsertion when f is surjective.

Instances For
theorem AddSubsemigroup.giMapComap.proof_1 {M : Type u_2} {N : Type u_1} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) (x : N) (h : x S) :
def Subsemigroup.giMapComap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :

map f and comap f form a GaloisInsertion when f is surjective.

Instances For
theorem AddSubsemigroup.map_comap_eq_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) :
theorem Subsemigroup.map_comap_eq_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) (S : ) :
= S
theorem AddSubsemigroup.map_surjective_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :
theorem Subsemigroup.map_surjective_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :
theorem AddSubsemigroup.comap_injective_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :
theorem Subsemigroup.comap_injective_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :
theorem AddSubsemigroup.map_inf_comap_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) (T : ) :
= S T
theorem Subsemigroup.map_inf_comap_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) (S : ) (T : ) :
= S T
theorem AddSubsemigroup.map_iInf_comap_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {ι : Type u_5} {f : AddHom M N} (hf : ) (S : ι) :
AddSubsemigroup.map f (⨅ (i : ι), AddSubsemigroup.comap f (S i)) = iInf S
theorem Subsemigroup.map_iInf_comap_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {ι : Type u_5} {f : M →ₙ* N} (hf : ) (S : ι) :
Subsemigroup.map f (⨅ (i : ι), Subsemigroup.comap f (S i)) = iInf S
theorem AddSubsemigroup.map_sup_comap_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) (S : ) (T : ) :
= S T
theorem Subsemigroup.map_sup_comap_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) (S : ) (T : ) :
= S T
theorem AddSubsemigroup.map_iSup_comap_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {ι : Type u_5} {f : AddHom M N} (hf : ) (S : ι) :
AddSubsemigroup.map f (⨆ (i : ι), AddSubsemigroup.comap f (S i)) = iSup S
theorem Subsemigroup.map_iSup_comap_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {ι : Type u_5} {f : M →ₙ* N} (hf : ) (S : ι) :
Subsemigroup.map f (⨆ (i : ι), Subsemigroup.comap f (S i)) = iSup S
theorem AddSubsemigroup.comap_le_comap_iff_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) {S : } {T : } :
S T
theorem Subsemigroup.comap_le_comap_iff_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) {S : } {T : } :
S T
theorem AddSubsemigroup.comap_strictMono_of_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} (hf : ) :
theorem Subsemigroup.comap_strictMono_of_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} (hf : ) :
theorem AddMemClass.add.proof_1 {M : Type u_1} {A : Type u_2} [Add M] [SetLike A M] [hA : ] (S' : A) (a : { x // x S' }) (b : { x // x S' }) :
a + b S'
instance AddMemClass.add {M : Type u_1} {A : Type u_5} [Add M] [SetLike A M] [hA : ] (S' : A) :
Add { x // x S' }

instance MulMemClass.mul {M : Type u_1} {A : Type u_5} [Mul M] [SetLike A M] [hA : ] (S' : A) :
Mul { x // x S' }

A submagma of a magma inherits a multiplication.

@[simp]
theorem AddMemClass.coe_add {M : Type u_1} {A : Type u_5} [Add M] [SetLike A M] [hA : ] (S' : A) (x : { x // x S' }) (y : { x // x S' }) :
↑(x + y) = x + y
@[simp]
theorem MulMemClass.coe_mul {M : Type u_1} {A : Type u_5} [Mul M] [SetLike A M] [hA : ] (S' : A) (x : { x // x S' }) (y : { x // x S' }) :
↑(x * y) = x * y
@[simp]
theorem AddMemClass.mk_add_mk {M : Type u_1} {A : Type u_5} [Add M] [SetLike A M] [hA : ] (S' : A) (x : M) (y : M) (hx : x S') (hy : y S') :
{ val := x, property := hx } + { val := y, property := hy } = { val := x + y, property := (_ : x + y S') }
@[simp]
theorem MulMemClass.mk_mul_mk {M : Type u_1} {A : Type u_5} [Mul M] [SetLike A M] [hA : ] (S' : A) (x : M) (y : M) (hx : x S') (hy : y S') :
{ val := x, property := hx } * { val := y, property := hy } = { val := x * y, property := (_ : x * y S') }
theorem AddMemClass.add_def {M : Type u_1} {A : Type u_5} [Add M] [SetLike A M] [hA : ] (S' : A) (x : { x // x S' }) (y : { x // x S' }) :
x + y = { val := x + y, property := (_ : x + y S') }
theorem MulMemClass.mul_def {M : Type u_1} {A : Type u_5} [Mul M] [SetLike A M] [hA : ] (S' : A) (x : { x // x S' }) (y : { x // x S' }) :
x * y = { val := x * y, property := (_ : x * y S') }
theorem AddMemClass.toAddSemigroup.proof_2 {M : Type u_1} [] {A : Type u_2} [SetLike A M] [] (S : A) :
∀ (x x_1 : { x // x S }), ↑(x + x_1) = ↑(x + x_1)
instance AddMemClass.toAddSemigroup {M : Type u_6} [] {A : Type u_7} [SetLike A M] [] (S : A) :
AddSemigroup { x // x S }

An AddSubsemigroup of an AddSemigroup inherits an AddSemigroup structure.

theorem AddMemClass.toAddSemigroup.proof_1 {M : Type u_1} {A : Type u_2} [SetLike A M] (S : A) :
Function.Injective fun a => a
instance MulMemClass.toSemigroup {M : Type u_6} [] {A : Type u_7} [SetLike A M] [] (S : A) :
Semigroup { x // x S }

A subsemigroup of a semigroup inherits a semigroup structure.

instance AddMemClass.toAddCommSemigroup {M : Type u_7} [] {A : Type u_6} [SetLike A M] [] (S : A) :
AddCommSemigroup { x // x S }

An AddSubsemigroup of an AddCommSemigroup is an AddCommSemigroup.

theorem AddMemClass.toAddCommSemigroup.proof_1 {M : Type u_1} {A : Type u_2} [SetLike A M] (S : A) :
Function.Injective fun a => a
theorem AddMemClass.toAddCommSemigroup.proof_2 {M : Type u_1} [] {A : Type u_2} [SetLike A M] [] (S : A) :
∀ (x x_1 : { x // x S }), ↑(x + x_1) = ↑(x + x_1)
instance MulMemClass.toCommSemigroup {M : Type u_7} [] {A : Type u_6} [SetLike A M] [] (S : A) :
CommSemigroup { x // x S }

A subsemigroup of a CommSemigroup is a CommSemigroup.

theorem AddMemClass.subtype.proof_1 {M : Type u_1} {A : Type u_2} [Add M] [SetLike A M] [hA : ] (S' : A) :
∀ (x x_1 : { x // x S' }), ↑(x + x_1) = ↑(x + x_1)
def AddMemClass.subtype {M : Type u_1} {A : Type u_5} [Add M] [SetLike A M] [hA : ] (S' : A) :
AddHom { x // x S' } M

The natural semigroup hom from an AddSubsemigroup of AddSubsemigroup M to M.

Instances For
def MulMemClass.subtype {M : Type u_1} {A : Type u_5} [Mul M] [SetLike A M] [hA : ] (S' : A) :
{ x // x S' } →ₙ* M

The natural semigroup hom from a subsemigroup of semigroup M to M.

Instances For
@[simp]
theorem AddMemClass.coe_subtype {M : Type u_1} {A : Type u_5} [Add M] [SetLike A M] [hA : ] (S' : A) :
↑() = Subtype.val
@[simp]
theorem MulMemClass.coe_subtype {M : Type u_1} {A : Type u_5} [Mul M] [SetLike A M] [hA : ] (S' : A) :
↑() = Subtype.val
∀ (x : M), (fun x => x) ((fun x => { val := x, property := (_ : x ) }) x) = (fun x => x) ((fun x => { val := x, property := (_ : x ) }) x)
{ x // x } ≃+ M

Instances For
∀ (x x_1 : { x // x }), Equiv.toFun { toFun := fun x => x, invFun := fun x => { val := x, property := (_ : x ) }, left_inv := (_ : ∀ (x : { x // x }), { val := x, property := (_ : (fun x => x) x ) } = x), right_inv := (_ : ∀ (x : M), (fun x => x) ((fun x => { val := x, property := (_ : x ) }) x) = (fun x => x) ((fun x => { val := x, property := (_ : x ) }) x)) } (x + x_1) = Equiv.toFun { toFun := fun x => x, invFun := fun x => { val := x, property := (_ : x ) }, left_inv := (_ : ∀ (x : { x // x }), { val := x, property := (_ : (fun x => x) x ) } = x), right_inv := (_ : ∀ (x : M), (fun x => x) ((fun x => { val := x, property := (_ : x ) }) x) = (fun x => x) ((fun x => { val := x, property := (_ : x ) }) x)) } (x + x_1)
theorem AddSubsemigroup.topEquiv.proof_1 {M : Type u_1} [Add M] (x : { x // x }) :
{ val := x, property := (_ : (fun x => x) x ) } = x
@[simp]
theorem Subsemigroup.topEquiv_apply {M : Type u_1} [Mul M] (x : { x // x }) :
Subsemigroup.topEquiv x = x
@[simp]
theorem Subsemigroup.topEquiv_symm_apply_coe {M : Type u_1} [Mul M] (x : M) :
↑(↑(MulEquiv.symm Subsemigroup.topEquiv) x) = x
@[simp]
theorem AddSubsemigroup.topEquiv_apply {M : Type u_1} [Add M] (x : { x // x }) :
@[simp]
theorem AddSubsemigroup.topEquiv_symm_apply_coe {M : Type u_1} [Add M] (x : M) :
def Subsemigroup.topEquiv {M : Type u_1} [Mul M] :
{ x // x } ≃* M

The top subsemigroup is isomorphic to the semigroup.

Instances For
@[simp]
@[simp]
theorem Subsemigroup.topEquiv_toMulHom {M : Type u_1} [Mul M] :
Subsemigroup.topEquiv =
theorem AddSubsemigroup.equivMapOfInjective.proof_3 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (f : AddHom M N) (hf : ) :
∀ (x x_1 : { x // x S }), Equiv.toFun { toFun := (Equiv.Set.image (f) (S) hf).toFun, invFun := (Equiv.Set.image (f) (S) hf).invFun, left_inv := (_ : Function.LeftInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun), right_inv := (_ : Function.RightInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun) } (x + x_1) = Equiv.toFun { toFun := (Equiv.Set.image (f) (S) hf).toFun, invFun := (Equiv.Set.image (f) (S) hf).invFun, left_inv := (_ : Function.LeftInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun), right_inv := (_ : Function.RightInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun) } x + Equiv.toFun { toFun := (Equiv.Set.image (f) (S) hf).toFun, invFun := (Equiv.Set.image (f) (S) hf).invFun, left_inv := (_ : Function.LeftInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun), right_inv := (_ : Function.RightInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun) } x_1
theorem AddSubsemigroup.equivMapOfInjective.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (f : AddHom M N) (hf : ) :
Function.LeftInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun
theorem AddSubsemigroup.equivMapOfInjective.proof_2 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (f : AddHom M N) (hf : ) :
Function.RightInverse (Equiv.Set.image (f) (S) hf).invFun (Equiv.Set.image (f) (S) hf).toFun
noncomputable def AddSubsemigroup.equivMapOfInjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (f : AddHom M N) (hf : ) :
{ x // x S } ≃+ { x // x }

An additive subsemigroup is isomorphic to its image under an injective function

Instances For
noncomputable def Subsemigroup.equivMapOfInjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) (f : M →ₙ* N) (hf : ) :
{ x // x S } ≃* { x // x }

A subsemigroup is isomorphic to its image under an injective function

Instances For
@[simp]
theorem AddSubsemigroup.coe_equivMapOfInjective_apply {M : Type u_1} {N : Type u_2} [Add M] [Add N] (S : ) (f : AddHom M N) (hf : ) (x : { x // x S }) :
↑(↑() x) = f x
@[simp]
theorem Subsemigroup.coe_equivMapOfInjective_apply {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (S : ) (f : M →ₙ* N) (hf : ) (x : { x // x S }) :
↑(↑() x) = f x
@[simp]
@[simp]
theorem Subsemigroup.closure_closure_coe_preimage {M : Type u_1} [Mul M] {s : Set M} :
def AddSubsemigroup.prod {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) (t : ) :

Given AddSubsemigroups s, t of AddSemigroups A, B respectively, s × t as an AddSubsemigroup of A × B.

Instances For
theorem AddSubsemigroup.prod.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) (t : ) :
∀ {a b : M × N}, a s ×ˢ tb s ×ˢ t(a + b).fst s (a + b).snd t
def Subsemigroup.prod {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (s : ) (t : ) :

Given Subsemigroups s, t of semigroups M, N respectively, s × t as a subsemigroup of M × N.

Instances For
theorem AddSubsemigroup.coe_prod {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) (t : ) :
↑() = s ×ˢ t
theorem Subsemigroup.coe_prod {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (s : ) (t : ) :
↑() = s ×ˢ t
theorem AddSubsemigroup.mem_prod {M : Type u_1} {N : Type u_2} [Add M] [Add N] {s : } {t : } {p : M × N} :
p.fst s p.snd t
theorem Subsemigroup.mem_prod {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {s : } {t : } {p : M × N} :
p p.fst s p.snd t
theorem AddSubsemigroup.prod_mono {M : Type u_1} {N : Type u_2} [Add M] [Add N] {s₁ : } {s₂ : } {t₁ : } {t₂ : } (hs : s₁ s₂) (ht : t₁ t₂) :
theorem Subsemigroup.prod_mono {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {s₁ : } {s₂ : } {t₁ : } {t₂ : } (hs : s₁ s₂) (ht : t₁ t₂) :
theorem AddSubsemigroup.prod_top {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) :
theorem Subsemigroup.prod_top {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (s : ) :
theorem AddSubsemigroup.top_prod {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) :
theorem Subsemigroup.top_prod {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (s : ) :
@[simp]
@[simp]
theorem Subsemigroup.top_prod_top {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] :
theorem Subsemigroup.bot_prod_bot {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] :
theorem AddSubsemigroup.prodEquiv.proof_4 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) (t : ) :
∀ (x x_1 : { x // }), Equiv.toFun { toFun := (Equiv.Set.prod s t).toFun, invFun := (Equiv.Set.prod s t).invFun, left_inv := (_ : Function.LeftInverse (Equiv.Set.prod s t).invFun (Equiv.Set.prod s t).toFun), right_inv := (_ : Function.RightInverse (Equiv.Set.prod s t).invFun (Equiv.Set.prod s t).toFun) } (x + x_1) = Equiv.toFun { toFun := (Equiv.Set.prod s t).toFun, invFun := (Equiv.Set.prod s t).invFun, left_inv := (_ : Function.LeftInverse (Equiv.Set.prod s t).invFun (Equiv.Set.prod s t).toFun), right_inv := (_ : Function.RightInverse (Equiv.Set.prod s t).invFun (Equiv.Set.prod s t).toFun) } (x + x_1)
theorem AddSubsemigroup.prodEquiv.proof_2 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) (t : ) :
Function.LeftInverse (Equiv.Set.prod s t).invFun (Equiv.Set.prod s t).toFun
def AddSubsemigroup.prodEquiv {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) (t : ) :
{ x // } ≃+ { x // x s } × { x // x t }

The product of additive subsemigroups is isomorphic to their product as additive semigroups

Instances For
theorem AddSubsemigroup.prodEquiv.proof_3 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (s : ) (t : ) :
Function.RightInverse (Equiv.Set.prod s t).invFun (Equiv.Set.prod s t).toFun
def Subsemigroup.prodEquiv {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (s : ) (t : ) :
{ x // x } ≃* { x // x s } × { x // x t }

The product of subsemigroups is isomorphic to their product as semigroups.

Instances For
theorem AddSubsemigroup.mem_map_equiv {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : M ≃+ N} {K : } {x : N} :
x AddSubsemigroup.map (f) K ↑() x K
theorem Subsemigroup.mem_map_equiv {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M ≃* N} {K : } {x : N} :
x Subsemigroup.map (f) K ↑() x K
theorem AddSubsemigroup.map_equiv_eq_comap_symm {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : M ≃+ N) (K : ) :
theorem Subsemigroup.map_equiv_eq_comap_symm {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M ≃* N) (K : ) :
theorem AddSubsemigroup.comap_equiv_eq_map_symm {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : N ≃+ M) (K : ) :
theorem Subsemigroup.comap_equiv_eq_map_symm {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : N ≃* M) (K : ) :
@[simp]
theorem AddSubsemigroup.map_equiv_top {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : M ≃+ N) :
@[simp]
theorem Subsemigroup.map_equiv_top {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M ≃* N) :
theorem AddSubsemigroup.le_prod_iff {M : Type u_1} {N : Type u_2} [Add M] [Add N] {s : } {t : } {u : AddSubsemigroup (M × N)} :
s t
theorem Subsemigroup.le_prod_iff {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {s : } {t : } {u : Subsemigroup (M × N)} :

The range of an AddHom is an AddSubsemigroup.

Instances For
= f '' Set.univ
def MulHom.srange {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) :

The range of a semigroup homomorphism is a subsemigroup. See Note [range copy pattern].

Instances For
@[simp]
↑() =
@[simp]
theorem MulHom.coe_srange {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) :
↑() =
@[simp]
theorem AddHom.mem_srange {M : Type u_1} {N : Type u_2} [Add M] [Add N] {f : AddHom M N} {y : N} :
x, f x = y
@[simp]
theorem MulHom.mem_srange {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {f : M →ₙ* N} {y : N} :
x, f x = y
theorem MulHom.srange_eq_map {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) :
theorem MulHom.map_srange {M : Type u_1} {N : Type u_2} {P : Type u_3} [Mul M] [Mul N] [Mul P] (g : N →ₙ* P) (f : M →ₙ* N) :
theorem MulHom.srange_top_iff_surjective {M : Type u_1} [Mul M] {N : Type u_5} [Mul N] {f : M →ₙ* N} :
@[simp]
theorem AddHom.srange_top_of_surjective {M : Type u_1} [Add M] {N : Type u_5} [Add N] (f : AddHom M N) (hf : ) :

The range of a surjective AddSemigroup hom is the whole of the codomain.

@[simp]
theorem MulHom.srange_top_of_surjective {M : Type u_1} [Mul M] {N : Type u_5} [Mul N] (f : M →ₙ* N) (hf : ) :

The range of a surjective semigroup hom is the whole of the codomain.

theorem AddHom.mclosure_preimage_le {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (s : Set N) :
theorem MulHom.mclosure_preimage_le {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (s : Set N) :
theorem AddHom.map_mclosure {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (s : Set M) :

The image under an AddSemigroup hom of the AddSubsemigroup generated by a set equals the AddSubsemigroup generated by the image of the set.

theorem MulHom.map_mclosure {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (s : Set M) :

The image under a semigroup hom of the subsemigroup generated by a set equals the subsemigroup generated by the image of the set.

def AddHom.restrict {M : Type u_1} {σ : Type u_4} [Add M] {N : Type u_5} [Add N] [SetLike σ M] [] (f : AddHom M N) (S : σ) :
AddHom { x // x S } N

Restriction of an AddSemigroup hom to an AddSubsemigroup of the domain.

Instances For
def MulHom.restrict {M : Type u_1} {σ : Type u_4} [Mul M] {N : Type u_5} [Mul N] [SetLike σ M] [] (f : M →ₙ* N) (S : σ) :
{ x // x S } →ₙ* N

Restriction of a semigroup hom to a subsemigroup of the domain.

Instances For
@[simp]
theorem AddHom.restrict_apply {M : Type u_1} {σ : Type u_4} [Add M] {N : Type u_5} [Add N] [SetLike σ M] [] (f : AddHom M N) {S : σ} (x : { x // x S }) :
↑() x = f x
@[simp]
theorem MulHom.restrict_apply {M : Type u_1} {σ : Type u_4} [Mul M] {N : Type u_5} [Mul N] [SetLike σ M] [] (f : M →ₙ* N) {S : σ} (x : { x // x S }) :
↑() x = f x
theorem AddHom.codRestrict.proof_1 {M : Type u_3} {N : Type u_1} {σ : Type u_2} [Add M] [Add N] [SetLike σ N] [] (f : AddHom M N) (S : σ) (h : ∀ (x : M), f x S) (x : M) (y : M) :
(fun n => { val := f n, property := h n }) (x + y) = (fun n => { val := f n, property := h n }) x + (fun n => { val := f n, property := h n }) y
def AddHom.codRestrict {M : Type u_1} {N : Type u_2} {σ : Type u_4} [Add M] [Add N] [SetLike σ N] [] (f : AddHom M N) (S : σ) (h : ∀ (x : M), f x S) :
AddHom M { x // x S }

Restriction of an AddSemigroup hom to an AddSubsemigroup of the codomain.

Instances For
@[simp]
theorem MulHom.codRestrict_apply_coe {M : Type u_1} {N : Type u_2} {σ : Type u_4} [Mul M] [Mul N] [SetLike σ N] [] (f : M →ₙ* N) (S : σ) (h : ∀ (x : M), f x S) (n : M) :
↑(↑() n) = f n
@[simp]
theorem AddHom.codRestrict_apply_coe {M : Type u_1} {N : Type u_2} {σ : Type u_4} [Add M] [Add N] [SetLike σ N] [] (f : AddHom M N) (S : σ) (h : ∀ (x : M), f x S) (n : M) :
↑(↑() n) = f n
def MulHom.codRestrict {M : Type u_1} {N : Type u_2} {σ : Type u_4} [Mul M] [Mul N] [SetLike σ N] [] (f : M →ₙ* N) (S : σ) (h : ∀ (x : M), f x S) :
M →ₙ* { x // x S }

Restriction of a semigroup hom to a subsemigroup of the codomain.

Instances For
theorem AddHom.srangeRestrict.proof_1 {M : Type u_1} [Add M] {N : Type u_2} [Add N] (f : AddHom M N) (x : M) :
y, f y = f x
AddHom M { x // }

Restriction of an AddSemigroup hom to its range interpreted as a subsemigroup.

Instances For
def MulHom.srangeRestrict {M : Type u_1} [Mul M] {N : Type u_5} [Mul N] (f : M →ₙ* N) :
M →ₙ* { x // }

Restriction of a semigroup hom to its range interpreted as a subsemigroup.

Instances For
@[simp]
theorem AddHom.coe_srangeRestrict {M : Type u_1} [Add M] {N : Type u_5} [Add N] (f : AddHom M N) (x : M) :
↑(↑() x) = f x
@[simp]
theorem MulHom.coe_srangeRestrict {M : Type u_1} [Mul M] {N : Type u_5} [Mul N] (f : M →ₙ* N) (x : M) :
↑(↑() x) = f x
abbrev AddHom.srangeRestrict_surjective.match_1 {M : Type u_2} {N : Type u_1} [Add M] [Add N] (f : AddHom M N) (motive : { x // }Prop) :
(x : { x // }) → ((x : M) → motive { val := f x, property := (_ : y, f y = f x) }) → motive x
Instances For
theorem MulHom.srangeRestrict_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) :
theorem AddHom.prod_map_comap_prod' {M : Type u_1} {N : Type u_2} [Add M] [Add N] {M' : Type u_5} {N' : Type u_6} [Add M'] [Add N'] (f : AddHom M N) (g : AddHom M' N') (S : ) (S' : ) :
theorem MulHom.prod_map_comap_prod' {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] {M' : Type u_5} {N' : Type u_6} [Mul M'] [Mul N'] (f : M →ₙ* N) (g : M' →ₙ* N') (S : ) (S' : ) :
theorem AddHom.subsemigroupComap.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (N' : ) (x : { x // x }) :
x
theorem AddHom.subsemigroupComap.proof_2 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (N' : ) (x : { x // x }) (y : { x // x }) :
(fun x => { val := f x, property := (_ : x ) }) (x + y) = (fun x => { val := f x, property := (_ : x ) }) x + (fun x => { val := f x, property := (_ : x ) }) y
def AddHom.subsemigroupComap {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (N' : ) :
AddHom { x // x } { x // x N' }

The AddHom from the preimage of an additive subsemigroup to itself.

Instances For
@[simp]
theorem AddHom.subsemigroupComap_apply_coe {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (N' : ) (x : { x // x }) :
↑(↑() x) = f x
@[simp]
theorem MulHom.subsemigroupComap_apply_coe {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (N' : ) (x : { x // x }) :
↑(↑() x) = f x
def MulHom.subsemigroupComap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (N' : ) :
{ x // x } →ₙ* { x // x N' }

The MulHom from the preimage of a subsemigroup to itself.

Instances For
theorem AddHom.subsemigroupMap.proof_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (M' : ) (x : { x // x M' }) :
a, a M' f a = f x
theorem AddHom.subsemigroupMap.proof_2 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (M' : ) (x : { x // x M' }) (y : { x // x M' }) :
(fun x => { val := f x, property := (_ : a, a M' f a = f x) }) (x + y) = (fun x => { val := f x, property := (_ : a, a M' f a = f x) }) x + (fun x => { val := f x, property := (_ : a, a M' f a = f x) }) y
def AddHom.subsemigroupMap {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (M' : ) :
AddHom { x // x M' } { x // x }

the AddHom from an additive subsemigroup to its image. See AddEquiv.addSubsemigroupMap for a variant for AddEquivs.

Instances For
@[simp]
theorem AddHom.subsemigroupMap_apply_coe {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (M' : ) (x : { x // x M' }) :
↑(↑() x) = f x
@[simp]
theorem MulHom.subsemigroupMap_apply_coe {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (M' : ) (x : { x // x M' }) :
↑(↑() x) = f x
def MulHom.subsemigroupMap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (M' : ) :
{ x // x M' } →ₙ* { x // x }

The MulHom from a subsemigroup to its image. See MulEquiv.subsemigroupMap for a variant for MulEquivs.

Instances For
theorem AddHom.subsemigroupMap_surjective {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (M' : ) :
theorem MulHom.subsemigroupMap_surjective {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) (M' : ) :
@[simp]
@[simp]
theorem Subsemigroup.srange_fst {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] [] :
@[simp]
@[simp]
theorem Subsemigroup.srange_snd {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] [] :
theorem AddSubsemigroup.prod_eq_top_iff {M : Type u_1} {N : Type u_2} [Add M] [Add N] [] [] {s : } {t : } :
s = t =
theorem Subsemigroup.prod_eq_top_iff {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] [] [] {s : } {t : } :
s = t =
theorem AddSubsemigroup.inclusion.proof_1 {M : Type u_1} [Add M] {S : } {T : } (h : S T) (x : { x // x S }) :
↑() x T
def AddSubsemigroup.inclusion {M : Type u_1} [Add M] {S : } {T : } (h : S T) :
AddHom { x // x S } { x // x T }

The AddSemigroup hom associated to an inclusion of subsemigroups.

Instances For
def Subsemigroup.inclusion {M : Type u_1} [Mul M] {S : } {T : } (h : S T) :
{ x // x S } →ₙ* { x // x T }

The semigroup hom associated to an inclusion of subsemigroups.

Instances For
@[simp]
theorem AddSubsemigroup.range_subtype {M : Type u_1} [Add M] (s : ) :
@[simp]
theorem Subsemigroup.range_subtype {M : Type u_1} [Mul M] (s : ) :
theorem AddSubsemigroup.eq_top_iff' {M : Type u_1} [Add M] (S : ) :
S = ∀ (x : M), x S
theorem Subsemigroup.eq_top_iff' {M : Type u_1} [Mul M] (S : ) :
S = ∀ (x : M), x S
theorem AddEquiv.subsemigroupCongr.proof_4 {M : Type u_1} [Add M] {S : } {T : } (h : S = T) :
∀ (x x_1 : { x // x S }), Equiv.toFun { toFun := (Equiv.setCongr (_ : S = T)).toFun, invFun := (Equiv.setCongr (_ : S = T)).invFun, left_inv := (_ : Function.LeftInverse (Equiv.setCongr (_ : S = T)).invFun (Equiv.setCongr (_ : S = T)).toFun), right_inv := (_ : Function.RightInverse (Equiv.setCongr (_ : S = T)).invFun (Equiv.setCongr (_ : S = T)).toFun) } (x + x_1) = Equiv.toFun { toFun := (Equiv.setCongr (_ : S = T)).toFun, invFun := (Equiv.setCongr (_ : S = T)).invFun, left_inv := (_ : Function.LeftInverse (Equiv.setCongr (_ : S = T)).invFun (Equiv.setCongr (_ : S = T)).toFun), right_inv := (_ : Function.RightInverse (Equiv.setCongr (_ : S = T)).invFun (Equiv.setCongr (_ : S = T)).toFun) } (x + x_1)
def AddEquiv.subsemigroupCongr {M : Type u_1} [Add M] {S : } {T : } (h : S = T) :
{ x // x S } ≃+ { x // x T }

Makes the identity additive isomorphism from a proof two subsemigroups of an additive semigroup are equal.

Instances For
theorem AddEquiv.subsemigroupCongr.proof_1 {M : Type u_1} [Add M] {S : } {T : } (h : S = T) :
S = T
theorem AddEquiv.subsemigroupCongr.proof_3 {M : Type u_1} [Add M] {S : } {T : } (h : S = T) :
Function.RightInverse (Equiv.setCongr (_ : S = T)).invFun (Equiv.setCongr (_ : S = T)).toFun
theorem AddEquiv.subsemigroupCongr.proof_2 {M : Type u_1} [Add M] {S : } {T : } (h : S = T) :
Function.LeftInverse (Equiv.setCongr (_ : S = T)).invFun (Equiv.setCongr (_ : S = T)).toFun
def MulEquiv.subsemigroupCongr {M : Type u_1} [Mul M] {S : } {T : } (h : S = T) :
{ x // x S } ≃* { x // x T }

Makes the identity isomorphism from a proof that two subsemigroups of a multiplicative semigroup are equal.

Instances For
theorem AddEquiv.ofLeftInverse.proof_1 {M : Type u_2} {N : Type u_1} [Add M] [Add N] (f : AddHom M N) {g : NM} (h : ) (x : { x // }) :
↑() ((g ↑()) x) = x
theorem AddEquiv.ofLeftInverse.proof_2 {M : Type u_2} {N : Type u_1} [Add M] [Add N] (f : AddHom M N) (x : M) (y : M) :
AddHom.toFun () (x + y) =
abbrev AddEquiv.ofLeftInverse.match_1 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) (x : { x // }) (motive : (x, f x = x) → Prop) :
(x : x, f x = x) → ((x' : M) → (hx' : f x' = x) → motive (_ : x, f x = x)) → motive x
Instances For
def AddEquiv.ofLeftInverse {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) {g : NM} (h : ) :
M ≃+ { x // }

An additive semigroup homomorphism f : M →+ N with a left-inverse g : N → M defines an additive equivalence between M and f.srange. This is a bidirectional version of AddHom.srangeRestrict.

Instances For
@[simp]
theorem MulEquiv.ofLeftInverse_symm_apply {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) {g : NM} (h : ) :
∀ (a : { x // }), ↑() a = g a
@[simp]
theorem MulEquiv.ofLeftInverse_apply {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) {g : NM} (h : ) (a : M) :
↑() a = ↑() a
@[simp]
theorem AddEquiv.ofLeftInverse_apply {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) {g : NM} (h : ) (a : M) :
↑() a = ↑() a
@[simp]
theorem AddEquiv.ofLeftInverse_symm_apply {M : Type u_1} {N : Type u_2} [Add M] [Add N] (f : AddHom M N) {g : NM} (h : ) :
∀ (a : { x // }), ↑() a = g a
def MulEquiv.ofLeftInverse {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (f : M →ₙ* N) {g : NM} (h : ) :
M ≃* { x // }

A semigroup homomorphism f : M →ₙ* N with a left-inverse g : N → M defines a multiplicative equivalence between M and f.srange.

This is a bidirectional version of MulHom.srangeRestrict.

Instances For
def AddEquiv.subsemigroupMap {M : Type u_1} {N : Type u_2} [Add M] [Add N] (e : M ≃+ N) (S : ) :
{ x // x S } ≃+ { x // x AddSubsemigroup.map (e) S }

An AddEquiv φ between two additive semigroups M and N induces an AddEquiv between a subsemigroup S ≤ M and the subsemigroup φ(S) ≤ N. See AddHom.addSubsemigroupMap for a variant for AddHoms.

Instances For
theorem AddEquiv.subsemigroupMap.proof_4 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (e : M ≃+ N) (S : ) :
Function.RightInverse (Equiv.image e S).invFun (Equiv.image e S).toFun
theorem AddEquiv.subsemigroupMap.proof_1 {M : Type u_2} {N : Type u_1} [Add M] [Add N] (e : M ≃+ N) (S : ) (x : { x // x S }) :
e x e '' S
theorem AddEquiv.subsemigroupMap.proof_2 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (e : M ≃+ N) (S : ) (x : { x // x AddSubsemigroup.map (e) S }) :
(e).symm x S
theorem AddEquiv.subsemigroupMap.proof_5 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (e : M ≃+ N) (S : ) (x : { x // x S }) (y : { x // x S }) :
theorem AddEquiv.subsemigroupMap.proof_3 {M : Type u_1} {N : Type u_2} [Add M] [Add N] (e : M ≃+ N) (S : ) :
Function.LeftInverse (Equiv.image e S).invFun (Equiv.image e S).toFun
@[simp]
theorem MulEquiv.subsemigroupMap_symm_apply_coe {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (e : M ≃* N) (S : ) (x : { x // x Subsemigroup.map (e) S }) :
↑(↑() x) = ↑() x
@[simp]
theorem AddEquiv.subsemigroupMap_symm_apply_coe {M : Type u_1} {N : Type u_2} [Add M] [Add N] (e : M ≃+ N) (S : ) (x : { x // x AddSubsemigroup.map (e) S }) :
↑(↑() x) = ↑() x
@[simp]
theorem AddEquiv.subsemigroupMap_apply_coe {M : Type u_1} {N : Type u_2} [Add M] [Add N] (e : M ≃+ N) (S : ) (x : { x // x S }) :
↑(↑() x) = e x
@[simp]
theorem MulEquiv.subsemigroupMap_apply_coe {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (e : M ≃* N) (S : ) (x : { x // x S }) :
↑(↑() x) = e x
def MulEquiv.subsemigroupMap {M : Type u_1} {N : Type u_2} [Mul M] [Mul N] (e : M ≃* N) (S : ) :
{ x // x S } ≃* { x // x Subsemigroup.map (e) S }

A MulEquiv φ between two semigroups M and N induces a MulEquiv between a subsemigroup S ≤ M and the subsemigroup φ(S) ≤ N. See MulHom.subsemigroupMap for a variant for MulHoms.

Instances For