# Transport along equivalences ```agda module foundation.transport-along-equivalences where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-equivalences-functions open import foundation.action-on-equivalences-type-families open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.equivalence-extensionality open import foundation.equivalence-induction open import foundation.equivalences open import foundation.function-extensionality open import foundation.transport-along-identifications open import foundation.univalence open import foundation.universe-levels open import foundation-core.commuting-triangles-of-maps open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.injective-maps open import foundation-core.retractions open import foundation-core.sections ``` </details> ## Idea Given a map between universes `f : 𝒰 → 𝒱`, applying [transport along identifications](foundation-core.transport-along-identifications.md) to [identifications](foundation-core.identity-types.md) arising from the [univalence axiom](foundation.univalence.md) gives us {{#concept "transport along equivalences" Agda=tr-equiv}}: ```text tr-equiv f : X ≃ Y → f X ≃ f Y. ``` Alternatively, we could apply the [action on identifications](foundation.action-on-identifications-functions.md) to get another [action on equivalences](foundation.action-on-equivalences-functions.md). However, by univalence such a map must also be unique, hence these two constructions coincide. ## Definitions ### Transporting along equivalences ```agda module _ {l1 l2 : Level} (f : UU l1 → UU l2) {X Y : UU l1} where map-tr-equiv : X ≃ Y → f X → f Y map-tr-equiv e = tr f (eq-equiv e) abstract is-equiv-map-tr-equiv : (e : X ≃ Y) → is-equiv (map-tr-equiv e) is-equiv-map-tr-equiv e = is-equiv-tr f (eq-equiv e) tr-equiv : X ≃ Y → f X ≃ f Y pr1 (tr-equiv e) = map-tr-equiv e pr2 (tr-equiv e) = is-equiv-map-tr-equiv e eq-tr-equiv : X ≃ Y → f X = f Y eq-tr-equiv = eq-equiv ∘ tr-equiv ``` ### Transporting along inverse equivalences ```agda module _ {l1 l2 : Level} (f : UU l1 → UU l2) {X Y : UU l1} where map-tr-inv-equiv : X ≃ Y → f Y → f X map-tr-inv-equiv e = tr f (eq-equiv (inv-equiv e)) abstract is-equiv-map-tr-inv-equiv : (e : X ≃ Y) → is-equiv (map-tr-inv-equiv e) is-equiv-map-tr-inv-equiv e = is-equiv-tr f (eq-equiv (inv-equiv e)) tr-inv-equiv : X ≃ Y → f Y ≃ f X pr1 (tr-inv-equiv e) = map-tr-inv-equiv e pr2 (tr-inv-equiv e) = is-equiv-map-tr-inv-equiv e eq-tr-inv-equiv : X ≃ Y → f Y = f X eq-tr-inv-equiv = eq-equiv ∘ tr-inv-equiv ``` ## Properties ### Transporting along `id-equiv` is the identity equivalence ```agda module _ {l1 l2 : Level} (f : UU l1 → UU l2) {X : UU l1} where compute-map-tr-equiv-id-equiv : map-tr-equiv f id-equiv = id compute-map-tr-equiv-id-equiv = ap (tr f) (compute-eq-equiv-id-equiv X) compute-tr-equiv-id-equiv : tr-equiv f id-equiv = id-equiv compute-tr-equiv-id-equiv = is-injective-map-equiv (ap (tr f) (compute-eq-equiv-id-equiv X)) ``` ### Transport along equivalences preserves composition of equivalences For any operation `f : 𝒰₁ → 𝒰₂` and any two composable equivalences `e : X ≃ Y` and `e' : Y ≃ Z` in `𝒰₁` we obtain a commuting triangle ```text tr-equiv f e f X ----------> f Y \ / tr-equiv f (e' ∘ e) \ / tr-equiv f e' \ / ∨ ∨ f Z ``` ```agda module _ {l1 l2 : Level} (f : UU l1 → UU l2) {X Y Z : UU l1} (e : X ≃ Y) (e' : Y ≃ Z) where distributive-map-tr-equiv-equiv-comp : coherence-triangle-maps ( map-tr-equiv f (e' ∘e e)) ( map-tr-equiv f e') ( map-tr-equiv f e) distributive-map-tr-equiv-equiv-comp x = ( inv (ap (λ p → tr f p x) (compute-eq-equiv-comp-equiv e e'))) ∙ ( tr-concat (eq-equiv e) (eq-equiv e') x) distributive-tr-equiv-equiv-comp : tr-equiv f (e' ∘e e) = tr-equiv f e' ∘e tr-equiv f e distributive-tr-equiv-equiv-comp = eq-htpy-equiv distributive-map-tr-equiv-equiv-comp ``` ### Transporting along an inverse equivalence is inverse to transporting along the original equivalence ```agda module _ {l1 l2 : Level} (f : UU l1 → UU l2) {X Y : UU l1} (e : X ≃ Y) where is-section-map-tr-inv-equiv : is-section (map-tr-equiv f e) (map-tr-equiv f (inv-equiv e)) is-section-map-tr-inv-equiv x = ( inv ( ap ( map-tr-equiv f e ∘ (λ p → tr f p x)) ( commutativity-inv-eq-equiv e))) ∙ ( is-section-inv-tr f (eq-equiv e) x) is-retraction-map-tr-inv-equiv : is-retraction (map-tr-equiv f e) (map-tr-equiv f (inv-equiv e)) is-retraction-map-tr-inv-equiv x = ( inv ( ap ( λ p → tr f p (map-tr-equiv f e x)) ( commutativity-inv-eq-equiv e))) ∙ ( is-retraction-inv-tr f (eq-equiv e) x) ``` ### Transposing transport along the inverse of an equivalence ```agda module _ {l1 l2 : Level} (f : UU l1 → UU l2) {X Y : UU l1} (e : X ≃ Y) {u : f X} {v : f Y} where eq-transpose-map-tr-equiv : v = map-tr-equiv f e u → map-tr-equiv f (inv-equiv e) v = u eq-transpose-map-tr-equiv p = ap (map-tr-equiv f (inv-equiv e)) p ∙ is-retraction-map-tr-inv-equiv f e u eq-transpose-map-tr-equiv' : map-tr-equiv f e u = v → u = map-tr-equiv f (inv-equiv e) v eq-transpose-map-tr-equiv' p = ( inv (is-retraction-map-tr-inv-equiv f e u)) ∙ ( ap (map-tr-equiv f (inv-equiv e)) p) ``` ### Substitution law for transport along equivalences ```agda module _ {l1 l2 l3 : Level} (g : UU l2 → UU l3) (f : UU l1 → UU l2) {X Y : UU l1} (e : X ≃ Y) where substitution-map-tr-equiv : map-tr-equiv g (action-equiv-family f e) ~ map-tr-equiv (g ∘ f) e substitution-map-tr-equiv X' = ( ap ( λ p → tr g p X') ( is-retraction-eq-equiv (action-equiv-function f e))) ∙ ( substitution-law-tr g f (eq-equiv e)) substitution-law-tr-equiv : tr-equiv g (action-equiv-family f e) = tr-equiv (g ∘ f) e substitution-law-tr-equiv = eq-htpy-equiv substitution-map-tr-equiv ``` ### Transporting along the action on equivalences of a function ```agda compute-map-tr-equiv-action-equiv-family : {l1 l2 l3 l4 : Level} {B : UU l1 → UU l2} {D : UU l3 → UU l4} (f : UU l1 → UU l3) (g : (X : UU l1) → B X → D (f X)) {X Y : UU l1} (e : X ≃ Y) (X' : B X) → map-tr-equiv D (action-equiv-family f e) (g X X') = g Y (map-tr-equiv B e X') compute-map-tr-equiv-action-equiv-family {D = D} f g {X} e X' = ( ap ( λ p → tr D p (g X X')) ( is-retraction-eq-equiv (action-equiv-function f e))) ∙ ( tr-ap f g (eq-equiv e) X') ``` ### Transport along equivalences and the action on equivalences in the universe coincide ```agda module _ {l1 l2 : Level} (f : UU l1 → UU l2) {X Y : UU l1} (e : X ≃ Y) where eq-tr-equiv-action-equiv-family : tr-equiv f e = action-equiv-family f e eq-tr-equiv-action-equiv-family = ind-equiv ( λ Y d → tr-equiv f d = action-equiv-family f d) ( compute-tr-equiv-id-equiv f ∙ inv (compute-action-equiv-family-id-equiv f)) ( e) eq-map-tr-equiv-map-action-equiv-family : map-tr-equiv f e = map-action-equiv-family f e eq-map-tr-equiv-map-action-equiv-family = ap map-equiv eq-tr-equiv-action-equiv-family ```