# Precomposition of dependent functions ```agda module foundation.precomposition-dependent-functions where open import foundation-core.precomposition-dependent-functions public ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.dependent-universal-property-equivalences open import foundation.function-extensionality open import foundation.universe-levels open import foundation-core.commuting-squares-of-maps open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.truncated-maps open import foundation-core.truncation-levels ``` </details> ## Properties ### Equivalences induce an equivalence from the type of homotopies between two dependent functions to the type of homotopies between their precomposites ```agda module _ { l1 l2 l3 : Level} {A : UU l1} where equiv-htpy-precomp-htpy-Π : {B : UU l2} {C : B → UU l3} (f g : (b : B) → C b) (e : A ≃ B) → (f ~ g) ≃ (f ∘ map-equiv e ~ g ∘ map-equiv e) equiv-htpy-precomp-htpy-Π f g e = equiv-precomp-Π e (eq-value f g) ``` ### The action on identifications of precomposition of dependent functions Consider a map `f : A → B` and two dependent functions `g h : (x : B) → C x`. Then the square ```text ap (precomp-Π f C) (g = h) ---------------------------> (g ∘ f = h ∘ f) | | htpy-eq | | htpy-eq ∨ ∨ (g ~ h) ----------------------------> (g ∘ f ~ h ∘ f) precomp-Π f (eq-value g h) ``` [commutes](foundation-core.commuting-squares-of-maps.md). Similarly, the map `ap (precomp-Π f C)` fits in a commuting square ```text precomp-Π f (eq-value g h) (g ~ h) ----------------------------> (g ∘ f ~ h ∘ f) | | eq-htpy | | eq-htpy ∨ ∨ (g = h) ---------------------------> (g ∘ f = h ∘ f). ap (precomp-Π f C) ``` ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} (f : A → B) {C : B → UU l3} {g h : (b : B) → C b} where compute-htpy-eq-ap-precomp-Π : coherence-square-maps ( ap (precomp-Π f C) {g} {h}) ( htpy-eq) ( htpy-eq) ( precomp-Π f (eq-value g h)) compute-htpy-eq-ap-precomp-Π refl = refl compute-eq-htpy-ap-precomp-Π : coherence-square-maps ( precomp-Π f (eq-value g h)) ( eq-htpy) ( eq-htpy) ( ap (precomp-Π f C) {g} {h}) compute-eq-htpy-ap-precomp-Π = vertical-inv-equiv-coherence-square-maps ( ap (precomp-Π f C)) ( equiv-funext) ( equiv-funext) ( precomp-Π f (eq-value g h)) ( compute-htpy-eq-ap-precomp-Π) ``` ### Precomposing functions `Π B C` by `f : A → B` is `k+1`-truncated if and only if precomposing homotopies is `k`-truncated ```agda is-trunc-map-succ-precomp-Π : {l1 l2 l3 : Level} {k : 𝕋} {A : UU l1} {B : UU l2} {f : A → B} {C : B → UU l3} → ((g h : (b : B) → C b) → is-trunc-map k (precomp-Π f (eq-value g h))) → is-trunc-map (succ-𝕋 k) (precomp-Π f C) is-trunc-map-succ-precomp-Π {k = k} {f = f} {C = C} H = is-trunc-map-is-trunc-map-ap k (precomp-Π f C) ( λ g h → is-trunc-map-top-is-trunc-map-bottom-is-equiv k ( ap (precomp-Π f C)) ( htpy-eq) ( htpy-eq) ( precomp-Π f (eq-value g h)) ( compute-htpy-eq-ap-precomp-Π f) ( funext g h) ( funext (g ∘ f) (h ∘ f)) ( H g h)) ```