# The action on homotopies of functions ```agda module foundation.action-on-homotopies-functions where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-higher-identifications-functions open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.function-extensionality open import foundation.homotopy-induction open import foundation.universe-levels open import foundation-core.constant-maps open import foundation-core.contractible-types open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types ``` </details> ## Idea Applying the [action on identifications](foundation.action-on-identifications-functions.md) to [identifications](foundation-core.identity-types.md) arising from the [function extensionality axiom](foundation.function-extensionality.md) gives us the {{#concept "action on homotopies" Disambiguation="functions" Agda=action-htpy-function}}. For arbitrary functions of type ```text F : ((x : A) → B x) → C. ``` We thus get an action of type ```text f ~ g → F f = F g. ``` ## Definition ### The unique functorial action of functions on homotopies There is a unique action of functions on homotopies. Namely, by [homotopy induction](foundation.homotopy-induction.md), function homotopies satisfy [the dependent universal property of being an identity system](foundation.universal-property-identity-systems.md) on (dependent) function types. This means that for every type family ```text C : (g : (x : A) → B x) → f ~ g → 𝒰 ``` the map `ev-refl-htpy C` is an equivalence [equivalence](foundation-core.equivalences.md) ```text ev-refl-htpy C : ((g : (x : A) → B x) (H : f ~ g) → C g H) ≃ (C f refl-htpy). ``` In particular, applying this to type families of the form ```text g H ↦ F f = F g ``` with the mapping ```text f refl-htpy ↦ refl ``` shows that our action on homotopies is [unique](foundation-core.contractible-types.md). ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2} {C : UU l3} (F : ((x : A) → B x) → C) where abstract unique-action-htpy-function : (f : (x : A) → B x) → is-contr ( Σ ( (g : (x : A) → B x) → f ~ g → F f = F g) ( λ α → α f refl-htpy = refl)) unique-action-htpy-function f = is-contr-map-ev-refl-htpy (λ g _ → F f = F g) refl action-htpy-function : {f g : (x : A) → B x} → f ~ g → F f = F g action-htpy-function H = ap F (eq-htpy H) compute-action-htpy-function-refl-htpy : (f : (x : A) → B x) → action-htpy-function refl-htpy = refl compute-action-htpy-function-refl-htpy f = ap² F (eq-htpy-refl-htpy f) ``` ## Properties ### The action on homotopies preserves concatenation ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2} {C : UU l3} (F : ((x : A) → B x) → C) {f g h : (x : A) → B x} where distributive-action-htpy-function-concat-htpy : (H : f ~ g) (H' : g ~ h) → action-htpy-function F (H ∙h H') = action-htpy-function F H ∙ action-htpy-function F H' distributive-action-htpy-function-concat-htpy H H' = ap² F (eq-htpy-concat-htpy H H') ∙ ap-concat F (eq-htpy H) (eq-htpy H') ``` ### The action on homotopies preserves inverses ```agda module _ {l1 l2 l3 : Level} {A : UU l1} {B : A → UU l2} {C : UU l3} (F : ((x : A) → B x) → C) {f g : (x : A) → B x} where compute-action-htpy-function-inv-htpy : (H : f ~ g) → action-htpy-function F (inv-htpy H) = inv (action-htpy-function F H) compute-action-htpy-function-inv-htpy H = ap² F (compute-inv-eq-htpy H) ∙ ap-inv F (eq-htpy H) ```