# Invertible maps

```agda
module foundation-core.invertible-maps 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.cartesian-product-types
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.retractions
open import foundation-core.sections
```

</details>

## Idea

An {{#concept "inverse" Disambiguation="maps of types" Agda=is-inverse}} for a
map `f : A → B` is a map `g : B → A` equipped with
[homotopies](foundation-core.homotopies.md) `f ∘ g ~ id` and `g ∘ f ~ id`. Such
data, however, is [structure](foundation.structure.md) on the map `f`, and not
generally a [property](foundation-core.propositions.md).

## Definition

### The predicate that a map `g` is an inverse of a map `f`

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

  is-inverse : (A  B)  (B  A)  UU (l1  l2)
  is-inverse f g = ((f  g) ~ id) × ((g  f) ~ id)

  is-section-is-inverse :
    {f : A  B} {g : B  A}  is-inverse f g  f  g ~ id
  is-section-is-inverse = pr1

  is-retraction-is-inverse :
    {f : A  B} {g : B  A}  is-inverse f g  g  f ~ id
  is-retraction-is-inverse = pr2
```

### The predicate that a map `f` is invertible

```agda
is-invertible :
  {l1 l2 : Level} {A : UU l1} {B : UU l2}  (A  B)  UU (l1  l2)
is-invertible {A = A} {B} f = Σ (B  A) (is-inverse f)

module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  B} (g : is-invertible f)
  where

  map-inv-is-invertible : B  A
  map-inv-is-invertible = pr1 g

  is-inverse-map-inv-is-invertible : is-inverse f map-inv-is-invertible
  is-inverse-map-inv-is-invertible = pr2 g

  is-section-map-inv-is-invertible : f  map-inv-is-invertible ~ id
  is-section-map-inv-is-invertible = pr1 is-inverse-map-inv-is-invertible

  is-retraction-map-inv-is-invertible : map-inv-is-invertible  f ~ id
  is-retraction-map-inv-is-invertible = pr2 is-inverse-map-inv-is-invertible

  section-is-invertible : section f
  pr1 section-is-invertible = map-inv-is-invertible
  pr2 section-is-invertible = is-section-map-inv-is-invertible

  retraction-is-invertible : retraction f
  pr1 retraction-is-invertible = map-inv-is-invertible
  pr2 retraction-is-invertible = is-retraction-map-inv-is-invertible
```

### The type of invertible maps

```agda
invertible-map : {l1 l2 : Level} (A : UU l1) (B : UU l2)  UU (l1  l2)
invertible-map A B = Σ (A  B) (is-invertible)

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

  map-invertible-map : invertible-map A B  A  B
  map-invertible-map = pr1

  is-invertible-map-invertible-map :
    (f : invertible-map A B)  is-invertible (map-invertible-map f)
  is-invertible-map-invertible-map = pr2

  map-inv-invertible-map : invertible-map A B  B  A
  map-inv-invertible-map =
    map-inv-is-invertible  is-invertible-map-invertible-map

  is-retraction-map-inv-invertible-map :
    (f : invertible-map A B) 
    map-inv-invertible-map f  map-invertible-map f ~ id
  is-retraction-map-inv-invertible-map =
    is-retraction-map-inv-is-invertible  is-invertible-map-invertible-map

  is-section-map-inv-invertible-map :
    (f : invertible-map A B) 
    map-invertible-map f  map-inv-invertible-map f ~ id
  is-section-map-inv-invertible-map =
    is-section-map-inv-is-invertible  is-invertible-map-invertible-map
```

## Properties

### The identity invertible map

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

  is-inverse-id : is-inverse id (id {A = A})
  pr1 is-inverse-id = refl-htpy
  pr2 is-inverse-id = refl-htpy

  is-invertible-id : is-invertible (id {A = A})
  pr1 is-invertible-id = id
  pr2 is-invertible-id = is-inverse-id

  id-invertible-map : invertible-map A A
  pr1 id-invertible-map = id
  pr2 id-invertible-map = is-invertible-id
```

### The inverse of an invertible map

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

  is-inverse-inv-is-inverse :
    {f : A  B} {g : B  A}  is-inverse f g  is-inverse g f
  pr1 (is-inverse-inv-is-inverse {f} {g} H) =
    is-retraction-map-inv-is-invertible (g , H)
  pr2 (is-inverse-inv-is-inverse {f} {g} H) =
    is-section-map-inv-is-invertible (g , H)

  is-invertible-map-inv-is-invertible :
    {f : A  B} (g : is-invertible f)  is-invertible (map-inv-is-invertible g)
  pr1 (is-invertible-map-inv-is-invertible {f} g) = f
  pr2 (is-invertible-map-inv-is-invertible {f} g) =
    is-inverse-inv-is-inverse {f} (is-inverse-map-inv-is-invertible g)

  is-invertible-map-inv-invertible-map :
    (f : invertible-map A B)  is-invertible (map-inv-invertible-map f)
  is-invertible-map-inv-invertible-map f =
    is-invertible-map-inv-is-invertible (is-invertible-map-invertible-map f)

  inv-invertible-map : invertible-map A B  invertible-map B A
  pr1 (inv-invertible-map f) = map-inv-invertible-map f
  pr2 (inv-invertible-map f) = is-invertible-map-inv-invertible-map f
```

### The inversion operation on invertible maps is a strict involution

The inversion operation on invertible maps is a strict involution, where, by
strict involution, we mean that `inv-invertible-map (inv-invertible-map f) ≐ f`
syntactically. This can be observed by the fact that the type-checker accepts
`refl` as proof of this equation.

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

  is-involution-inv-invertible-map :
    {f : invertible-map A B}  inv-invertible-map (inv-invertible-map f)  f
  is-involution-inv-invertible-map = refl
```

### Composition of invertible maps

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
  (g : B  C) (f : A  B) (G : is-invertible g) (F : is-invertible f)
  where

  map-inv-is-invertible-comp : C  A
  map-inv-is-invertible-comp =
    map-inv-is-invertible F  map-inv-is-invertible G

  is-section-map-inv-is-invertible-comp :
    is-section (g  f) map-inv-is-invertible-comp
  is-section-map-inv-is-invertible-comp =
    is-section-map-section-comp g f
      ( section-is-invertible F)
      ( section-is-invertible G)

  is-retraction-map-inv-is-invertible-comp :
    is-retraction (g  f) map-inv-is-invertible-comp
  is-retraction-map-inv-is-invertible-comp =
    is-retraction-map-retraction-comp g f
      ( retraction-is-invertible G)
      ( retraction-is-invertible F)

  is-invertible-comp : is-invertible (g  f)
  is-invertible-comp =
    ( map-inv-is-invertible-comp ,
      is-section-map-inv-is-invertible-comp ,
      is-retraction-map-inv-is-invertible-comp)

module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3}
  where

  is-invertible-map-comp-invertible-map :
    (g : invertible-map B C) (f : invertible-map A B) 
    is-invertible (map-invertible-map g  map-invertible-map f)
  is-invertible-map-comp-invertible-map g f =
    is-invertible-comp
      ( map-invertible-map g)
      ( map-invertible-map f)
      ( is-invertible-map-invertible-map g)
      ( is-invertible-map-invertible-map f)

  comp-invertible-map :
    invertible-map B C  invertible-map A B  invertible-map A C
  pr1 (comp-invertible-map g f) = map-invertible-map g  map-invertible-map f
  pr2 (comp-invertible-map g f) = is-invertible-map-comp-invertible-map g f
```

### Invertible maps are closed under homotopies

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

  is-section-map-inv-is-invertible-htpy :
    {f f' : A  B} (H : f' ~ f) (F : is-invertible f) 
    is-section f' (map-inv-is-invertible F)
  is-section-map-inv-is-invertible-htpy H (g , S , R) = H ·r g ∙h S

  is-retraction-map-inv-is-invertible-htpy :
    {f f' : A  B} (H : f' ~ f) (F : is-invertible f) 
    is-retraction f' (map-inv-is-invertible F)
  is-retraction-map-inv-is-invertible-htpy H (g , S , R) = g ·l H ∙h R

  is-invertible-htpy :
    {f f' : A  B}  f' ~ f  is-invertible f  is-invertible f'
  is-invertible-htpy H F =
    ( map-inv-is-invertible F ,
      is-section-map-inv-is-invertible-htpy H F ,
      is-retraction-map-inv-is-invertible-htpy H F)

  is-invertible-inv-htpy :
    {f f' : A  B}  f ~ f'  is-invertible f  is-invertible f'
  is-invertible-inv-htpy H = is-invertible-htpy (inv-htpy H)

  htpy-map-inv-is-invertible :
    {f g : A  B} (H : f ~ g) (F : is-invertible f) (G : is-invertible g) 
    map-inv-is-invertible F ~ map-inv-is-invertible G
  htpy-map-inv-is-invertible H F G =
    ( ( inv-htpy (is-retraction-map-inv-is-invertible G)) ·r
      ( map-inv-is-invertible F)) ∙h
    ( ( map-inv-is-invertible G) ·l
      ( ( inv-htpy H ·r map-inv-is-invertible F) ∙h
        ( is-section-map-inv-is-invertible F)))
```

### Any section of an invertible map is homotopic to its inverse

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : invertible-map A B)
  where

  htpy-map-inv-invertible-map-section :
    (f : section (map-invertible-map e)) 
    map-inv-invertible-map e ~
    map-section (map-invertible-map e) f
  htpy-map-inv-invertible-map-section (f , H) =
    ( map-inv-invertible-map e ·l inv-htpy H) ∙h
    ( is-retraction-map-inv-invertible-map e ·r f)
```

### Any retraction of an invertible map is homotopic to its inverse

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : invertible-map A B)
  where

  htpy-map-inv-invertible-map-retraction :
    (f : retraction (map-invertible-map e)) 
    map-inv-invertible-map e ~
    map-retraction (map-invertible-map e) f
  htpy-map-inv-invertible-map-retraction (f , H) =
    ( inv-htpy H ·r map-inv-invertible-map e) ∙h
    ( f ·l is-section-map-inv-invertible-map e)
```

### Invertible maps are injective

The construction of the converse map of the
[action on identifications](foundation.action-on-identifications-functions.md)
is a rerun of the proof that maps with
[retractions](foundation-core.retractions.md) are
[injective](foundation-core.injective-maps.md) (`is-injective-retraction`). We
repeat the proof to avoid cyclic dependencies.

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A  B} (H : is-invertible f)
  where

  is-injective-is-invertible : {x y : A}  f x  f y  x  y
  is-injective-is-invertible =
    is-injective-retraction f (retraction-is-invertible H)
```

## See also

- For the coherent notion of invertible maps see
  [`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md).
- For the notion of biinvertible maps see
  [`foundation.equivalences`](foundation.equivalences.md).
- For the notion of maps with contractible fibers see
  [`foundation.contractible-maps`](foundation.contractible-maps.md).
- For the notion of path-split maps see
  [`foundation.path-split-maps`](foundation.path-split-maps.md).