# Transposing identifications along equivalences ```agda module foundation.transposition-identifications-along-equivalences where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.commuting-triangles-of-identifications open import foundation.dependent-pair-types open import foundation.identity-types open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation.whiskering-identifications-concatenation open import foundation-core.equivalences open import foundation-core.homotopies ``` </details> ## Idea Consider an [equivalence](foundation-core.equivalences.md) `e : A ≃ B` and two elements `x : A` and `y : B`. The {{#concept "transposition" Disambiguation="identifications along equivalences" Agda=eq-transpose-equiv}} is an equivalence ```text (e x = y) ≃ (x = e⁻¹ y) ``` of [identity types](foundation-core.identity-types.md). There are two ways of constructing this equivalence. One way uses the fact that `e⁻¹` is a [section](foundation-core.sections.md) of `e`, from which it follows that ```text (e x = y) ≃ (e x = e e⁻¹ y) ≃ (x = e⁻¹ y). ``` In other words, the transpose of an identification `p : e x = y` along `e` is the unique identification `q : x = e⁻¹ y` equipped with an identification witnessing that the triangle ```text ap e q e x ------> e (e⁻¹ y) \ / p \ / is-section-map-inv-equiv e y \ / ∨ ∨ y ``` commutes. The other way uses the fact that `e⁻¹` is a [retraction](foundation-core.retractions.md) of `e`, resulting in the equivalence ```text (e x = y) ≃ (e⁻¹ e x = e⁻¹ y) ≃ (x = e⁻¹ y) . ``` These two equivalences are [homotopic](foundation-core.homotopies.md), as is shown below. ## Definitions ### Transposing equalities along equivalences ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) where eq-transpose-equiv : (x : A) (y : B) → (map-equiv e x = y) ≃ (x = map-inv-equiv e y) eq-transpose-equiv x y = ( inv-equiv (equiv-ap e x (map-inv-equiv e y))) ∘e ( equiv-concat' ( map-equiv e x) ( inv (is-section-map-inv-equiv e y))) map-eq-transpose-equiv : {x : A} {y : B} → map-equiv e x = y → x = map-inv-equiv e y map-eq-transpose-equiv {x} {y} = map-equiv (eq-transpose-equiv x y) map-inv-eq-transpose-equiv : {x : A} {y : B} → x = map-inv-equiv e y → map-equiv e x = y map-inv-eq-transpose-equiv {x} {y} = map-inv-equiv (eq-transpose-equiv x y) eq-transpose-equiv' : (x : A) (y : B) → (map-equiv e x = y) ≃ (x = map-inv-equiv e y) eq-transpose-equiv' x y = ( equiv-concat ( inv (is-retraction-map-inv-equiv e x)) ( map-inv-equiv e y)) ∘e ( equiv-ap (inv-equiv e) (map-equiv e x) y) map-eq-transpose-equiv' : {x : A} {y : B} → map-equiv e x = y → x = map-inv-equiv e y map-eq-transpose-equiv' {x} {y} = map-equiv (eq-transpose-equiv' x y) ``` ### Transposing identifications of reversed identity types along equivalences It is sometimes useful to consider identifications `y = e x` instead of `e x = y`, so we include an inverted equivalence for that as well. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) where eq-transpose-equiv-inv : (x : A) (y : B) → (y = map-equiv e x) ≃ (map-inv-equiv e y = x) eq-transpose-equiv-inv x y = ( inv-equiv (equiv-ap e _ _)) ∘e ( equiv-concat (is-section-map-inv-equiv e y) _) map-eq-transpose-equiv-inv : {a : A} {b : B} → b = map-equiv e a → map-inv-equiv e b = a map-eq-transpose-equiv-inv {a} {b} = map-equiv (eq-transpose-equiv-inv a b) map-inv-eq-transpose-equiv-inv : {a : A} {b : B} → map-inv-equiv e b = a → b = map-equiv e a map-inv-eq-transpose-equiv-inv {a} {b} = map-inv-equiv (eq-transpose-equiv-inv a b) ``` ## Properties ### Computing transposition of reflexivity along equivalences ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) where compute-refl-eq-transpose-equiv : {x : A} → map-eq-transpose-equiv e refl = inv (is-retraction-map-inv-equiv e x) compute-refl-eq-transpose-equiv = map-eq-transpose-equiv-inv ( equiv-ap e _ (map-inv-equiv e _)) ( ap inv (coherence-map-inv-equiv e _) ∙ inv (ap-inv (map-equiv e) _)) compute-refl-eq-transpose-equiv-inv : {x : A} → map-eq-transpose-equiv-inv e refl = is-retraction-map-inv-equiv e x compute-refl-eq-transpose-equiv-inv {x} = map-eq-transpose-equiv-inv ( equiv-ap e _ _) ( ( right-unit) ∙ ( coherence-map-inv-equiv e _)) ``` ### The two definitions of transposing identifications along equivalences are homotopic We begin by showing that the two equivalences stated above are homotopic. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) where compute-map-eq-transpose-equiv : {x : A} {y : B} → map-eq-transpose-equiv e {x} {y} ~ map-eq-transpose-equiv' e compute-map-eq-transpose-equiv {x} refl = ( map-eq-transpose-equiv-inv ( equiv-ap e x _) ( ( ap inv (coherence-map-inv-equiv e x)) ∙ ( inv (ap-inv (map-equiv e) (is-retraction-map-inv-equiv e x))))) ∙ ( inv right-unit) ``` ### The defining commuting triangles of transposed identifications Transposed identifications fit in [commuting triangles](foundation.commuting-triangles-of-identifications.md) with the original identifications. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) where triangle-eq-transpose-equiv : {x : A} {y : B} (p : map-equiv e x = y) → coherence-triangle-identifications' ( p) ( is-section-map-inv-equiv e y) ( ap (map-equiv e) (map-eq-transpose-equiv e p)) triangle-eq-transpose-equiv {x} {y} p = ( right-whisker-concat ( is-section-map-inv-equiv ( equiv-ap e x (map-inv-equiv e y)) ( p ∙ inv (is-section-map-inv-equiv e y))) ( is-section-map-inv-equiv e y)) ∙ ( is-section-inv-concat' (is-section-map-inv-equiv e y) p) triangle-eq-transpose-equiv-inv : {x : A} {y : B} (p : y = map-equiv e x) → coherence-triangle-identifications' ( ap (map-equiv e) (map-eq-transpose-equiv-inv e p)) ( p) ( is-section-map-inv-equiv e y) triangle-eq-transpose-equiv-inv {x} {y} p = inv ( is-section-map-inv-equiv ( equiv-ap e _ _) ( is-section-map-inv-equiv e y ∙ p)) triangle-eq-transpose-equiv' : {x : A} {y : B} (p : map-equiv e x = y) → coherence-triangle-identifications' ( ap (map-inv-equiv e) p) ( map-eq-transpose-equiv e p) ( is-retraction-map-inv-equiv e x) triangle-eq-transpose-equiv' {x} refl = ( left-whisker-concat ( is-retraction-map-inv-equiv e x) ( compute-map-eq-transpose-equiv e refl)) ∙ ( is-section-inv-concat (is-retraction-map-inv-equiv e x) refl) triangle-eq-transpose-equiv-inv' : {x : A} {y : B} (p : y = map-equiv e x) → coherence-triangle-identifications ( map-eq-transpose-equiv-inv e p) ( is-retraction-map-inv-equiv e x) ( ap (map-inv-equiv e) p) triangle-eq-transpose-equiv-inv' {x} refl = compute-refl-eq-transpose-equiv-inv e right-inverse-eq-transpose-equiv : {x : A} {y : B} (p : y = map-equiv e x) → ( ( map-eq-transpose-equiv e (inv p)) ∙ ( ap (map-inv-equiv e) p ∙ is-retraction-map-inv-equiv e x)) = ( refl) right-inverse-eq-transpose-equiv {x} refl = ( right-whisker-concat (compute-refl-eq-transpose-equiv e) _) ∙ ( left-inv (is-retraction-map-inv-equiv e _)) ``` ### Transposing concatenated identifications along equivalences Transposing concatenated identifications into a triangle with a transpose of the left factor. ```agda module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : A ≃ B) where triangle-eq-transpose-equiv-concat : {x : A} {y z : B} (p : map-equiv e x = y) (q : y = z) → ( map-eq-transpose-equiv e (p ∙ q)) = ( map-eq-transpose-equiv e p ∙ ap (map-inv-equiv e) q) triangle-eq-transpose-equiv-concat refl refl = inv right-unit ```