# Isomorphisms of semigroups
```agda
module group-theory.isomorphisms-semigroups where
```
<details><summary>Imports</summary>
```agda
open import category-theory.isomorphisms-in-large-precategories
open import foundation.action-on-identifications-functions
open import foundation.contractible-types
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.functoriality-dependent-pair-types
open import foundation.homotopies
open import foundation.identity-types
open import foundation.propositions
open import foundation.subtypes
open import foundation.torsorial-type-families
open import foundation.type-arithmetic-dependent-pair-types
open import foundation.universe-levels
open import group-theory.equivalences-semigroups
open import group-theory.homomorphisms-semigroups
open import group-theory.precategory-of-semigroups
open import group-theory.semigroups
```
</details>
## Idea
Isomorphisms of semigroups are homomorphisms that have a two-sided inverse.
## Definition
### The predicate of being an isomorphism of semigroups
```agda
module _
{l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
(f : hom-Semigroup G H)
where
is-iso-Semigroup : UU (l1 ⊔ l2)
is-iso-Semigroup =
is-iso-Large-Precategory Semigroup-Large-Precategory {X = G} {Y = H} f
hom-inv-is-iso-Semigroup :
is-iso-Semigroup → hom-Semigroup H G
hom-inv-is-iso-Semigroup =
hom-inv-is-iso-Large-Precategory
( Semigroup-Large-Precategory)
{ X = G}
{ Y = H}
( f)
map-inv-is-iso-Semigroup :
is-iso-Semigroup → type-Semigroup H → type-Semigroup G
map-inv-is-iso-Semigroup U =
map-hom-Semigroup H G (hom-inv-is-iso-Semigroup U)
is-section-hom-inv-is-iso-Semigroup :
(U : is-iso-Semigroup) →
comp-hom-Semigroup H G H f (hom-inv-is-iso-Semigroup U) =
id-hom-Semigroup H
is-section-hom-inv-is-iso-Semigroup =
is-section-hom-inv-is-iso-Large-Precategory
( Semigroup-Large-Precategory)
{ X = G}
{ Y = H}
( f)
is-section-map-inv-is-iso-Semigroup :
(U : is-iso-Semigroup) →
( map-hom-Semigroup G H f ∘ map-inv-is-iso-Semigroup U) ~ id
is-section-map-inv-is-iso-Semigroup U =
htpy-eq-hom-Semigroup H H
( comp-hom-Semigroup H G H f (hom-inv-is-iso-Semigroup U))
( id-hom-Semigroup H)
( is-section-hom-inv-is-iso-Semigroup U)
is-retraction-hom-inv-is-iso-Semigroup :
(U : is-iso-Semigroup) →
comp-hom-Semigroup G H G (hom-inv-is-iso-Semigroup U) f =
id-hom-Semigroup G
is-retraction-hom-inv-is-iso-Semigroup =
is-retraction-hom-inv-is-iso-Large-Precategory
( Semigroup-Large-Precategory)
{ X = G}
{ Y = H}
( f)
is-retraction-map-inv-is-iso-Semigroup :
(U : is-iso-Semigroup) →
( map-inv-is-iso-Semigroup U ∘ map-hom-Semigroup G H f) ~ id
is-retraction-map-inv-is-iso-Semigroup U =
htpy-eq-hom-Semigroup G G
( comp-hom-Semigroup G H G (hom-inv-is-iso-Semigroup U) f)
( id-hom-Semigroup G)
( is-retraction-hom-inv-is-iso-Semigroup U)
```
### Isomorphisms of semigroups
```agda
module _
{l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
where
iso-Semigroup : UU (l1 ⊔ l2)
iso-Semigroup = iso-Large-Precategory Semigroup-Large-Precategory G H
module _
{l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2) (f : iso-Semigroup G H)
where
hom-iso-Semigroup : hom-Semigroup G H
hom-iso-Semigroup =
hom-iso-Large-Precategory Semigroup-Large-Precategory {X = G} {Y = H} f
map-iso-Semigroup : type-Semigroup G → type-Semigroup H
map-iso-Semigroup = map-hom-Semigroup G H hom-iso-Semigroup
preserves-mul-iso-Semigroup :
{x y : type-Semigroup G} →
map-iso-Semigroup (mul-Semigroup G x y) =
mul-Semigroup H (map-iso-Semigroup x) (map-iso-Semigroup y)
preserves-mul-iso-Semigroup =
preserves-mul-hom-Semigroup G H hom-iso-Semigroup
is-iso-iso-Semigroup : is-iso-Semigroup G H hom-iso-Semigroup
is-iso-iso-Semigroup =
is-iso-iso-Large-Precategory Semigroup-Large-Precategory {X = G} {Y = H} f
inv-iso-Semigroup : iso-Semigroup H G
inv-iso-Semigroup =
inv-iso-Large-Precategory Semigroup-Large-Precategory {X = G} {Y = H} f
hom-inv-iso-Semigroup : hom-Semigroup H G
hom-inv-iso-Semigroup =
hom-inv-iso-Large-Precategory Semigroup-Large-Precategory {X = G} {Y = H} f
map-inv-iso-Semigroup : type-Semigroup H → type-Semigroup G
map-inv-iso-Semigroup =
map-hom-Semigroup H G hom-inv-iso-Semigroup
preserves-mul-inv-iso-Semigroup :
{x y : type-Semigroup H} →
map-inv-iso-Semigroup (mul-Semigroup H x y) =
mul-Semigroup G (map-inv-iso-Semigroup x) (map-inv-iso-Semigroup y)
preserves-mul-inv-iso-Semigroup =
preserves-mul-hom-Semigroup H G hom-inv-iso-Semigroup
is-section-hom-inv-iso-Semigroup :
comp-hom-Semigroup H G H hom-iso-Semigroup hom-inv-iso-Semigroup =
id-hom-Semigroup H
is-section-hom-inv-iso-Semigroup =
is-section-hom-inv-iso-Large-Precategory
( Semigroup-Large-Precategory)
{ X = G}
{ Y = H}
( f)
is-section-map-inv-iso-Semigroup :
map-iso-Semigroup ∘ map-inv-iso-Semigroup ~ id
is-section-map-inv-iso-Semigroup =
htpy-eq-hom-Semigroup H H
( comp-hom-Semigroup H G H
( hom-iso-Semigroup)
( hom-inv-iso-Semigroup))
( id-hom-Semigroup H)
( is-section-hom-inv-iso-Semigroup)
is-retraction-hom-inv-iso-Semigroup :
comp-hom-Semigroup G H G hom-inv-iso-Semigroup hom-iso-Semigroup =
id-hom-Semigroup G
is-retraction-hom-inv-iso-Semigroup =
is-retraction-hom-inv-iso-Large-Precategory
( Semigroup-Large-Precategory)
{ X = G}
{ Y = H}
( f)
is-retraction-map-inv-iso-Semigroup :
map-inv-iso-Semigroup ∘ map-iso-Semigroup ~ id
is-retraction-map-inv-iso-Semigroup =
htpy-eq-hom-Semigroup G G
( comp-hom-Semigroup G H G
( hom-inv-iso-Semigroup)
( hom-iso-Semigroup))
( id-hom-Semigroup G)
( is-retraction-hom-inv-iso-Semigroup)
```
## Properties
### Being an isomorphism is a property
```agda
module _
{l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
where
abstract
is-prop-is-iso-Semigroup :
(f : hom-Semigroup G H) → is-prop (is-iso-Semigroup G H f)
is-prop-is-iso-Semigroup =
is-prop-is-iso-Large-Precategory
( Semigroup-Large-Precategory)
{ X = G}
{ Y = H}
is-iso-prop-Semigroup :
hom-Semigroup G H → Prop (l1 ⊔ l2)
is-iso-prop-Semigroup =
is-iso-prop-Large-Precategory
( Semigroup-Large-Precategory)
{ X = G}
{ Y = H}
```
### The inverse of an equivalence of semigroups preserves the binary operation
```agda
module _
{l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
where
abstract
preserves-mul-map-inv-is-equiv-Semigroup :
( f : hom-Semigroup G H)
( U : is-equiv (map-hom-Semigroup G H f)) →
preserves-mul-Semigroup H G (map-inv-is-equiv U)
preserves-mul-map-inv-is-equiv-Semigroup (f , μ-f) U {x} {y} =
map-inv-is-equiv
( is-emb-is-equiv U
( map-inv-is-equiv U (mul-Semigroup H x y))
( mul-Semigroup G
( map-inv-is-equiv U x)
( map-inv-is-equiv U y)))
( ( is-section-map-inv-is-equiv U (mul-Semigroup H x y)) ∙
( ap
( λ t → mul-Semigroup H t y)
( inv (is-section-map-inv-is-equiv U x))) ∙
( ap
( mul-Semigroup H (f (map-inv-is-equiv U x)))
( inv (is-section-map-inv-is-equiv U y))) ∙
( inv μ-f))
```
### A homomorphism of semigroups is an equivalence of semigroups if and only if it is an isomorphism
```agda
module _
{l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
where
abstract
is-iso-is-equiv-hom-Semigroup :
(f : hom-Semigroup G H) →
is-equiv-hom-Semigroup G H f → is-iso-Semigroup G H f
pr1 (pr1 (is-iso-is-equiv-hom-Semigroup (f , μ-f) U)) =
map-inv-is-equiv U
pr2 (pr1 (is-iso-is-equiv-hom-Semigroup (f , μ-f) U)) =
preserves-mul-map-inv-is-equiv-Semigroup G H (f , μ-f) U
pr1 (pr2 (is-iso-is-equiv-hom-Semigroup (f , μ-f) U)) =
eq-htpy-hom-Semigroup H H (is-section-map-inv-is-equiv U)
pr2 (pr2 (is-iso-is-equiv-hom-Semigroup (f , μ-f) U)) =
eq-htpy-hom-Semigroup G G (is-retraction-map-inv-is-equiv U)
abstract
is-equiv-is-iso-Semigroup :
(f : hom-Semigroup G H) →
is-iso-Semigroup G H f → is-equiv-hom-Semigroup G H f
is-equiv-is-iso-Semigroup (f , μ-f) ((g , μ-g) , S , R) =
is-equiv-is-invertible g
( htpy-eq (ap pr1 S))
( htpy-eq (ap pr1 R))
equiv-iso-equiv-Semigroup : equiv-Semigroup G H ≃ iso-Semigroup G H
equiv-iso-equiv-Semigroup =
( equiv-type-subtype
( λ f → is-property-is-equiv (map-hom-Semigroup G H f))
( is-prop-is-iso-Semigroup G H)
( is-iso-is-equiv-hom-Semigroup)
( is-equiv-is-iso-Semigroup)) ∘e
( equiv-right-swap-Σ)
iso-equiv-Semigroup : equiv-Semigroup G H → iso-Semigroup G H
iso-equiv-Semigroup = map-equiv equiv-iso-equiv-Semigroup
```
### Two semigroups are equal if and only if they are isomorphic
```agda
module _
{l : Level} (G : Semigroup l)
where
is-torsorial-iso-Semigroup :
is-torsorial (iso-Semigroup G)
is-torsorial-iso-Semigroup =
is-contr-equiv'
( Σ (Semigroup l) (equiv-Semigroup G))
( equiv-tot (equiv-iso-equiv-Semigroup G))
( is-torsorial-equiv-Semigroup G)
id-iso-Semigroup : iso-Semigroup G G
id-iso-Semigroup =
id-iso-Large-Precategory Semigroup-Large-Precategory {X = G}
iso-eq-Semigroup : (H : Semigroup l) → Id G H → iso-Semigroup G H
iso-eq-Semigroup = iso-eq-Large-Precategory Semigroup-Large-Precategory G
```