# Coherently invertible maps

```agda
module foundation-core.coherently-invertible-maps where
```

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-binary-functions
open import foundation.action-on-identifications-functions
open import foundation.dependent-pair-types
open import foundation.homotopy-algebra
open import foundation.universe-levels
open import foundation.whiskering-higher-homotopies-composition
open import foundation.whiskering-homotopies-composition

open import foundation-core.commuting-squares-of-homotopies
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.invertible-maps
open import foundation-core.retractions
open import foundation-core.sections
open import foundation-core.whiskering-homotopies-concatenation
```

</details>

## Idea

A [(two-sided) inverse](foundation-core.invertible-maps.md) for a map
`f : A → B` is a map `g : B → A` equipped with
[homotopies](foundation-core.homotopies.md) `S : f ∘ g ~ id` and
`R : g ∘ f ~ id`. Such data, however is [structure](foundation.structure.md) on
the map `f`, and not generally a [property](foundation-core.propositions.md).
One way to make the type of inverses into a property is by adding a single
coherence condition between the homotopies of the inverse, asking that the
following diagram commmutes

```text
              S ·r f
            --------->
  f ∘ g ∘ f            f.
            --------->
              f ·l R
```

We call such data a
{{#concept "coherently invertible map" Agda=coherently-invertible-map}}. I.e., a
coherently invertible map `f : A → B` is a map equipped with a two-sided inverse
and this additional coherence.

There is also the alternative coherence condition we could add

```text
              R ·r g
            --------->
  g ∘ f ∘ g            g.
            --------->
              g ·l S
```

We will colloquially refer to invertible maps equipped with this coherence as
_transpose coherently invertible maps_.

**Note.** Coherently invertible maps are referred to as
{{#concept "half adjoint equivalences"}} in {{#cite UF13}}.

On this page we will prove that every two-sided inverse `g` of `f` can be
promoted to a coherent two-sided inverse. Thus, for most properties of
coherently invertible maps, it suffices to consider the data of a two-sided
inverse. However, this coherence construction requires us to replace the section
homotopy (or retraction homotopy). For this reason we also give direct
constructions showing

1. The identity map is coherently invertible.
2. The composite of two coherently invertible maps is coherently invertible.
3. The inverse of a coherently invertible map is coherently invertible.
4. Every map homotopic to a coherently invertible map is coherently invertible.
5. The 3-for-2 property of coherently invertible maps.

Each of these constructions appropriately preserve the data of the underlying
two-sided inverse.

## Definition

### The predicate of being a coherently invertible map

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

  coherence-is-coherently-invertible :
    (f : A  B) (g : B  A) (G : f  g ~ id) (H : g  f ~ id)  UU (l1  l2)
  coherence-is-coherently-invertible f g G H = G ·r f ~ f ·l H

  is-coherently-invertible : (A  B)  UU (l1  l2)
  is-coherently-invertible f =
    Σ ( B  A)
      ( λ g 
        Σ ( f  g ~ id)
          ( λ G 
            Σ ( g  f ~ id)
              ( λ H  coherence-is-coherently-invertible f g G H)))

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

  map-inv-is-coherently-invertible : B  A
  map-inv-is-coherently-invertible = pr1 H

  is-section-map-inv-is-coherently-invertible :
    is-section f map-inv-is-coherently-invertible
  is-section-map-inv-is-coherently-invertible = pr1 (pr2 H)

  is-retraction-map-inv-is-coherently-invertible :
    is-retraction f map-inv-is-coherently-invertible
  is-retraction-map-inv-is-coherently-invertible = pr1 (pr2 (pr2 H))

  coh-is-coherently-invertible :
    coherence-is-coherently-invertible f
      ( map-inv-is-coherently-invertible)
      ( is-section-map-inv-is-coherently-invertible)
      ( is-retraction-map-inv-is-coherently-invertible)
  coh-is-coherently-invertible = pr2 (pr2 (pr2 H))

  is-invertible-is-coherently-invertible : is-invertible f
  pr1 is-invertible-is-coherently-invertible =
    map-inv-is-coherently-invertible
  pr1 (pr2 is-invertible-is-coherently-invertible) =
    is-section-map-inv-is-coherently-invertible
  pr2 (pr2 is-invertible-is-coherently-invertible) =
    is-retraction-map-inv-is-coherently-invertible

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

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

We will show that `is-coherently-invertible` is a proposition in
[`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md).

### The type of coherently invertible maps

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

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

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

  is-coherently-invertible-map-coherently-invertible-map :
    is-coherently-invertible map-coherently-invertible-map
  is-coherently-invertible-map-coherently-invertible-map = pr2 e

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

  is-section-map-inv-coherently-invertible-map :
    map-coherently-invertible-map  map-inv-coherently-invertible-map ~ id
  is-section-map-inv-coherently-invertible-map =
    is-section-map-inv-is-coherently-invertible
      ( is-coherently-invertible-map-coherently-invertible-map)

  is-retraction-map-inv-coherently-invertible-map :
    map-inv-coherently-invertible-map  map-coherently-invertible-map ~ id
  is-retraction-map-inv-coherently-invertible-map =
    is-retraction-map-inv-is-coherently-invertible
      ( is-coherently-invertible-map-coherently-invertible-map)

  coh-coherently-invertible-map :
    coherence-is-coherently-invertible
      ( map-coherently-invertible-map)
      ( map-inv-coherently-invertible-map)
      ( is-section-map-inv-coherently-invertible-map)
      ( is-retraction-map-inv-coherently-invertible-map)
  coh-coherently-invertible-map =
    coh-is-coherently-invertible
      ( is-coherently-invertible-map-coherently-invertible-map)

  section-coherently-invertible-map :
    section map-coherently-invertible-map
  section-coherently-invertible-map =
    section-is-coherently-invertible
      ( is-coherently-invertible-map-coherently-invertible-map)

  retraction-coherently-invertible-map :
    retraction map-coherently-invertible-map
  retraction-coherently-invertible-map =
    retraction-is-coherently-invertible
      ( is-coherently-invertible-map-coherently-invertible-map)

  is-invertible-coherently-invertible-map :
    is-invertible map-coherently-invertible-map
  is-invertible-coherently-invertible-map =
    is-invertible-is-coherently-invertible
      ( is-coherently-invertible-map-coherently-invertible-map)

  invertible-map-coherently-invertible-map : invertible-map A B
  pr1 invertible-map-coherently-invertible-map =
    map-coherently-invertible-map
  pr2 invertible-map-coherently-invertible-map =
    is-invertible-coherently-invertible-map
```

### The predicate of being a transpose coherently invertible map

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

  coherence-is-transpose-coherently-invertible :
    (f : A  B) (g : B  A) (G : f  g ~ id) (H : g  f ~ id)  UU (l1  l2)
  coherence-is-transpose-coherently-invertible f g G H = H ·r g ~ g ·l G

  is-transpose-coherently-invertible : (A  B)  UU (l1  l2)
  is-transpose-coherently-invertible f =
    Σ ( B  A)
      ( λ g 
        Σ ( f  g ~ id)
          ( λ G 
            Σ ( g  f ~ id)
              ( λ H  coherence-is-transpose-coherently-invertible f g G H)))

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

  map-inv-is-transpose-coherently-invertible : B  A
  map-inv-is-transpose-coherently-invertible = pr1 H

  is-section-map-inv-is-transpose-coherently-invertible :
    f  map-inv-is-transpose-coherently-invertible ~ id
  is-section-map-inv-is-transpose-coherently-invertible = pr1 (pr2 H)

  is-retraction-map-inv-is-transpose-coherently-invertible :
    map-inv-is-transpose-coherently-invertible  f ~ id
  is-retraction-map-inv-is-transpose-coherently-invertible = pr1 (pr2 (pr2 H))

  coh-is-transpose-coherently-invertible :
    coherence-is-transpose-coherently-invertible f
      ( map-inv-is-transpose-coherently-invertible)
      ( is-section-map-inv-is-transpose-coherently-invertible)
      ( is-retraction-map-inv-is-transpose-coherently-invertible)
  coh-is-transpose-coherently-invertible = pr2 (pr2 (pr2 H))

  is-invertible-is-transpose-coherently-invertible : is-invertible f
  pr1 is-invertible-is-transpose-coherently-invertible =
    map-inv-is-transpose-coherently-invertible
  pr1 (pr2 is-invertible-is-transpose-coherently-invertible) =
    is-section-map-inv-is-transpose-coherently-invertible
  pr2 (pr2 is-invertible-is-transpose-coherently-invertible) =
    is-retraction-map-inv-is-transpose-coherently-invertible

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

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

We will show that `is-transpose-coherently-invertible` is a proposition in
[`foundation.coherently-invertible-maps`](foundation.coherently-invertible-maps.md).

### The type of transpose coherently invertible maps

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

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

  map-transpose-coherently-invertible-map : A  B
  map-transpose-coherently-invertible-map = pr1 e

  is-transpose-coherently-invertible-map-transpose-coherently-invertible-map :
    is-transpose-coherently-invertible map-transpose-coherently-invertible-map
  is-transpose-coherently-invertible-map-transpose-coherently-invertible-map =
    pr2 e

  map-inv-transpose-coherently-invertible-map : B  A
  map-inv-transpose-coherently-invertible-map =
    map-inv-is-transpose-coherently-invertible
      ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map)

  is-section-map-inv-transpose-coherently-invertible-map :
    ( map-transpose-coherently-invertible-map 
      map-inv-transpose-coherently-invertible-map) ~
    ( id)
  is-section-map-inv-transpose-coherently-invertible-map =
    is-section-map-inv-is-transpose-coherently-invertible
      ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map)

  is-retraction-map-inv-transpose-coherently-invertible-map :
    ( map-inv-transpose-coherently-invertible-map 
      map-transpose-coherently-invertible-map) ~
    ( id)
  is-retraction-map-inv-transpose-coherently-invertible-map =
    is-retraction-map-inv-is-transpose-coherently-invertible
      ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map)

  coh-transpose-coherently-invertible-map :
    coherence-is-transpose-coherently-invertible
      ( map-transpose-coherently-invertible-map)
      ( map-inv-transpose-coherently-invertible-map)
      ( is-section-map-inv-transpose-coherently-invertible-map)
      ( is-retraction-map-inv-transpose-coherently-invertible-map)
  coh-transpose-coherently-invertible-map =
    coh-is-transpose-coherently-invertible
      ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map)

  section-transpose-coherently-invertible-map :
    section map-transpose-coherently-invertible-map
  section-transpose-coherently-invertible-map =
    section-is-transpose-coherently-invertible
      ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map)

  retraction-transpose-coherently-invertible-map :
    retraction map-transpose-coherently-invertible-map
  retraction-transpose-coherently-invertible-map =
    retraction-is-transpose-coherently-invertible
      ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map)

  is-invertible-transpose-coherently-invertible-map :
    is-invertible map-transpose-coherently-invertible-map
  is-invertible-transpose-coherently-invertible-map =
    is-invertible-is-transpose-coherently-invertible
      ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map)

  invertible-map-transpose-coherently-invertible-map : invertible-map A B
  pr1 invertible-map-transpose-coherently-invertible-map =
    map-transpose-coherently-invertible-map
  pr2 invertible-map-transpose-coherently-invertible-map =
    is-invertible-transpose-coherently-invertible-map
```

### Invertible maps that are coherent are coherently invertible maps

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

  coherence-is-invertible : UU (l1  l2)
  coherence-is-invertible =
    coherence-is-coherently-invertible
      ( f)
      ( map-inv-is-invertible H)
      ( is-section-map-inv-is-invertible H)
      ( is-retraction-map-inv-is-invertible H)

  transpose-coherence-is-invertible : UU (l1  l2)
  transpose-coherence-is-invertible =
    coherence-is-transpose-coherently-invertible
      ( f)
      ( map-inv-is-invertible H)
      ( is-section-map-inv-is-invertible H)
      ( is-retraction-map-inv-is-invertible H)

  is-coherently-invertible-coherence-is-invertible :
    coherence-is-invertible  is-coherently-invertible f
  is-coherently-invertible-coherence-is-invertible coh =
    ( map-inv-is-invertible H ,
      is-section-map-inv-is-invertible H ,
      is-retraction-map-inv-is-invertible H ,
      coh)

  is-transpose-coherently-invertible-transpose-coherence-is-invertible :
    transpose-coherence-is-invertible  is-transpose-coherently-invertible f
  is-transpose-coherently-invertible-transpose-coherence-is-invertible coh =
    ( map-inv-is-invertible H ,
      is-section-map-inv-is-invertible H ,
      is-retraction-map-inv-is-invertible H ,
      coh)
```

## Properties

### The inverse of a coherently invertible map is transpose coherently invertible and vice versa

The inverse of a coherently invertible map is transpose coherently invertible.
Conversely, the inverse of a transpose coherently invertible map is coherently
invertible. Since these are defined by simply moving data around, they are
strict inverses to one another.

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

  is-transpose-coherently-invertible-map-inv-is-coherently-invertible :
    {f : A  B} (H : is-coherently-invertible f) 
    is-transpose-coherently-invertible (map-inv-is-coherently-invertible H)
  is-transpose-coherently-invertible-map-inv-is-coherently-invertible {f} H =
    ( f ,
      is-retraction-map-inv-is-coherently-invertible H ,
      is-section-map-inv-is-coherently-invertible H ,
      coh-is-coherently-invertible H)

  is-coherently-invertible-map-inv-is-transpose-coherently-invertible :
    {f : A  B} (H : is-transpose-coherently-invertible f) 
    is-coherently-invertible (map-inv-is-transpose-coherently-invertible H)
  is-coherently-invertible-map-inv-is-transpose-coherently-invertible {f} H =
    ( f ,
      is-retraction-map-inv-is-transpose-coherently-invertible H ,
      is-section-map-inv-is-transpose-coherently-invertible H ,
      coh-is-transpose-coherently-invertible H)

  transpose-coherently-invertible-map-inv-coherently-invertible-map :
    coherently-invertible-map A B  transpose-coherently-invertible-map B A
  transpose-coherently-invertible-map-inv-coherently-invertible-map e =
    ( map-inv-coherently-invertible-map e ,
      is-transpose-coherently-invertible-map-inv-is-coherently-invertible
        ( is-coherently-invertible-map-coherently-invertible-map e))

  coherently-invertible-map-inv-transpose-coherently-invertible-map :
    transpose-coherently-invertible-map A B  coherently-invertible-map B A
  coherently-invertible-map-inv-transpose-coherently-invertible-map e =
    ( map-inv-transpose-coherently-invertible-map e ,
      is-coherently-invertible-map-inv-is-transpose-coherently-invertible
        ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map
          ( e)))
```

### Invertible maps are coherently invertible

This result is known as
[Vogt's lemma](https://ncatlab.org/nlab/show/homotopy+equivalence#vogts_lemma)
in point-set topology. The construction follows Lemma 10.4.5 in {{#cite Rij22}}.

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

  is-retraction-map-inv-is-coherently-invertible-is-invertible :
    map-inv-is-invertible H  f ~ id
  is-retraction-map-inv-is-coherently-invertible-is-invertible =
    is-retraction-map-inv-is-invertible H

  abstract
    is-section-map-inv-is-coherently-invertible-is-invertible :
      f  map-inv-is-invertible H ~ id
    is-section-map-inv-is-coherently-invertible-is-invertible =
      ( ( inv-htpy (is-section-map-inv-is-invertible H)) ·r
        ( f  map-inv-is-invertible H)) ∙h
      ( ( ( f) ·l
          ( is-retraction-map-inv-is-invertible H) ·r
          ( map-inv-is-invertible H)) ∙h
        ( is-section-map-inv-is-invertible H))

  abstract
    inv-coh-is-coherently-invertible-is-invertible :
      f ·l is-retraction-map-inv-is-coherently-invertible-is-invertible ~
      is-section-map-inv-is-coherently-invertible-is-invertible ·r f
    inv-coh-is-coherently-invertible-is-invertible =
      left-transpose-htpy-concat
        ( ( is-section-map-inv-is-invertible H) ·r
          ( f  map-inv-is-invertible H  f))
        ( f ·l is-retraction-map-inv-is-invertible H)
        ( ( ( f) ·l
            ( is-retraction-map-inv-is-invertible H) ·r
            ( map-inv-is-invertible H  f)) ∙h
          ( is-section-map-inv-is-invertible H ·r f))
        ( ( ( nat-htpy (is-section-map-inv-is-invertible H ·r f)) ·r
            ( is-retraction-map-inv-is-invertible H)) ∙h
          ( right-whisker-concat-htpy
            ( ( inv-preserves-comp-left-whisker-comp
                ( f)
                ( map-inv-is-invertible H  f)
                ( is-retraction-map-inv-is-invertible H)) ∙h
              ( left-whisker-comp²
                ( f)
                ( inv-coh-htpy-id (is-retraction-map-inv-is-invertible H))))
            ( is-section-map-inv-is-invertible H ·r f)))

  abstract
    coh-is-coherently-invertible-is-invertible :
      coherence-is-coherently-invertible
        ( f)
        ( map-inv-is-invertible H)
        ( is-section-map-inv-is-coherently-invertible-is-invertible)
        ( is-retraction-map-inv-is-coherently-invertible-is-invertible)
    coh-is-coherently-invertible-is-invertible =
      inv-htpy inv-coh-is-coherently-invertible-is-invertible

  is-coherently-invertible-is-invertible : is-coherently-invertible f
  is-coherently-invertible-is-invertible =
    ( map-inv-is-invertible H ,
      is-section-map-inv-is-coherently-invertible-is-invertible ,
      is-retraction-map-inv-is-coherently-invertible-is-invertible ,
      coh-is-coherently-invertible-is-invertible)
```

We get the transpose version for free:

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

  is-transpose-coherently-invertible-is-invertible :
    is-transpose-coherently-invertible f
  is-transpose-coherently-invertible-is-invertible =
    is-transpose-coherently-invertible-map-inv-is-coherently-invertible
      ( is-coherently-invertible-is-invertible
        ( is-invertible-map-inv-is-invertible H))
```

### Coherently invertible maps are injective

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

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

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

### Coherently invertible maps are embeddings

We show that `is-injective-is-coherently-invertible` is a
[section](foundation-core.sections.md) and
[retraction](foundation-core.retractions.md) of `ap f`.

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

  abstract
    is-section-is-injective-is-coherently-invertible :
      ap f {x} {y}  is-injective-is-coherently-invertible H ~ id
    is-section-is-injective-is-coherently-invertible p =
      ( ap-concat f
        ( inv (is-retraction-map-inv-is-coherently-invertible H x))
        ( ( ap (map-inv-is-coherently-invertible H) p) 
          ( is-retraction-map-inv-is-coherently-invertible H y))) 
      ( ap-binary
        ( _∙_)
        ( ap-inv f (is-retraction-map-inv-is-coherently-invertible H x))
        ( ( ap-concat f
            ( ap (map-inv-is-coherently-invertible H) p)
            ( is-retraction-map-inv-is-coherently-invertible H y)) 
          ( ap-binary
            ( _∙_)
            ( inv (ap-comp f (map-inv-is-coherently-invertible H) p))
            ( inv (coh-is-coherently-invertible H y))))) 
      ( inv
        ( left-transpose-eq-concat
          ( ap f (is-retraction-map-inv-is-coherently-invertible H x))
          ( p)
          ( ( ap (f  map-inv-is-coherently-invertible H) p) 
            ( is-section-map-inv-is-coherently-invertible H (f y)))
          ( ( ap-binary
              ( _∙_)
              ( inv (coh-is-coherently-invertible H x))
              ( inv (ap-id p))) 
            ( nat-htpy (is-section-map-inv-is-coherently-invertible H) p))))

  abstract
    is-retraction-is-injective-is-coherently-invertible :
      is-injective-is-coherently-invertible H  ap f {x} {y} ~ id
    is-retraction-is-injective-is-coherently-invertible refl =
      left-inv (is-retraction-map-inv-is-coherently-invertible H x)

  is-invertible-ap-is-coherently-invertible : is-invertible (ap f {x} {y})
  is-invertible-ap-is-coherently-invertible =
    ( is-injective-is-coherently-invertible H ,
      is-section-is-injective-is-coherently-invertible ,
      is-retraction-is-injective-is-coherently-invertible)

  is-coherently-invertible-ap-is-coherently-invertible :
    is-coherently-invertible (ap f {x} {y})
  is-coherently-invertible-ap-is-coherently-invertible =
    is-coherently-invertible-is-invertible
      ( is-invertible-ap-is-coherently-invertible)
```

### Coherently invertible maps are transpose coherently invertible

The proof follows Lemma 4.2.2 in {{#cite UF13}}.

**Proof.** By naturality of homotopies we have

```text
                   gfRg
     gfgfg --------------------> gfg
       |                          |
  Rgfg |  nat-htpy R ·r (R ·r g)  | Rg
       ∨                          ∨
      gfg ----------------------> g.
                    Rg
```

We can paste the homotopy

```text
  g (inv-coh-htpy-id S) ∙ gHg : Sgfg ~ gfSg ~ gfRg
```

along the top edge of this naturality square obtaining the coherence square

```text
             gfgS
     gfgfg -------> gfg
       |             |
  Rgfg |             | Rg
       ∨             ∨
      gfg ---------> g.
              Rg
```

There is also the naturality square

```text
                   gfgS
     gfgfg --------------------> gfg
       |                          |
  Rgfg |  nat-htpy (R ·r g) ·r S  | Rg
       ∨                          ∨
      gfg ----------------------> g.
                    gS
```

Now, by pasting these along the common edge `Rgfg`, we obtain

```text
            gfgS           gfgS
      gfg <------- gfgfg -------> gfg
       |             |             |
    Rg |             | Rgfg        | Rg
       ∨             ∨             ∨
       g <--------- gfg --------> gm
             Rg             gS
```

After cancelling `gfgS` and `Rg` with themselves, we are left with `Rg ~ gS` as
desired.

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2}
  (f : A  B)
  (g : B  A)
  (S : is-section f g)
  (R : is-retraction f g)
  (H : coherence-is-coherently-invertible f g S R)
  where

  abstract
    coh-transposition-coherence-is-coherently-invertible :
      (g  f  g) ·l S ~ (g  f) ·l R ·r g
    coh-transposition-coherence-is-coherently-invertible =
      ( inv-preserves-comp-left-whisker-comp g (f  g) S) ∙h
      ( left-whisker-comp² g (inv-coh-htpy-id S)) ∙h
      ( double-whisker-comp² g H g) ∙h
      ( preserves-comp-left-whisker-comp g f (R ·r g))

  abstract
    naturality-square-transposition-coherence-is-coherently-invertible :
      coherence-square-homotopies
        ( R ·r (g  f  g))
        ( (g  f  g) ·l S)
        ( R ·r g)
        ( R ·r g)
    naturality-square-transposition-coherence-is-coherently-invertible =
      ( ap-concat-htpy'
        ( R ·r g)
        ( coh-transposition-coherence-is-coherently-invertible)) ∙h
      ( inv-htpy (nat-htpy R ·r (R ·r g))) ∙h
      ( ap-concat-htpy
        ( R ·r (g  f  g))
        ( left-unit-law-left-whisker-comp (R ·r g)))

  abstract
    coherence-transposition-coherence-is-coherently-invertible :
      coherence-is-transpose-coherently-invertible f g S R
    coherence-transposition-coherence-is-coherently-invertible =
      ( ap-concat-htpy'
        ( R ·r g)
        ( inv-htpy (left-inv-htpy ((g  f  g) ·l S)))) ∙h
      ( assoc-htpy (inv-htpy ((g  f  g) ·l S)) ((g  f  g) ·l S) (R ·r g)) ∙h
      ( ap-concat-htpy
        ( inv-htpy ((g  f  g) ·l S))
        ( inv-htpy (nat-htpy (R ·r g) ·r S))) ∙h
      ( inv-htpy
        ( assoc-htpy
          ( inv-htpy ((g  f  g) ·l S))
          ( R ·r (g  f  g))
          ( g ·l S))) ∙h
      ( ap-concat-htpy'
        ( g ·l S)
        ( ( vertical-inv-coherence-square-homotopies
            ( R ·r (g  f  g)) ((g  f  g) ·l S) (R ·r g) (R ·r g)
            ( naturality-square-transposition-coherence-is-coherently-invertible)) ∙h
          ( right-inv-htpy (R ·r g))))
```

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

  coherence-transposition-is-coherently-invertible :
    (H : is-coherently-invertible f) 
    coherence-is-transpose-coherently-invertible
      ( f)
      ( map-inv-is-coherently-invertible H)
      ( is-section-map-inv-is-coherently-invertible H)
      ( is-retraction-map-inv-is-coherently-invertible H)
  coherence-transposition-is-coherently-invertible
    ( g , S , R , H) =
    coherence-transposition-coherence-is-coherently-invertible f g S R H

  transposition-is-coherently-invertible :
    is-coherently-invertible f  is-transpose-coherently-invertible f
  transposition-is-coherently-invertible H =
    is-transpose-coherently-invertible-transpose-coherence-is-invertible
      ( is-invertible-is-coherently-invertible H)
      ( coherence-transposition-is-coherently-invertible H)
```

### Transpose coherently invertible maps are coherently invertible

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

  coherence-transposition-is-transpose-coherently-invertible :
    (H : is-transpose-coherently-invertible f) 
    coherence-is-coherently-invertible
      ( f)
      ( map-inv-is-transpose-coherently-invertible H)
      ( is-section-map-inv-is-transpose-coherently-invertible H)
      ( is-retraction-map-inv-is-transpose-coherently-invertible H)
  coherence-transposition-is-transpose-coherently-invertible H =
    coherence-transposition-is-coherently-invertible
      ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible H)

  transposition-is-transpose-coherently-invertible :
    is-transpose-coherently-invertible f  is-coherently-invertible f
  transposition-is-transpose-coherently-invertible H =
    is-coherently-invertible-coherence-is-invertible
      ( is-invertible-is-transpose-coherently-invertible H)
      ( coherence-transposition-is-transpose-coherently-invertible H)

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

  transposition-coherently-invertible-map :
    coherently-invertible-map A B  transpose-coherently-invertible-map A B
  transposition-coherently-invertible-map (f , H) =
    ( f , transposition-is-coherently-invertible H)

  transposition-transpose-coherently-invertible-map :
    transpose-coherently-invertible-map A B  coherently-invertible-map A B
  transposition-transpose-coherently-invertible-map (f , H) =
    ( f , transposition-is-transpose-coherently-invertible H)
```

### Coherently invertible maps are closed under homotopies

**Proof.** Assume given a coherently invertible map `f` with inverse `g`,
homotopies `S : f ∘ g ~ id`, `R : g ∘ f ~ id` and coherence `C : Sf ~ fR`.
Moreover, assume the map `f'` is homotopic to `f` with homotopy `H : f' ~ f`.
Then `g` is also a two-sided inverse to `f'` via the homotopies

```text
  S' := Hg ∙ S : f' ∘ g ~ id    and    R' := gH ∙ R : g ∘ f' ~ id.
```

Moreover, these witnesses are part of a coherent inverse to `f'`. To show this,
we must construct a coherence `C'` of the square

```text
           Hgf'
    f'gf' -----> f'gf
      |           |
 f'gH |           | Sf'
      ∨           ∨
    f'gf -------> f'.
           f'R
```

We begin by observing that `C` fits somewhere along the diagonal of this square
via the composite

```text
                        Sf
            HgH       ------>     H⁻¹
    f'gf' ------> fgf    C    f ------> f'.
                      ------>
                        fR
```

```agda
module _
  {l1 l2 : Level} {A : UU l1} {B : UU l2} {f f' : A  B} (H : f' ~ f)
  (g : B  A) (S : f  g ~ id) (R : g  f ~ id) (C : S ·r f ~ f ·l R)
  where

  coh-coh-is-coherently-invertible-htpy :
    horizontal-concat-htpy' (H ·r g) H ∙h (S ·r f ∙h inv-htpy H) ~
    horizontal-concat-htpy' (H ·r g) H ∙h (f ·l R ∙h inv-htpy H)
  coh-coh-is-coherently-invertible-htpy =
    left-whisker-concat-htpy
      ( horizontal-concat-htpy' (H ·r g) H)
      ( right-whisker-concat-htpy C (inv-htpy H))
```

Now the problem is reduced to constructing two homotopies

```text
  Hgf' ∙ Sf' ~ HgH ∙ Sf ∙ H⁻¹    and    f'gH ∙ f'R ~ HgH ∙ fR ∙ H⁻¹.
```

By the two equivalent constructions of the horizontal composite `HgH`

```text
    Hgf' ∙ fgH ~ HgH ~ f'gH ∙ Hgf
```

constructing the two homotopies is equivalent to constructing coherences of the
squares

```text
            fgH                        Hgf
     fgf' -------> fgf          f'gf -------> fgf
      |             |            |             |
  Sf' |             | Sf     f'R |             | fR
      ∨             ∨            ∨             ∨
      f' ---------> f            f' ---------> f.
             H                          H
```

However, these squares are naturality squares, so we are done.

```agda
  coh-section-is-coherently-invertible-htpy :
    (H ·r g ∙h S) ·r f' ~
    horizontal-concat-htpy' (H ·r g) H ∙h ((S ·r f) ∙h inv-htpy H)
  coh-section-is-coherently-invertible-htpy =
    ( left-whisker-concat-htpy
      ( H ·r (g  f'))
      ( right-transpose-htpy-concat (S ·r f') H ((f  g) ·l H ∙h S ·r f)
        ( ( ap-concat-htpy
            ( S ·r f')
            ( inv-htpy (left-unit-law-left-whisker-comp H))) ∙h
          ( nat-htpy S ·r H)))) ∙h
    ( ( ap-concat-htpy
        ( H ·r (g  f'))
        ( assoc-htpy ((f  g) ·l H) (S ·r f) (inv-htpy H))) ∙h
      ( inv-htpy
        ( assoc-htpy (H ·r (g  f')) ((f  g) ·l H) ((S ·r f) ∙h inv-htpy H))))

  coh-retraction-is-coherently-invertible-htpy :
    horizontal-concat-htpy' (H ·r g) H ∙h ((f ·l R) ∙h inv-htpy H) ~
    f' ·l ((g ·l H) ∙h R)
  coh-retraction-is-coherently-invertible-htpy =
    ( ap-concat-htpy'
      ( f ·l R ∙h inv-htpy H)
      ( coh-horizontal-concat-htpy (H ·r g) H)) ∙h
    ( assoc-htpy ((f'  g) ·l H) (H ·r (g  f)) (f ·l R ∙h inv-htpy H)) ∙h
    ( ap-concat-htpy
      ( (f'  g) ·l H)
      ( inv-htpy (assoc-htpy (H ·r (g  f)) (f ·l R) (inv-htpy H)))) ∙h
    ( left-whisker-concat-htpy
      ( (f'  g) ·l H)
      ( inv-htpy
        ( right-transpose-htpy-concat (f' ·l R) H ((H ·r (g  f) ∙h f ·l R))
          ( inv-htpy (nat-htpy H ·r R))))) ∙h
    ( ap-concat-htpy'
      ( f' ·l R)
      ( inv-preserves-comp-left-whisker-comp f' g H)) ∙h
    ( inv-htpy (distributive-left-whisker-comp-concat f' (g ·l H) R))
```

Finally, we concatenate the three coherences to obtain our desired result.

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

  abstract
    coh-is-coherently-invertible-htpy :
      (H : f' ~ f) (F : is-coherently-invertible f) 
      coherence-is-coherently-invertible
        ( f')
        ( map-inv-is-coherently-invertible F)
        ( is-section-map-inv-is-invertible-htpy
          ( H)
          ( is-invertible-is-coherently-invertible F))
        ( is-retraction-map-inv-is-invertible-htpy
          ( H)
          ( is-invertible-is-coherently-invertible F))
    coh-is-coherently-invertible-htpy H F =
      ( coh-section-is-coherently-invertible-htpy H
        ( map-inv-is-coherently-invertible F)
        ( is-section-map-inv-is-coherently-invertible F)
        ( is-retraction-map-inv-is-coherently-invertible F)
        ( coh-is-coherently-invertible F)) ∙h
      ( coh-coh-is-coherently-invertible-htpy H
        ( map-inv-is-coherently-invertible F)
        ( is-section-map-inv-is-coherently-invertible F)
        ( is-retraction-map-inv-is-coherently-invertible F)
        ( coh-is-coherently-invertible F)) ∙h
      ( coh-retraction-is-coherently-invertible-htpy H
        ( map-inv-is-coherently-invertible F)
        ( is-section-map-inv-is-coherently-invertible F)
        ( is-retraction-map-inv-is-coherently-invertible F)
        ( coh-is-coherently-invertible F))

  is-coherently-invertible-htpy :
    f' ~ f  is-coherently-invertible f  is-coherently-invertible f'
  is-coherently-invertible-htpy H F =
    is-coherently-invertible-coherence-is-invertible
      ( is-invertible-htpy H (is-invertible-is-coherently-invertible F))
      ( coh-is-coherently-invertible-htpy H F)

  is-coherently-invertible-inv-htpy :
    f ~ f'  is-coherently-invertible f  is-coherently-invertible f'
  is-coherently-invertible-inv-htpy H =
    is-coherently-invertible-htpy (inv-htpy H)

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

  is-coherently-invertible-htpy-coherently-invertible-map :
    (e : coherently-invertible-map A B) 
    f ~ map-coherently-invertible-map e 
    is-coherently-invertible f
  is-coherently-invertible-htpy-coherently-invertible-map (e , E) H =
    is-coherently-invertible-htpy H E

  is-coherently-invertible-inv-htpy-coherently-invertible-map :
    (e : coherently-invertible-map A B) 
    map-coherently-invertible-map e ~ f 
    is-coherently-invertible f
  is-coherently-invertible-inv-htpy-coherently-invertible-map (e , E) H =
    is-coherently-invertible-inv-htpy H E
```

### The identity map is coherently invertible

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

  is-coherently-invertible-id :
    is-coherently-invertible (id {A = A})
  is-coherently-invertible-id =
    is-coherently-invertible-coherence-is-invertible is-invertible-id refl-htpy

  id-coherently-invertible-map : coherently-invertible-map A A
  id-coherently-invertible-map =
    ( id , is-coherently-invertible-id)

  is-transpose-coherently-invertible-id :
    is-transpose-coherently-invertible (id {A = A})
  is-transpose-coherently-invertible-id =
    is-transpose-coherently-invertible-map-inv-is-coherently-invertible
      ( is-coherently-invertible-id)

  id-transpose-coherently-invertible-map :
    transpose-coherently-invertible-map A A
  id-transpose-coherently-invertible-map =
    ( id , is-transpose-coherently-invertible-id)
```

### Inversion of coherently invertible maps

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

  is-coherently-invertible-map-inv-is-coherently-invertible :
    {f : A  B} (H : is-coherently-invertible f) 
    is-coherently-invertible (map-inv-is-coherently-invertible H)
  is-coherently-invertible-map-inv-is-coherently-invertible H =
    is-coherently-invertible-map-inv-is-transpose-coherently-invertible
      ( transposition-is-coherently-invertible H)

  is-transpose-coherently-invertible-map-inv-is-transpose-coherently-invertible :
    {f : A  B} (H : is-transpose-coherently-invertible f) 
    is-transpose-coherently-invertible
      ( map-inv-is-transpose-coherently-invertible H)
  is-transpose-coherently-invertible-map-inv-is-transpose-coherently-invertible
    H =
    transposition-is-coherently-invertible
      ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible H)

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

  inv-transpose-coherently-invertible-map :
    transpose-coherently-invertible-map A B 
    transpose-coherently-invertible-map B A
  inv-transpose-coherently-invertible-map (f , H) =
    ( map-inv-is-transpose-coherently-invertible H ,
      is-transpose-coherently-invertible-map-inv-is-transpose-coherently-invertible
        ( H))
```

### Composition of coherently 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-coherently-invertible g)
    (F : is-coherently-invertible f)
  where

  coh-is-coherently-invertible-comp :
    coherence-is-coherently-invertible
      ( g  f)
      ( map-inv-is-invertible-comp g f
        ( is-invertible-is-coherently-invertible G)
        ( is-invertible-is-coherently-invertible F))
      ( is-section-map-inv-is-invertible-comp g f
        ( is-invertible-is-coherently-invertible G)
        ( is-invertible-is-coherently-invertible F))
      ( is-retraction-map-inv-is-invertible-comp g f
        ( is-invertible-is-coherently-invertible G)
        ( is-invertible-is-coherently-invertible F))
  coh-is-coherently-invertible-comp =
    ( ap-concat-htpy
      ( ( g) ·l
        ( is-section-map-inv-is-coherently-invertible F) ·r
        ( map-inv-is-coherently-invertible G  g  f))
      ( coh-is-coherently-invertible G ·r f)) ∙h
    ( right-whisker-comp²
      ( ( nat-htpy (g ·l is-section-map-inv-is-coherently-invertible F)) ·r
        ( is-retraction-map-inv-is-coherently-invertible G))
      ( f)) ∙h
    ( ap-binary-concat-htpy
      ( inv-preserves-comp-left-whisker-comp
          ( g  f)
          ( map-inv-is-coherently-invertible F)
          ( is-retraction-map-inv-is-coherently-invertible G ·r f))
      ( ( left-whisker-comp² g (coh-is-coherently-invertible F)) ∙h
        ( preserves-comp-left-whisker-comp g f
          ( is-retraction-map-inv-is-coherently-invertible F)))) ∙h
    ( inv-htpy
      ( distributive-left-whisker-comp-concat
        ( g  f)
        ( ( map-inv-is-coherently-invertible F) ·l
          ( is-retraction-map-inv-is-coherently-invertible G ·r f))
        ( is-retraction-map-inv-is-coherently-invertible F)))

  is-coherently-invertible-comp : is-coherently-invertible (g  f)
  is-coherently-invertible-comp =
    is-coherently-invertible-coherence-is-invertible
      ( is-invertible-comp g f
        ( is-invertible-is-coherently-invertible G)
        ( is-invertible-is-coherently-invertible F))
      ( coh-is-coherently-invertible-comp)

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

  coh-is-transpose-coherently-invertible-comp :
    coherence-is-transpose-coherently-invertible
      ( g  f)
      ( map-inv-is-invertible-comp g f
        ( is-invertible-is-transpose-coherently-invertible G)
        ( is-invertible-is-transpose-coherently-invertible F))
      ( is-section-map-inv-is-invertible-comp g f
        ( is-invertible-is-transpose-coherently-invertible G)
        ( is-invertible-is-transpose-coherently-invertible F))
      ( is-retraction-map-inv-is-invertible-comp g f
        ( is-invertible-is-transpose-coherently-invertible G)
        ( is-invertible-is-transpose-coherently-invertible F))
  coh-is-transpose-coherently-invertible-comp =
    coh-is-coherently-invertible-comp
      ( map-inv-is-transpose-coherently-invertible F)
      ( map-inv-is-transpose-coherently-invertible G)
      ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible F)
      ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible G)

  is-transpose-coherently-invertible-comp :
    is-transpose-coherently-invertible (g  f)
  is-transpose-coherently-invertible-comp =
    is-transpose-coherently-invertible-transpose-coherence-is-invertible
      ( is-invertible-comp g f
        ( is-invertible-is-transpose-coherently-invertible G)
        ( is-invertible-is-transpose-coherently-invertible F))
      ( coh-is-transpose-coherently-invertible-comp)

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

  comp-coherently-invertible-map :
    coherently-invertible-map B C 
    coherently-invertible-map A B 
    coherently-invertible-map A C
  comp-coherently-invertible-map (g , G) (f , F) =
    ( g  f , is-coherently-invertible-comp g f G F)

  comp-transpose-coherently-invertible-map :
    transpose-coherently-invertible-map B C 
    transpose-coherently-invertible-map A B 
    transpose-coherently-invertible-map A C
  comp-transpose-coherently-invertible-map (g , G) (f , F) =
    ( g  f , is-transpose-coherently-invertible-comp g f G F)
```

### The 3-for-2 property of coherently invertible maps

The
{{#concept "3-for-2 property" Disambiguation="of coherently invertible maps"}}
of coherently invertible maps asserts that for any
[commuting triangle](foundation-core.commuting-triangles-of-maps.md) of maps

```text
       h
  A ------> B
   \       /
   f\     /g
     \   /
      ∨ ∨
       X,
```

if two of the three maps are coherently invertible, then so is the third.

We also record special cases of the 3-for-2 property of coherently invertible
maps, where we only assume maps `g : B → X` and `h : A → B`. In this special
case, we set `f := g ∘ h` and the triangle commutes by `refl-htpy`.

[André Joyal](https://en.wikipedia.org/wiki/André_Joyal) proposed calling this
property the 3-for-2 property, despite most mathematicians calling it the
_2-out-of-3 property_. The story goes that on the produce market is is common to
advertise a discount as "3-for-2". If you buy two apples, then you get the third
for free. Similarly, if you prove that two maps in a commuting triangle are
coherently invertible, then you get the third proof for free.

#### The left map in a commuting triangle is coherently invertible if the other two maps are

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (f : A  X) (g : B  X) (h : A  B) (T : f ~ g  h)
  where

  is-coherently-invertible-left-map-triangle :
    is-coherently-invertible h 
    is-coherently-invertible g 
    is-coherently-invertible f
  is-coherently-invertible-left-map-triangle H G =
    is-coherently-invertible-htpy T (is-coherently-invertible-comp g h G H)
```

#### The right map in a commuting triangle is coherently invertible if the other two maps are

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (f : A  X) (g : B  X) (h : A  B) (T : f ~ g  h)
  where

  is-coherently-invertible-right-map-triangle :
    is-coherently-invertible f 
    is-coherently-invertible h 
    is-coherently-invertible g
  is-coherently-invertible-right-map-triangle F H =
    is-coherently-invertible-htpy
      ( ( g ·l inv-htpy (is-section-map-inv-is-coherently-invertible H)) ∙h
        ( inv-htpy T ·r map-inv-is-coherently-invertible H))
      ( is-coherently-invertible-comp
        ( f)
        ( map-inv-is-coherently-invertible H)
        ( F)
        ( is-coherently-invertible-map-inv-is-coherently-invertible H))
```

#### The top map in a commuting triangle is coherently invertible if the other two maps are

```agda
module _
  {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3}
  (f : A  X) (g : B  X) (h : A  B) (T : f ~ g  h)
  where

  is-coherently-invertible-top-map-triangle :
    is-coherently-invertible g 
    is-coherently-invertible f 
    is-coherently-invertible h
  is-coherently-invertible-top-map-triangle G F =
    is-coherently-invertible-htpy
      ( ( inv-htpy (is-retraction-map-inv-is-coherently-invertible G) ·r h) ∙h
        ( map-inv-is-coherently-invertible G ·l inv-htpy T))
      ( is-coherently-invertible-comp
        ( map-inv-is-coherently-invertible G)
        ( f)
        ( is-coherently-invertible-map-inv-is-coherently-invertible G)
        ( F))
```

#### If a composite and its right factor are coherently invertible, then so is its left factor

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

  is-coherently-invertible-left-factor :
    (g : B  X) (h : A  B) 
    is-coherently-invertible (g  h) 
    is-coherently-invertible h 
    is-coherently-invertible g
  is-coherently-invertible-left-factor g h GH H =
    is-coherently-invertible-right-map-triangle (g  h) g h refl-htpy GH H
```

#### If a composite and its left factor are coherently invertible, then so is its right factor

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

  is-coherently-invertible-right-factor :
    (g : B  X) (h : A  B) 
    is-coherently-invertible g 
    is-coherently-invertible (g  h) 
    is-coherently-invertible h
  is-coherently-invertible-right-factor g h G GH =
    is-coherently-invertible-top-map-triangle (g  h) g h refl-htpy G GH
```

### Any section of a coherently invertible map is coherently invertible

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

  is-coherently-invertible-is-section :
    {f : A  B} {g : B  A} 
    is-coherently-invertible f  f  g ~ id  is-coherently-invertible g
  is-coherently-invertible-is-section {f = f} {g} F H =
    is-coherently-invertible-top-map-triangle id f g
      ( inv-htpy H)
      ( F)
      ( is-coherently-invertible-id)
```

### Any retraction of a coherently invertible map is coherently invertible

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

  is-coherently-invertible-is-retraction :
    {f : A  B} {g : B  A} 
    is-coherently-invertible f  (g  f) ~ id  is-coherently-invertible g
  is-coherently-invertible-is-retraction {f = f} {g} F H =
    is-coherently-invertible-right-map-triangle id g f
      ( inv-htpy H)
      ( is-coherently-invertible-id)
      ( F)
```

### If a section of `f` is coherently invertible, then `f` is coherently invertible

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

    is-coherently-invertible-is-coherently-invertible-section :
      (s : section f) 
      is-coherently-invertible (map-section f s)  is-coherently-invertible f
    is-coherently-invertible-is-coherently-invertible-section (g , G) S =
      is-coherently-invertible-is-retraction S G
```

### If a retraction of `f` is coherently invertible, then `f` is coherently invertible

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

  abstract
    is-coherently-invertible-is-coherently-invertible-retraction :
      (r : retraction f) 
      is-coherently-invertible (map-retraction f r)  is-coherently-invertible f
    is-coherently-invertible-is-coherently-invertible-retraction (g , G) R =
      is-coherently-invertible-is-section R G
```

### Any section of a coherently invertible map is homotopic to its inverse

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

  htpy-map-inv-coherently-invertible-map-section :
    (f : section (map-coherently-invertible-map e)) 
    map-inv-coherently-invertible-map e ~
    map-section (map-coherently-invertible-map e) f
  htpy-map-inv-coherently-invertible-map-section =
    htpy-map-inv-invertible-map-section
      ( invertible-map-coherently-invertible-map e)
```

### Any retraction of a coherently invertible map is homotopic to its inverse

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

  htpy-map-inv-coherently-invertible-map-retraction :
    (f : retraction (map-coherently-invertible-map e)) 
    map-inv-coherently-invertible-map e ~
    map-retraction (map-coherently-invertible-map e) f
  htpy-map-inv-coherently-invertible-map-retraction =
    htpy-map-inv-invertible-map-retraction
      ( invertible-map-coherently-invertible-map e)
```

## References

{{#bibliography}}

## See also

- 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).

## External links

- [Adjoint equivalences](https://1lab.dev/1Lab.Equiv.HalfAdjoint.html) at 1lab
- [adjoint equivalence](https://ncatlab.org/nlab/show/adjoint+equivalence) at
  $n$Lab