# Invertible maps ```agda module foundation.invertible-maps where open import foundation-core.invertible-maps public ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.commuting-triangles-of-homotopies open import foundation.dependent-pair-types open import foundation.equality-cartesian-product-types open import foundation.equivalence-extensionality open import foundation.equivalences open import foundation.full-subtypes open import foundation.function-extensionality open import foundation.functoriality-cartesian-product-types open import foundation.fundamental-theorem-of-identity-types open import foundation.homotopies open import foundation.homotopy-algebra open import foundation.homotopy-induction open import foundation.postcomposition-functions open import foundation.retractions open import foundation.sections open import foundation.structure-identity-principle open import foundation.type-arithmetic-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.coherently-invertible-maps open import foundation-core.function-types open import foundation-core.functoriality-dependent-pair-types open import foundation-core.identity-types open import foundation-core.propositions open import foundation-core.torsorial-type-families open import foundation-core.truncated-types open import foundation-core.truncation-levels open import synthetic-homotopy-theory.free-loops ``` </details> ## Properties ### Characterizing equality of invertible maps #### Characterizing equality of `is-inverse` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} {g : B → A} where htpy-is-inverse : (s t : is-inverse f g) → UU (l1 ⊔ l2) htpy-is-inverse s t = (pr1 s ~ pr1 t) × (pr2 s ~ pr2 t) extensionality-is-inverse : {s t : is-inverse f g} → (s = t) ≃ htpy-is-inverse s t extensionality-is-inverse {s} {t} = equiv-product equiv-funext equiv-funext ∘e equiv-pair-eq s t htpy-eq-is-inverse : {s t : is-inverse f g} → s = t → htpy-is-inverse s t htpy-eq-is-inverse = map-equiv extensionality-is-inverse eq-htpy-is-inverse : {s t : is-inverse f g} → htpy-is-inverse s t → s = t eq-htpy-is-inverse = map-inv-equiv extensionality-is-inverse ``` #### Characterizing equality of `is-invertible` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} where coherence-htpy-is-invertible : (s t : is-invertible f) → map-inv-is-invertible s ~ map-inv-is-invertible t → UU (l1 ⊔ l2) coherence-htpy-is-invertible s t H = ( coherence-htpy-section {f = f} ( section-is-invertible s) ( section-is-invertible t) ( H)) × ( coherence-htpy-retraction ( retraction-is-invertible s) ( retraction-is-invertible t) ( H)) htpy-is-invertible : (s t : is-invertible f) → UU (l1 ⊔ l2) htpy-is-invertible s t = Σ ( map-inv-is-invertible s ~ map-inv-is-invertible t) ( coherence-htpy-is-invertible s t) refl-htpy-is-invertible : (s : is-invertible f) → htpy-is-invertible s s pr1 (refl-htpy-is-invertible s) = refl-htpy pr1 (pr2 (refl-htpy-is-invertible s)) = refl-htpy pr2 (pr2 (refl-htpy-is-invertible s)) = refl-htpy htpy-eq-is-invertible : (s t : is-invertible f) → s = t → htpy-is-invertible s t htpy-eq-is-invertible s .s refl = refl-htpy-is-invertible s is-torsorial-htpy-is-invertible : (s : is-invertible f) → is-torsorial (htpy-is-invertible s) is-torsorial-htpy-is-invertible s = is-torsorial-Eq-structure ( is-torsorial-htpy (map-inv-is-invertible s)) ( map-inv-is-invertible s , refl-htpy) ( is-torsorial-Eq-structure ( is-torsorial-htpy (is-section-map-inv-is-invertible s)) ( is-section-map-inv-is-invertible s , refl-htpy) (is-torsorial-htpy (is-retraction-map-inv-is-invertible s))) is-equiv-htpy-eq-is-invertible : (s t : is-invertible f) → is-equiv (htpy-eq-is-invertible s t) is-equiv-htpy-eq-is-invertible s = fundamental-theorem-id ( is-torsorial-htpy-is-invertible s) ( htpy-eq-is-invertible s) extensionality-is-invertible : (s t : is-invertible f) → (s = t) ≃ (htpy-is-invertible s t) pr1 (extensionality-is-invertible s t) = htpy-eq-is-invertible s t pr2 (extensionality-is-invertible s t) = is-equiv-htpy-eq-is-invertible s t eq-htpy-is-invertible : (s t : is-invertible f) → htpy-is-invertible s t → s = t eq-htpy-is-invertible s t = map-inv-equiv (extensionality-is-invertible s t) ``` #### Characterizing equality of `invertible-map` ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where coherence-htpy-invertible-map : (s t : invertible-map A B) → map-invertible-map s ~ map-invertible-map t → map-inv-invertible-map s ~ map-inv-invertible-map t → UU (l1 ⊔ l2) coherence-htpy-invertible-map s t H I = ( coherence-triangle-homotopies ( is-section-map-inv-invertible-map s) ( is-section-map-inv-invertible-map t) ( horizontal-concat-htpy H I)) × ( coherence-triangle-homotopies ( is-retraction-map-inv-invertible-map s) ( is-retraction-map-inv-invertible-map t) ( horizontal-concat-htpy I H)) htpy-invertible-map : (s t : invertible-map A B) → UU (l1 ⊔ l2) htpy-invertible-map s t = Σ ( map-invertible-map s ~ map-invertible-map t) ( λ H → Σ ( map-inv-invertible-map s ~ map-inv-invertible-map t) ( coherence-htpy-invertible-map s t H)) refl-htpy-invertible-map : (s : invertible-map A B) → htpy-invertible-map s s pr1 (refl-htpy-invertible-map s) = refl-htpy pr1 (pr2 (refl-htpy-invertible-map s)) = refl-htpy pr1 (pr2 (pr2 (refl-htpy-invertible-map s))) = refl-htpy pr2 (pr2 (pr2 (refl-htpy-invertible-map s))) = refl-htpy htpy-eq-invertible-map : (s t : invertible-map A B) → s = t → htpy-invertible-map s t htpy-eq-invertible-map s .s refl = refl-htpy-invertible-map s is-torsorial-htpy-invertible-map : (s : invertible-map A B) → is-torsorial (htpy-invertible-map s) is-torsorial-htpy-invertible-map s = is-torsorial-Eq-structure ( is-torsorial-htpy (map-invertible-map s)) ( map-invertible-map s , refl-htpy) ( is-torsorial-Eq-structure ( is-torsorial-htpy (map-inv-invertible-map s)) ( map-inv-invertible-map s , refl-htpy) ( is-torsorial-Eq-structure ( is-torsorial-htpy (is-section-map-inv-invertible-map s)) ( is-section-map-inv-invertible-map s , refl-htpy) ( is-torsorial-htpy (is-retraction-map-inv-invertible-map s)))) is-equiv-htpy-eq-invertible-map : (s t : invertible-map A B) → is-equiv (htpy-eq-invertible-map s t) is-equiv-htpy-eq-invertible-map s = fundamental-theorem-id ( is-torsorial-htpy-invertible-map s) ( htpy-eq-invertible-map s) extensionality-invertible-map : (s t : invertible-map A B) → (s = t) ≃ (htpy-invertible-map s t) pr1 (extensionality-invertible-map s t) = htpy-eq-invertible-map s t pr2 (extensionality-invertible-map s t) = is-equiv-htpy-eq-invertible-map s t eq-htpy-invertible-map : (s t : invertible-map A B) → htpy-invertible-map s t → s = t eq-htpy-invertible-map s t = map-inv-equiv (extensionality-invertible-map s t) ``` ### If the domains are `k`-truncated, then the type of inverses is `k`-truncated ```agda module _ {l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : UU l2} where is-trunc-is-inverse : (f : A → B) (g : B → A) → is-trunc (succ-𝕋 k) A → is-trunc (succ-𝕋 k) B → is-trunc k (is-inverse f g) is-trunc-is-inverse f g is-trunc-A is-trunc-B = is-trunc-product k ( is-trunc-Π k (λ x → is-trunc-B (f (g x)) x)) ( is-trunc-Π k (λ x → is-trunc-A (g (f x)) x)) is-trunc-is-invertible : (f : A → B) → is-trunc k A → is-trunc (succ-𝕋 k) B → is-trunc k (is-invertible f) is-trunc-is-invertible f is-trunc-A is-trunc-B = is-trunc-Σ ( is-trunc-function-type k is-trunc-A) ( λ g → is-trunc-is-inverse f g ( is-trunc-succ-is-trunc k is-trunc-A) ( is-trunc-B)) is-trunc-invertible-map : is-trunc k A → is-trunc k B → is-trunc k (invertible-map A B) is-trunc-invertible-map is-trunc-A is-trunc-B = is-trunc-Σ ( is-trunc-function-type k is-trunc-B) ( λ f → is-trunc-is-invertible f ( is-trunc-A) ( is-trunc-succ-is-trunc k is-trunc-B)) ``` ### The type `is-invertible id` is equivalent to `id ~ id` ```agda is-invertible-id-htpy-id-id : {l : Level} (A : UU l) → (id {A = A} ~ id {A = A}) → is-invertible (id {A = A}) pr1 (is-invertible-id-htpy-id-id A H) = id pr1 (pr2 (is-invertible-id-htpy-id-id A H)) = refl-htpy pr2 (pr2 (is-invertible-id-htpy-id-id A H)) = H triangle-is-invertible-id-htpy-id-id : {l : Level} (A : UU l) → ( is-invertible-id-htpy-id-id A) ~ ( ( map-associative-Σ ( A → A) ( λ g → (id ∘ g) ~ id) ( λ s → (pr1 s ∘ id) ~ id)) ∘ ( map-inv-left-unit-law-Σ-is-contr { B = λ s → (pr1 s ∘ id) ~ id} ( is-contr-section-is-equiv (is-equiv-id {_} {A})) ( pair id refl-htpy))) triangle-is-invertible-id-htpy-id-id A H = refl abstract is-equiv-is-invertible-id-htpy-id-id : {l : Level} (A : UU l) → is-equiv (is-invertible-id-htpy-id-id A) is-equiv-is-invertible-id-htpy-id-id A = is-equiv-left-map-triangle ( is-invertible-id-htpy-id-id A) ( map-associative-Σ ( A → A) ( λ g → (id ∘ g) ~ id) ( λ s → (pr1 s ∘ id) ~ id)) ( map-inv-left-unit-law-Σ-is-contr ( is-contr-section-is-equiv is-equiv-id) ( pair id refl-htpy)) ( triangle-is-invertible-id-htpy-id-id A) ( is-equiv-map-inv-left-unit-law-Σ-is-contr ( is-contr-section-is-equiv is-equiv-id) ( pair id refl-htpy)) ( is-equiv-map-associative-Σ _ _ _) ``` ### The type of invertible maps is equivalent to the type of free loops on equivalences #### The type of invertible equivalences is equivalent to the type of invertible maps **Proof:** Since every invertible map is an equivalence, the `Σ`-type of invertible maps which are equivalences forms a full subtype of the type of invertible maps. Swapping the order of `Σ`-types then shows that the `Σ`-type of invertible maps which are equivalences is equivalent to the `Σ`-type of equivalences which are invertible. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where is-equiv-prop-is-invertible : (invertible-map A B) → Prop (l1 ⊔ l2) is-equiv-prop-is-invertible = is-equiv-Prop ∘ map-invertible-map is-full-subtype-is-equiv-prop-is-invertible : is-full-subtype is-equiv-prop-is-invertible is-full-subtype-is-equiv-prop-is-invertible = is-equiv-is-invertible' ∘ is-invertible-map-invertible-map equiv-invertible-equivalence-invertible-map : Σ (A ≃ B) (is-invertible ∘ map-equiv) ≃ invertible-map A B equiv-invertible-equivalence-invertible-map = ( equiv-inclusion-is-full-subtype ( is-equiv-prop-is-invertible) ( is-full-subtype-is-equiv-prop-is-invertible)) ∘e ( equiv-right-swap-Σ) ``` #### The type of free loops on equivalences is equivalent to the type of invertible equivalences **Proof:** First, associating the order of `Σ`-types shows that a function being invertible is equivalent to it having a section, such that this section is also its retraction. Now, since equivalences have a contractible type of sections, a proof of invertibility of the underlying map `f` of an equivalence contracts to just a single homotopy `g ∘ f ~ id`, showing that a section `g` of `f` is also its retraction. As `g` is a section, composing on the left with `f` and canceling `f ∘ g` yields a loop `f ~ f`. By equivalence extensionality, this loop may be lifted to a loop on the entire equivalence. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where equiv-is-retraction-section-is-invertible : (f : A → B) → Σ (section f) (λ g → (map-section f g) ∘ f ~ id) ≃ is-invertible f equiv-is-retraction-section-is-invertible f = associative-Σ ( B → A) ( λ g → f ∘ g ~ id) ( λ g → (map-section f g) ∘ f ~ id) equiv-free-loop-equivalence-invertible-equivalence : free-loop (A ≃ B) ≃ Σ (A ≃ B) (is-invertible ∘ map-equiv) equiv-free-loop-equivalence-invertible-equivalence = ( equiv-tot ( equiv-is-retraction-section-is-invertible ∘ map-equiv)) ∘e ( equiv-tot ( λ f → ( inv-left-unit-law-Σ-is-contr ( is-contr-section-is-equiv (is-equiv-map-equiv f)) ( section-is-equiv (is-equiv-map-equiv f))) ∘e ( inv-equiv ( equiv-htpy-postcomp-htpy ( f) ( map-section-is-equiv (is-equiv-map-equiv f) ∘ map-equiv f) ( id))) ∘e ( equiv-concat-htpy ( is-section-map-section-map-equiv f ·r map-equiv f) ( map-equiv f)))) ∘e ( equiv-tot (λ f → extensionality-equiv f f)) ``` #### The equivalence ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where equiv-free-loop-equivalence-invertible-map : free-loop (A ≃ B) ≃ invertible-map A B equiv-free-loop-equivalence-invertible-map = equiv-invertible-equivalence-invertible-map ∘e equiv-free-loop-equivalence-invertible-equivalence ``` ### The action of invertible maps on identifications is invertible ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-invertible f) {x y : A} where is-invertible-ap-is-invertible : is-invertible (ap f {x} {y}) is-invertible-ap-is-invertible = is-invertible-ap-is-coherently-invertible ( is-coherently-invertible-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).