# Infinitely coherent equivalences ```agda {-# OPTIONS --guardedness --lossy-unification #-} module foundation.infinitely-coherent-equivalences where ``` <details><summary>Imports</summary> ```agda open import foundation.commuting-triangles-of-maps open import foundation.dependent-pair-types open import foundation.equivalences open import foundation.function-types open import foundation.homotopies open import foundation.identity-types open import foundation.propositions open import foundation.retractions open import foundation.sections open import foundation.transposition-identifications-along-equivalences open import foundation.universe-levels ``` </details> ## Idea An {{#concept "infinitely coherent equivalence" Agda=_≃∞_}} `e : A ≃∞ B` from `A` to `B` consists of maps ```text f : A → B g : B → A ``` and for each `x : A` and `y : B` an infinitely coherent equivalence ```text ∞-equiv-transpose-eq-∞-equiv : (f x = y) ≃∞ (x = g y). ``` Since this definition is infinite, it follows that for any `x : A` and `y : B` we have maps ```text f' : (f x = y) → (x = g y) g' : (x = g y) → (f x = y) ``` and for each `p : f x = y` and `q : g y = x` an infinitely coherent equivalence ```text ∞-equiv-transpose-eq-∞-equiv : (f' p = q) ≃∞ (p = g' q). ``` In particular, we have identifications ```text inv (f' x (f x) refl) : x = g (f x) g' y (g y) refl : f (g y) = y, ``` which are the usual homotopies witnessing that `g` is a retraction and a section of `f`. By infinitely imposing the structure of a coherent equivalence, we have stated an infinite hierarchy of coherence conditions. In other words, the infinite condition on infinitely coherent equivalences is a way of stating infinite coherence for equivalences. Being an infinitely coherent equivalence is an inverse sequential limit of the diagram ```text ... ---> is-finitely-coherent-equivalence 1 f ---> is-finitely-coherent-equivalence 0 f. ``` ## Definitions ### The predicate of being an infinitely coherent equivalence ```agda record is-∞-equiv {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) : UU (l1 ⊔ l2) where coinductive field map-inv-is-∞-equiv : B → A map-transpose-is-∞-equiv : (x : A) (y : B) → f x = y → x = map-inv-is-∞-equiv y is-∞-equiv-map-transpose-is-∞-equiv : (x : A) (y : B) → is-∞-equiv (map-transpose-is-∞-equiv x y) open is-∞-equiv public ``` ### Infinitely coherent equivalences ```agda record ∞-equiv {l1 l2 : Level} (A : UU l1) (B : UU l2) : UU (l1 ⊔ l2) where coinductive field map-∞-equiv : A → B map-inv-∞-equiv : B → A ∞-equiv-transpose-eq-∞-equiv : (x : A) (y : B) → ∞-equiv (map-∞-equiv x = y) (x = map-inv-∞-equiv y) open ∞-equiv public module _ {l1 l2 : Level} (A : UU l1) (B : UU l2) where infix 6 _≃∞_ _≃∞_ : UU (l1 ⊔ l2) _≃∞_ = ∞-equiv A B ∞-equiv-is-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} → is-∞-equiv f → A ≃∞ B map-∞-equiv (∞-equiv-is-∞-equiv {f = f} H) = f map-inv-∞-equiv (∞-equiv-is-∞-equiv H) = map-inv-is-∞-equiv H ∞-equiv-transpose-eq-∞-equiv (∞-equiv-is-∞-equiv H) x y = ∞-equiv-is-∞-equiv (is-∞-equiv-map-transpose-is-∞-equiv H x y) map-transpose-eq-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃∞ B) → (x : A) (y : B) → (map-∞-equiv e x = y) → (x = map-inv-∞-equiv e y) map-transpose-eq-∞-equiv e x y = map-∞-equiv (∞-equiv-transpose-eq-∞-equiv e x y) is-∞-equiv-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃∞ B) → is-∞-equiv (map-∞-equiv e) map-inv-is-∞-equiv (is-∞-equiv-∞-equiv e) = map-inv-∞-equiv e map-transpose-is-∞-equiv (is-∞-equiv-∞-equiv e) = map-transpose-eq-∞-equiv e is-∞-equiv-map-transpose-is-∞-equiv (is-∞-equiv-∞-equiv e) x y = is-∞-equiv-∞-equiv (∞-equiv-transpose-eq-∞-equiv e x y) is-∞-equiv-map-transpose-eq-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃∞ B) (x : A) (y : B) → is-∞-equiv (map-transpose-eq-∞-equiv e x y) is-∞-equiv-map-transpose-eq-∞-equiv e x y = is-∞-equiv-∞-equiv (∞-equiv-transpose-eq-∞-equiv e x y) ``` ### Infinitely coherent identity equivalences ```agda is-∞-equiv-id : {l1 : Level} {A : UU l1} → is-∞-equiv (id {A = A}) map-inv-is-∞-equiv is-∞-equiv-id = id map-transpose-is-∞-equiv is-∞-equiv-id x y = id is-∞-equiv-map-transpose-is-∞-equiv is-∞-equiv-id x y = is-∞-equiv-id id-∞-equiv : {l1 : Level} {A : UU l1} → A ≃∞ A id-∞-equiv = ∞-equiv-is-∞-equiv is-∞-equiv-id ``` ### Composition of infinitely coherent equivalences ```agda is-∞-equiv-comp : {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} {g : B → C} {f : A → B} (G : is-∞-equiv g) (F : is-∞-equiv f) → is-∞-equiv (g ∘ f) map-inv-is-∞-equiv (is-∞-equiv-comp G F) = map-inv-is-∞-equiv F ∘ map-inv-is-∞-equiv G map-transpose-is-∞-equiv (is-∞-equiv-comp G F) x z p = map-transpose-is-∞-equiv F x _ (map-transpose-is-∞-equiv G _ z p) is-∞-equiv-map-transpose-is-∞-equiv (is-∞-equiv-comp G F) x z = is-∞-equiv-comp ( is-∞-equiv-map-transpose-is-∞-equiv F x _) ( is-∞-equiv-map-transpose-is-∞-equiv G _ z) comp-∞-equiv : {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} → B ≃∞ C → A ≃∞ B → A ≃∞ C comp-∞-equiv f e = ∞-equiv-is-∞-equiv ( is-∞-equiv-comp (is-∞-equiv-∞-equiv f) (is-∞-equiv-∞-equiv e)) ``` ### Infinitely coherent equivalences obtained from equivalences Since [transposing identifications along an equivalence](foundation.transposition-identifications-along-equivalences.md) is an equivalence, it follows immediately that equivalences are infinitely coherent equivalences. This argument does not require [function extensionality](foundation.function-extensionality.md). ```agda is-∞-equiv-is-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} → is-equiv f → is-∞-equiv f map-inv-is-∞-equiv (is-∞-equiv-is-equiv H) = map-inv-is-equiv H map-transpose-is-∞-equiv (is-∞-equiv-is-equiv H) x y = map-eq-transpose-equiv (_ , H) is-∞-equiv-map-transpose-is-∞-equiv (is-∞-equiv-is-equiv H) x y = is-∞-equiv-is-equiv (is-equiv-map-equiv (eq-transpose-equiv (_ , H) x y)) ∞-equiv-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} → A ≃ B → A ≃∞ B ∞-equiv-equiv e = ∞-equiv-is-∞-equiv (is-∞-equiv-is-equiv (is-equiv-map-equiv e)) ``` ## Properties ### Any map homotopic to an infinitely coherent equivalence is an infinitely coherent equivalence ```agda is-∞-equiv-htpy : {l1 l2 : Level} {A : UU l1} {B : UU l2} {f g : A → B} → f ~ g → is-∞-equiv f → is-∞-equiv g map-inv-is-∞-equiv (is-∞-equiv-htpy H K) = map-inv-is-∞-equiv K map-transpose-is-∞-equiv (is-∞-equiv-htpy H K) x y = map-transpose-is-∞-equiv K x y ∘ concat (H x) _ is-∞-equiv-map-transpose-is-∞-equiv (is-∞-equiv-htpy H K) x y = is-∞-equiv-comp ( is-∞-equiv-map-transpose-is-∞-equiv K x y) ( is-∞-equiv-is-equiv (is-equiv-concat (H x) _)) ``` ### Homotopies of elements of type `is-∞-equiv f` Consider a map `f : A → B` and consider two elements ```text H K : is-∞-equiv f. ``` A {{#concept "homotopy of elments of type `is-∞-equiv`" Agda=htpy-is-∞-equiv}} from `H := (h , s , H')` to `K := (k , t , K')` consists of a homotopy ```text α₀ : h ~ k, ``` for each `x : A` and `y : B` a homotopy `α₁` witnessing that the triangle ```text (f x = y) / \ s x y / \ t x y / \ ∨ ∨ (x = h y) --------------> (x = k y) p ↦ p ∙ α₀ y ``` commutes, and finally a homotopy of elements of type ```text is-infinitely-coherent-equivalence ( is-∞-equiv-htpy α₁ ( is-∞-equiv-comp ( is-∞-equiv-is-equiv ( is-equiv-concat' _ (α₀ y))) ( H' x y)) ( K' x y). ``` In other words, there are by the previous data two witnesses of the fact that `t x y` is an infinitely coherent equivalence. The second (easiest) element is the given element `K' x y`. The first element is from the homotopy witnessing that the above triangle commutes. On the left we compose two infinitely coherent equivalences, which results in an infinitely coherent equivalence, and the element witnessing that the composite is an infinitely coherent equivalence transports along the homotopy to a new element witnessing that `t x y` is an infinitely coherent equivalence. ```agda record htpy-is-∞-equiv {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) (H K : is-∞-equiv f) : UU (l1 ⊔ l2) where coinductive field htpy-map-inv-htpy-is-∞-equiv : map-inv-is-∞-equiv H ~ map-inv-is-∞-equiv K htpy-map-transpose-htpy-is-∞-equiv : (x : A) (y : B) → coherence-triangle-maps ( map-transpose-is-∞-equiv K x y) ( concat' _ (htpy-map-inv-htpy-is-∞-equiv y)) ( map-transpose-is-∞-equiv H x y) infinitely-htpy-htpy-is-∞-equiv : (x : A) (y : B) → htpy-is-∞-equiv ( map-transpose-is-∞-equiv K x y) ( is-∞-equiv-htpy ( inv-htpy (htpy-map-transpose-htpy-is-∞-equiv x y)) ( is-∞-equiv-comp ( is-∞-equiv-is-equiv (is-equiv-concat' _ _)) ( is-∞-equiv-map-transpose-is-∞-equiv H x y))) ( is-∞-equiv-map-transpose-is-∞-equiv K x y) ``` ### Being an infinitely coherent equivalence implies being an equivalence ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} where is-equiv-is-∞-equiv : is-∞-equiv f → is-equiv f is-equiv-is-∞-equiv H = is-equiv-is-invertible ( map-inv-is-∞-equiv H) ( λ y → map-inv-is-∞-equiv (is-∞-equiv-map-transpose-is-∞-equiv H _ y) refl) ( λ x → inv (map-transpose-is-∞-equiv H x (f x) refl)) ``` ### Computing the type `is-∞-equiv f` ```agda type-compute-is-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → UU (l1 ⊔ l2) type-compute-is-∞-equiv {A = A} {B} f = Σ (B → A) (λ g → (x : A) (y : B) → Σ ((f x = y) → (x = g y)) is-∞-equiv) map-compute-is-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → type-compute-is-∞-equiv f → is-∞-equiv f map-inv-is-∞-equiv (map-compute-is-∞-equiv f H) = pr1 H map-transpose-is-∞-equiv (map-compute-is-∞-equiv f H) x y = pr1 (pr2 H x y) is-∞-equiv-map-transpose-is-∞-equiv (map-compute-is-∞-equiv f H) x y = pr2 (pr2 H x y) map-inv-compute-is-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → is-∞-equiv f → type-compute-is-∞-equiv f pr1 (map-inv-compute-is-∞-equiv f H) = map-inv-is-∞-equiv H pr1 (pr2 (map-inv-compute-is-∞-equiv f H) x y) = map-transpose-is-∞-equiv H x y pr2 (pr2 (map-inv-compute-is-∞-equiv f H) x y) = is-∞-equiv-map-transpose-is-∞-equiv H x y ``` ### Being an infinitely coherent equivalence is a property ```text is-prop-is-∞-equiv : {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → is-prop (is-∞-equiv f) is-prop-is-∞-equiv = {!!} ```