# Homomorphisms of semigroups
```agda
module group-theory.homomorphisms-semigroups where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.function-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.homotopy-induction
open import foundation.identity-types
open import foundation.propositions
open import foundation.sets
open import foundation.subtype-identity-principle
open import foundation.torsorial-type-families
open import foundation.universe-levels
open import group-theory.semigroups
```
</details>
## Idea
A homomorphism between two semigroups is a map between their underlying types
that preserves the binary operation.
## Definition
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
where
preserves-mul : (μA : A → A → A) (μB : B → B → B) → (A → B) → UU (l1 ⊔ l2)
preserves-mul μA μB f = {x y : A} → f (μA x y) = μB (f x) (f y)
preserves-mul' : (μA : A → A → A) (μB : B → B → B) → (A → B) → UU (l1 ⊔ l2)
preserves-mul' μA μB f = (x y : A) → f (μA x y) = μB (f x) (f y)
module _
{l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
where
preserves-mul-prop-Semigroup :
(type-Semigroup G → type-Semigroup H) → Prop (l1 ⊔ l2)
preserves-mul-prop-Semigroup f =
implicit-Π-Prop
( type-Semigroup G)
( λ x →
implicit-Π-Prop
( type-Semigroup G)
( λ y →
Id-Prop
( set-Semigroup H)
( f (mul-Semigroup G x y))
( mul-Semigroup H (f x) (f y))))
preserves-mul-prop-Semigroup' :
(type-Semigroup G → type-Semigroup H) → Prop (l1 ⊔ l2)
preserves-mul-prop-Semigroup' f =
implicit-Π-Prop
( type-Semigroup G)
( λ x →
implicit-Π-Prop
( type-Semigroup G)
( λ y →
Id-Prop
( set-Semigroup H)
( f (mul-Semigroup' G x y))
( mul-Semigroup H (f x) (f y))))
preserves-mul-Semigroup :
(type-Semigroup G → type-Semigroup H) → UU (l1 ⊔ l2)
preserves-mul-Semigroup f =
type-Prop (preserves-mul-prop-Semigroup f)
preserves-mul-Semigroup' :
(type-Semigroup G → type-Semigroup H) → UU (l1 ⊔ l2)
preserves-mul-Semigroup' f =
type-Prop (preserves-mul-prop-Semigroup' f)
is-prop-preserves-mul-Semigroup :
(f : type-Semigroup G → type-Semigroup H) →
is-prop (preserves-mul-Semigroup f)
is-prop-preserves-mul-Semigroup f =
is-prop-type-Prop (preserves-mul-prop-Semigroup f)
is-prop-preserves-mul-Semigroup' :
(f : type-Semigroup G → type-Semigroup H) →
is-prop (preserves-mul-Semigroup' f)
is-prop-preserves-mul-Semigroup' f =
is-prop-type-Prop (preserves-mul-prop-Semigroup' f)
hom-Semigroup : UU (l1 ⊔ l2)
hom-Semigroup =
Σ ( type-Semigroup G → type-Semigroup H)
( preserves-mul-Semigroup)
map-hom-Semigroup :
hom-Semigroup → type-Semigroup G → type-Semigroup H
map-hom-Semigroup f = pr1 f
preserves-mul-hom-Semigroup :
(f : hom-Semigroup) → preserves-mul-Semigroup (map-hom-Semigroup f)
preserves-mul-hom-Semigroup f = pr2 f
```
### Characterizing the identity type of semigroup homomorphisms
```agda
htpy-hom-Semigroup : (f g : hom-Semigroup) → UU (l1 ⊔ l2)
htpy-hom-Semigroup f g = map-hom-Semigroup f ~ map-hom-Semigroup g
refl-htpy-hom-Semigroup : (f : hom-Semigroup) → htpy-hom-Semigroup f f
refl-htpy-hom-Semigroup f = refl-htpy
htpy-eq-hom-Semigroup :
(f g : hom-Semigroup) → Id f g → htpy-hom-Semigroup f g
htpy-eq-hom-Semigroup f .f refl = refl-htpy-hom-Semigroup f
abstract
is-torsorial-htpy-hom-Semigroup :
(f : hom-Semigroup) → is-torsorial (htpy-hom-Semigroup f)
is-torsorial-htpy-hom-Semigroup f =
is-torsorial-Eq-subtype
( is-torsorial-htpy (map-hom-Semigroup f))
( is-prop-preserves-mul-Semigroup)
( map-hom-Semigroup f)
( refl-htpy)
( preserves-mul-hom-Semigroup f)
abstract
is-equiv-htpy-eq-hom-Semigroup :
(f g : hom-Semigroup) → is-equiv (htpy-eq-hom-Semigroup f g)
is-equiv-htpy-eq-hom-Semigroup f =
fundamental-theorem-id
( is-torsorial-htpy-hom-Semigroup f)
( htpy-eq-hom-Semigroup f)
eq-htpy-hom-Semigroup :
{f g : hom-Semigroup} → htpy-hom-Semigroup f g → Id f g
eq-htpy-hom-Semigroup {f} {g} =
map-inv-is-equiv (is-equiv-htpy-eq-hom-Semigroup f g)
is-set-hom-Semigroup : is-set hom-Semigroup
is-set-hom-Semigroup f g =
is-prop-is-equiv
( is-equiv-htpy-eq-hom-Semigroup f g)
( is-prop-Π
( λ x →
is-set-type-Semigroup H
( map-hom-Semigroup f x)
( map-hom-Semigroup g x)))
hom-set-Semigroup : Set (l1 ⊔ l2)
pr1 hom-set-Semigroup = hom-Semigroup
pr2 hom-set-Semigroup = is-set-hom-Semigroup
preserves-mul-id-Semigroup :
{l : Level} (G : Semigroup l) → preserves-mul-Semigroup G G id
preserves-mul-id-Semigroup G = refl
```
### The identity homomorphism of semigroups
```agda
id-hom-Semigroup :
{l : Level} (G : Semigroup l) → hom-Semigroup G G
pr1 (id-hom-Semigroup G) = id
pr2 (id-hom-Semigroup G) = preserves-mul-id-Semigroup G
```
### Composition of morphisms of semigroups
```agda
module _
{l1 l2 l3 : Level}
(G : Semigroup l1) (H : Semigroup l2) (K : Semigroup l3)
(g : hom-Semigroup H K) (f : hom-Semigroup G H)
where
map-comp-hom-Semigroup : type-Semigroup G → type-Semigroup K
map-comp-hom-Semigroup =
(map-hom-Semigroup H K g) ∘ (map-hom-Semigroup G H f)
preserves-mul-comp-hom-Semigroup :
preserves-mul-Semigroup G K map-comp-hom-Semigroup
preserves-mul-comp-hom-Semigroup =
( ap
( map-hom-Semigroup H K g)
( preserves-mul-hom-Semigroup G H f)) ∙
( preserves-mul-hom-Semigroup H K g)
comp-hom-Semigroup : hom-Semigroup G K
pr1 comp-hom-Semigroup = map-comp-hom-Semigroup
pr2 comp-hom-Semigroup = preserves-mul-comp-hom-Semigroup
```
### Associativity of composition of homomorphisms of semigroups
```agda
module _
{l1 l2 l3 l4 : Level}
(G : Semigroup l1) (H : Semigroup l2) (K : Semigroup l3) (L : Semigroup l4)
(h : hom-Semigroup K L) (g : hom-Semigroup H K) (f : hom-Semigroup G H)
where
associative-comp-hom-Semigroup :
comp-hom-Semigroup G H L (comp-hom-Semigroup H K L h g) f =
comp-hom-Semigroup G K L h (comp-hom-Semigroup G H K g f)
associative-comp-hom-Semigroup = eq-htpy-hom-Semigroup G L refl-htpy
```
### The left and right unit laws for composition of homomorphisms of semigroups
```agda
left-unit-law-comp-hom-Semigroup :
{ l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
( f : hom-Semigroup G H) →
Id ( comp-hom-Semigroup G H H (id-hom-Semigroup H) f) f
left-unit-law-comp-hom-Semigroup G
(pair (pair H is-set-H) (pair μ-H associative-H)) (pair f μ-f) =
eq-htpy-hom-Semigroup G
( pair (pair H is-set-H) (pair μ-H associative-H))
( refl-htpy)
right-unit-law-comp-hom-Semigroup :
{ l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
( f : hom-Semigroup G H) →
Id ( comp-hom-Semigroup G G H f (id-hom-Semigroup G)) f
right-unit-law-comp-hom-Semigroup
(pair (pair G is-set-G) (pair μ-G associative-G)) H (pair f μ-f) =
eq-htpy-hom-Semigroup
( pair (pair G is-set-G) (pair μ-G associative-G)) H refl-htpy
```