# Retractions
```agda
module foundation-core.retractions where
```
<details><summary>Imports</summary>
```agda
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.universe-levels
open import foundation.whiskering-homotopies-composition
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
```
</details>
## Idea
A **retraction** of a map `f : A → B` consists of a map `r : B → A` equipped
with a [homotopy](foundation-core.homotopies.md) `r ∘ f ~ id`. In other words, a
retraction of a map `f` is a left inverse of `f`.
## Definitions
### The type of retractions
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2}
where
is-retraction : (f : A → B) (g : B → A) → UU l1
is-retraction f g = g ∘ f ~ id
retraction : (f : A → B) → UU (l1 ⊔ l2)
retraction f = Σ (B → A) (is-retraction f)
map-retraction : (f : A → B) → retraction f → B → A
map-retraction f = pr1
is-retraction-map-retraction :
(f : A → B) (r : retraction f) → map-retraction f r ∘ f ~ id
is-retraction-map-retraction f = pr2
```
## Properties
### For any map `i : A → B`, a retraction of `i` induces a retraction of the action on identifications of `i`
**Proof:** Suppose that `H : r ∘ i ~ id` and `p : i x = i y` is an
identification in `B`. Then we get the identification
```text
(H x)⁻¹ ap r p H y
x ========= r (i x) ======== r (i y) ===== y
```
This defines a map `s : (i x = i y) → x = y`. To see that `s ∘ ap i ~ id`,
i.e., that the concatenation
```text
(H x)⁻¹ ap r (ap i p) H y
x ========= r (i x) =============== r (i y) ===== y
```
is identical to `p : x = y` for all `p : x = y`, we proceed by identification
elimination. Then it suffices to show that `(H x)⁻¹ ∙ (H x)` is identical to
`refl`, which is indeed the case by the left inverse law of concatenation of
identifications.
```agda
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} (i : A → B)
(r : B → A) (H : r ∘ i ~ id)
where
is-injective-has-retraction :
{x y : A} → i x = i y → x = y
is-injective-has-retraction {x} {y} p = inv (H x) ∙ (ap r p ∙ H y)
is-retraction-is-injective-has-retraction :
{x y : A} → is-injective-has-retraction ∘ ap i {x} {y} ~ id
is-retraction-is-injective-has-retraction {x} refl = left-inv (H x)
module _
{l1 l2 : Level} {A : UU l1} {B : UU l2} (i : A → B) (R : retraction i)
where
is-injective-retraction :
{x y : A} → i x = i y → x = y
is-injective-retraction =
is-injective-has-retraction i
( map-retraction i R)
( is-retraction-map-retraction i R)
is-retraction-is-injective-retraction :
{x y : A} → is-injective-retraction ∘ ap i {x} {y} ~ id
is-retraction-is-injective-retraction =
is-retraction-is-injective-has-retraction i
( map-retraction i R)
( is-retraction-map-retraction i R)
retraction-ap : {x y : A} → retraction (ap i {x} {y})
pr1 retraction-ap = is-injective-retraction
pr2 retraction-ap = is-retraction-is-injective-retraction
```
### Composites of retractions are retractions
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(g : B → X) (h : A → B) (r : retraction g) (s : retraction h)
where
map-retraction-comp : X → A
map-retraction-comp = map-retraction h s ∘ map-retraction g r
is-retraction-map-retraction-comp : is-retraction (g ∘ h) map-retraction-comp
is-retraction-map-retraction-comp =
( map-retraction h s ·l (is-retraction-map-retraction g r ·r h)) ∙h
( is-retraction-map-retraction h s)
retraction-comp : retraction (g ∘ h)
pr1 retraction-comp = map-retraction-comp
pr2 retraction-comp = is-retraction-map-retraction-comp
```
### If `g ∘ f` has a retraction then `f` has a retraction
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(g : B → X) (h : A → B) (r : retraction (g ∘ h))
where
map-retraction-right-factor : B → A
map-retraction-right-factor = map-retraction (g ∘ h) r ∘ g
is-retraction-map-retraction-right-factor :
is-retraction h map-retraction-right-factor
is-retraction-map-retraction-right-factor =
is-retraction-map-retraction (g ∘ h) r
retraction-right-factor : retraction h
pr1 retraction-right-factor = map-retraction-right-factor
pr2 retraction-right-factor = is-retraction-map-retraction-right-factor
```
### In a commuting triangle `f ~ g ∘ h`, any retraction of the left map `f` induces a retraction of the top map `h`
In a commuting triangle of the form
```text
h
A ------> B
\ /
f\ /g
\ /
∨ ∨
X,
```
if `r : X → A` is a retraction of the map `f` on the left, then `r ∘ g` is a
retraction of the top map `h`.
Note: In this file we are unable to use the definition of
[commuting triangles](foundation-core.commuting-triangles-of-maps.md), because
that would result in a cyclic module dependency.
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(f : A → X) (g : B → X) (h : A → B) (H : f ~ g ∘ h)
(r : retraction f)
where
map-retraction-top-map-triangle : B → A
map-retraction-top-map-triangle = map-retraction f r ∘ g
is-retraction-map-retraction-top-map-triangle :
is-retraction h map-retraction-top-map-triangle
is-retraction-map-retraction-top-map-triangle =
( inv-htpy (map-retraction f r ·l H)) ∙h
( is-retraction-map-retraction f r)
retraction-top-map-triangle : retraction h
pr1 retraction-top-map-triangle =
map-retraction-top-map-triangle
pr2 retraction-top-map-triangle =
is-retraction-map-retraction-top-map-triangle
```
### In a commuting triangle `f ~ g ∘ h`, retractions of `g` and `h` compose to a retraction of `f`
In a commuting triangle of the form
```text
h
A ------> B
\ /
f\ /g
\ /
∨ ∨
X,
```
if `r : X → A` is a retraction of the map `g` on the right and `s : B → A` is a
retraction of the map `h` on top, then `s ∘ r` is a retraction of the map `f` on
the left.
```agda
module _
{l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
(f : A → X) (g : B → X) (h : A → B) (H : f ~ g ∘ h)
(r : retraction g) (s : retraction h)
where
map-retraction-left-map-triangle : X → A
map-retraction-left-map-triangle = map-retraction-comp g h r s
is-retraction-map-retraction-left-map-triangle :
is-retraction f map-retraction-left-map-triangle
is-retraction-map-retraction-left-map-triangle =
( map-retraction-comp g h r s ·l H) ∙h
( is-retraction-map-retraction-comp g h r s)
retraction-left-map-triangle : retraction f
pr1 retraction-left-map-triangle =
map-retraction-left-map-triangle
pr2 retraction-left-map-triangle =
is-retraction-map-retraction-left-map-triangle
```
## See also
- Retracts of types are defined in
[`foundation-core.retracts-of-types`](foundation-core.retracts-of-types.md).
- Retracts of maps are defined in
[`foundation.retracts-of-maps`](foundation.retracts-of-maps.md).