# Equivalences between semigroups

```agda
module group-theory.equivalences-semigroups where
```

<details><summary>Imports</summary>

```agda
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.function-extensionality
open import foundation.function-types
open import foundation.identity-types
open import foundation.propositions
open import foundation.sets
open import foundation.structure-identity-principle
open import foundation.subtype-identity-principle
open import foundation.subtypes
open import foundation.torsorial-type-families
open import foundation.univalence
open import foundation.universe-levels

open import group-theory.homomorphisms-semigroups
open import group-theory.semigroups
```

</details>

## Idea

An equivalence between semigroups is an equivalence between their underlying
types that preserves the binary operation.

## Definition

### Equivalences preserving binary operations

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2}
  where

  preserves-mul-equiv :
    (μA : A  A  A) (μB : B  B  B)  (A  B)  UU (l1  l2)
  preserves-mul-equiv μA μB e = preserves-mul μA μB (map-equiv e)
```

### Equivalences of semigroups

```agda
module _
  {l1 l2 : Level} (G : Semigroup l1) (H : Semigroup l2)
  where

  preserves-mul-equiv-Semigroup :
    (type-Semigroup G  type-Semigroup H)  UU (l1  l2)
  preserves-mul-equiv-Semigroup e =
    preserves-mul-equiv (mul-Semigroup G) (mul-Semigroup H) e

  equiv-Semigroup : UU (l1  l2)
  equiv-Semigroup =
    Σ (type-Semigroup G  type-Semigroup H) preserves-mul-equiv-Semigroup

  is-equiv-hom-Semigroup : hom-Semigroup G H  UU (l1  l2)
  is-equiv-hom-Semigroup f = is-equiv (map-hom-Semigroup G H f)
```

## Properties

### The total space of all equivalences of semigroups with domain `G` is contractible

```agda
module _
  {l : Level} (G : Semigroup l)
  where

  center-total-preserves-mul-id-Semigroup :
    Σ ( has-associative-mul (type-Semigroup G))
      ( λ μ  preserves-mul-Semigroup G (pair (set-Semigroup G) μ) id)
  pr1 (pr1 (center-total-preserves-mul-id-Semigroup)) = mul-Semigroup G
  pr2 (pr1 (center-total-preserves-mul-id-Semigroup)) =
    associative-mul-Semigroup G
  pr2 (center-total-preserves-mul-id-Semigroup) = refl

  contraction-total-preserves-mul-id-Semigroup :
    ( t : Σ ( has-associative-mul (type-Semigroup G))
            ( λ μ 
              preserves-mul-Semigroup G (pair (set-Semigroup G) μ) id)) 
    Id center-total-preserves-mul-id-Semigroup t
  contraction-total-preserves-mul-id-Semigroup
    ( (μ-G' , associative-G') , μ-id) =
    eq-type-subtype
      ( λ μ 
        preserves-mul-prop-Semigroup G (pair (set-Semigroup G) μ) id)
      ( eq-type-subtype
        ( λ μ 
          Π-Prop
            ( type-Semigroup G)
            ( λ x 
              Π-Prop
                ( type-Semigroup G)
                ( λ y 
                  Π-Prop
                    ( type-Semigroup G)
                    ( λ z 
                      Id-Prop
                        ( set-Semigroup G)
                        ( μ (μ x y) z) (μ x (μ y z))))))
        ( eq-htpy  x  eq-htpy  y  μ-id))))

  is-torsorial-preserves-mul-id-Semigroup :
    is-torsorial
      ( λ (μ : has-associative-mul (type-Semigroup G)) 
        preserves-mul (mul-Semigroup G) (pr1 μ) id)
  pr1 is-torsorial-preserves-mul-id-Semigroup =
    center-total-preserves-mul-id-Semigroup
  pr2 is-torsorial-preserves-mul-id-Semigroup =
    contraction-total-preserves-mul-id-Semigroup

  is-torsorial-equiv-Semigroup :
    is-torsorial (equiv-Semigroup G)
  is-torsorial-equiv-Semigroup =
    is-torsorial-Eq-structure
      ( is-torsorial-Eq-subtype
        ( is-torsorial-equiv (type-Semigroup G))
        ( is-prop-is-set)
        ( type-Semigroup G)
        ( id-equiv)
        ( is-set-type-Semigroup G))
      ( pair (set-Semigroup G) id-equiv)
      ( is-torsorial-preserves-mul-id-Semigroup)
```