# Coherently invertible maps

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

<details><summary>Imports</summary>

```agda
open import foundation.action-on-identifications-functions
open import foundation.commuting-squares-of-identifications
open import foundation.dependent-pair-types
open import foundation.universe-levels

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
```

</details>

## Idea

An [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)
` (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). Therefore we include a coherence
condition for the homotopies of an inverse. A **coherently invertible map**
`f : A → B` is a map equipped with a two-sided inverse and this additional
coherence law. They are also called half-adjoint equivalences.

## Definition

```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-retraction-is-coherently-invertible :
    (f  map-inv-is-coherently-invertible) ~ id
  is-retraction-is-coherently-invertible = pr1 (pr2 H)

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

  coh-is-coherently-invertible :
    coherence-is-coherently-invertible f
      ( map-inv-is-coherently-invertible)
      ( is-retraction-is-coherently-invertible)
      ( is-section-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-retraction-is-coherently-invertible
  pr2 (pr2 is-invertible-is-coherently-invertible) =
    is-section-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-retraction-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-section-is-coherently-invertible
```

## Properties

### Invertible maps are coherently invertible

#### Lemma: A coherence for homotopies to an identity map

```agda
coh-is-coherently-invertible-id :
  {l : Level} {A : UU l} {f : A  A} (H : f ~  x  x)) 
  (x : A)  H (f x)  ap f (H x)
coh-is-coherently-invertible-id {_} {A} {f} H x =
  is-injective-concat' (H x)
    ( ( ap (concat (H (f x)) x) (inv (ap-id (H x)))) 
      ( nat-htpy H (H x)))
```

#### The proof that invertible maps are coherently invertible

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

  is-section-map-inv-is-invertible :
    (H : is-invertible f)  (f  map-inv-is-invertible H) ~ id
  is-section-map-inv-is-invertible H y =
    ( inv (is-retraction-is-invertible H (f (map-inv-is-invertible H y)))) 
    ( ( ap f (is-section-is-invertible H (map-inv-is-invertible H y))) 
      ( is-retraction-is-invertible H y))

  is-retraction-map-inv-is-invertible :
    (H : is-invertible f)  (map-inv-is-invertible H  f) ~ id
  is-retraction-map-inv-is-invertible = is-section-is-invertible

  coherence-map-inv-is-invertible :
    ( H : is-invertible f) 
    ( is-section-map-inv-is-invertible H ·r f) ~
    ( f ·l is-retraction-map-inv-is-invertible H)
  coherence-map-inv-is-invertible H x =
    inv
      ( left-transpose-eq-concat
        ( is-retraction-is-invertible H (f (map-inv-is-invertible H (f x))))
        ( ap f (is-section-is-invertible H x))
        ( ( ap f
            ( is-section-is-invertible H (map-inv-is-invertible H (f x)))) 
          ( is-retraction-is-invertible H (f x)))
        ( coherence-square-identifications-top-paste
          ( is-retraction-is-invertible H (f (map-inv-is-invertible H (f x))))
          ( ap f (is-section-is-invertible H x))
          ( ( ap
              ( f  (map-inv-is-invertible H  f))
              ( is-section-is-invertible H x)))
          ( is-retraction-is-invertible H (f x))
          ( ( ap-comp f
              ( map-inv-is-invertible H  f)
              ( is-section-is-invertible H x)) 
            ( inv
              ( ap
                ( ap f)
                ( coh-is-coherently-invertible-id
                  ( is-section-is-invertible H) x))))
          ( nat-htpy
            ( htpy-right-whisk (is-retraction-is-invertible H) f)
            ( is-section-is-invertible H x))))

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

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