# Finitely coherent equivalences

```agda
module foundation.finitely-coherent-equivalences where
```

<details><summary>Imports</summary>

```agda
open import elementary-number-theory.natural-numbers

open import foundation.identity-types
open import foundation.unit-type
open import foundation.universe-levels
```

</details>

## Idea

The condition of being a
{{#concept "finitely coherent equivalence" Agda=is-finitely-coherent-equivalence}}
is introduced by induction on the
[natural numbers](elementary-number-theory.natural-numbers.md). In the base
case, we say that any map `f : A → B` is a
{{#concept "`0`-coherent equivalence" Agda=is-finitely-coherent-equivalence}}.
Recursively, we say that a map `f : A → B` is an
{{#concept "`n + 1`-coherent equivalence" Agda=is-finitely-coherent-equivalence}}
if it comes equipped with a map `g : B → A` and a family of maps

```text
  r x y : (f x = y) → (x = g y)
```

indexed by `x : A` and `y : B`, such that each `r x y` is an `n`-coherent
equivalence.

By the equivalence of [retracting homotopies](foundation-core.retractions.md)
and
[transposition operations of identifications](foundation.transposition-identifications-along-retractions.md)
it therefore follows that a `1`-coherent equivalence is equivalently described
as a map equipped with a retraction. A `2`-coherent equivalence is a map
`f : A → B` equipped with `g : B → A` and for each `x : A` and `y : B` a map
`r x y : (f x = y) → (x = g y)`, equipped with

```text
  s x y : (x = g y) → (f x = y)
```

and for each `p : f x = y` and `q : x = g y` a map

```text
  t p q : (r x y p = q) → (p = s x y q).
```

This data is equivalent to the data of a
[coherently invertible map](foundation-core.coherently-invertible-maps.md)

```text
  r : (x : A) → g (f x) = x
  s : (y : B) → f (g y) = y
  t : (x : A) → ap f (r x) = s (f x).
```

The condition of being an `n`-coherent equivalence is a
[proposition](foundation-core.propositions.md) for each `n ≥ 2`, and this
proposition is equivalent to being an equivalence.

## Definitions

### The predicate of being an `n`-coherent equivalence

```agda
data
  is-finitely-coherent-equivalence
    {l1 l2 : Level} {A : UU l1} {B : UU l2} :
    (n : ) (f : A  B)  UU (l1  l2)
  where
  is-zero-coherent-equivalence :
    (f : A  B)  is-finitely-coherent-equivalence 0 f
  is-succ-coherent-equivalence :
    (n : )
    (f : A  B) (g : B  A) (H : (x : A) (y : B)  (f x  y)  (x  g y)) 
    ((x : A) (y : B)  is-finitely-coherent-equivalence n (H x y)) 
    is-finitely-coherent-equivalence (succ-ℕ n) f
```