# Retracts of types
```agda
module foundation.retracts-of-types where
open import foundation-core.retracts-of-types public
```
<details><summary>Imports</summary>
```agda
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.fundamental-theorem-of-identity-types
open import foundation.homotopies
open import foundation.homotopy-algebra
open import foundation.homotopy-induction
open import foundation.structure-identity-principle
open import foundation.univalence
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation-core.contractible-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.identity-types
open import foundation-core.torsorial-type-families
```
</details>
## Idea
We say that a type `A` is a
{{#concept "retract" Disambiguation="of types" Agda=retract}} of a type `B` if
the types `A` and `B` come equipped with
{{#concept "retract data" Disambiguation="of types" Agda=retract}}, i.e., with
maps
```text
i r
A -----> B -----> A
```
such that `r` is a [retraction](foundation-core.retractions.md) of `i`, i.e.,
there is a [homotopy](foundation-core.homotopies.md) `r ∘ i ~ id`. The map `i`
is called the **inclusion** of the retract data, and the map `r` is called the
**underlying map of the retraction**.
## Properties
### Characterizing equality of retracts
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
where
coherence-htpy-retract :
(R S : A retract-of B)
(I : inclusion-retract R ~ inclusion-retract S)
(H : map-retraction-retract R ~ map-retraction-retract S) →
UU l1
coherence-htpy-retract R S I H =
( is-retraction-map-retraction-retract R) ~
( horizontal-concat-htpy H I ∙h is-retraction-map-retraction-retract S)
htpy-retract : (R S : A retract-of B) → UU (l1 ⊔ l2)
htpy-retract R S =
Σ ( inclusion-retract R ~ inclusion-retract S)
( λ I →
Σ ( map-retraction-retract R ~ map-retraction-retract S)
( coherence-htpy-retract R S I))
refl-htpy-retract : (R : A retract-of B) → htpy-retract R R
refl-htpy-retract R = (refl-htpy , refl-htpy , refl-htpy)
htpy-eq-retract : (R S : A retract-of B) → R = S → htpy-retract R S
htpy-eq-retract R .R refl = refl-htpy-retract R
is-torsorial-htpy-retract :
(R : A retract-of B) → is-torsorial (htpy-retract R)
is-torsorial-htpy-retract R =
is-torsorial-Eq-structure
( is-torsorial-htpy (inclusion-retract R))
( inclusion-retract R , refl-htpy)
( is-torsorial-Eq-structure
( is-torsorial-htpy (map-retraction-retract R))
( map-retraction-retract R , refl-htpy)
( is-torsorial-htpy (is-retraction-map-retraction-retract R)))
is-equiv-htpy-eq-retract :
(R S : A retract-of B) → is-equiv (htpy-eq-retract R S)
is-equiv-htpy-eq-retract R =
fundamental-theorem-id (is-torsorial-htpy-retract R) (htpy-eq-retract R)
extensionality-retract : (R S : A retract-of B) → (R = S) ≃ htpy-retract R S
extensionality-retract R S =
( htpy-eq-retract R S , is-equiv-htpy-eq-retract R S)
eq-htpy-retract : (R S : A retract-of B) → htpy-retract R S → R = S
eq-htpy-retract R S = map-inv-is-equiv (is-equiv-htpy-eq-retract R S)
```
### Characterizing equality of the total type of retracts
```agda
module _
{l1 l2 : Level} {A : UU l1}
where
equiv-retracts :
{l3 : Level} (R : retracts l2 A) (S : retracts l3 A) → UU (l1 ⊔ l2 ⊔ l3)
equiv-retracts R S =
Σ ( type-retracts R ≃ type-retracts S)
( λ e →
htpy-retract
( retract-retracts R)
( comp-retract (retract-retracts S) (retract-equiv e)))
refl-equiv-retracts : (R : retracts l2 A) → equiv-retracts R R
refl-equiv-retracts R =
( id-equiv ,
refl-htpy ,
refl-htpy ,
( ( inv-htpy
( left-unit-law-left-whisker-comp
( is-retraction-map-retraction-retracts R))) ∙h
( inv-htpy-right-unit-htpy)))
equiv-eq-retracts : (R S : retracts l2 A) → R = S → equiv-retracts R S
equiv-eq-retracts R .R refl = refl-equiv-retracts R
is-torsorial-equiv-retracts :
(R : retracts l2 A) → is-torsorial (equiv-retracts R)
is-torsorial-equiv-retracts R =
is-torsorial-Eq-structure
( is-torsorial-equiv (type-retracts R))
( type-retracts R , id-equiv)
( is-contr-equiv
( Σ (retract A (type-retracts R)) (htpy-retract (retract-retracts R)))
( equiv-tot
( λ S →
equiv-tot
( λ I →
equiv-tot
( λ J →
equiv-concat-htpy'
( is-retraction-map-retraction-retracts R)
( ap-concat-htpy
( horizontal-concat-htpy J I)
( right-unit-htpy ∙h
left-unit-law-left-whisker-comp
( is-retraction-map-retraction-retract S)))))))
( is-torsorial-htpy-retract (retract-retracts R)))
is-equiv-equiv-eq-retracts :
(R S : retracts l2 A) → is-equiv (equiv-eq-retracts R S)
is-equiv-equiv-eq-retracts R =
fundamental-theorem-id (is-torsorial-equiv-retracts R) (equiv-eq-retracts R)
extensionality-retracts : (R S : retracts l2 A) → (R = S) ≃ equiv-retracts R S
extensionality-retracts R S =
( equiv-eq-retracts R S , is-equiv-equiv-eq-retracts R S)
eq-equiv-retracts : (R S : retracts l2 A) → equiv-retracts R S → R = S
eq-equiv-retracts R S = map-inv-is-equiv (is-equiv-equiv-eq-retracts R S)
```
## See also
- [Retracts of maps](foundation.retracts-of-maps.md)