# Functoriality of propositional truncations ```agda module foundation.functoriality-propositional-truncation where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.function-extensionality open import foundation.logical-equivalences open import foundation.propositional-truncations open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.contractible-types open import foundation-core.equivalences open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.propositions ``` </details> ## Idea The universal property of propositional truncations can be used to define the functorial action of propositional truncations. ## Definition ```agda abstract unique-map-trunc-Prop : {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → is-contr ( Σ ( type-hom-Prop (trunc-Prop A) (trunc-Prop B)) ( λ h → (h ∘ unit-trunc-Prop) ~ (unit-trunc-Prop ∘ f))) unique-map-trunc-Prop {l1} {l2} {A} {B} f = universal-property-trunc-Prop A (trunc-Prop B) (unit-trunc-Prop ∘ f) abstract map-trunc-Prop : {l1 l2 : Level} {A : UU l1} {B : UU l2} → (A → B) → type-hom-Prop (trunc-Prop A) (trunc-Prop B) map-trunc-Prop f = pr1 (center (unique-map-trunc-Prop f)) ``` ## Properties ### Propositional truncations of homotopic maps are homotopic ```agda htpy-map-trunc-Prop : { l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → ( (map-trunc-Prop f) ∘ unit-trunc-Prop) ~ (unit-trunc-Prop ∘ f) htpy-map-trunc-Prop f = pr2 (center (unique-map-trunc-Prop f)) htpy-uniqueness-map-trunc-Prop : { l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) → ( h : type-hom-Prop (trunc-Prop A) (trunc-Prop B)) → ( ( h ∘ unit-trunc-Prop) ~ (unit-trunc-Prop ∘ f)) → (map-trunc-Prop f) ~ h htpy-uniqueness-map-trunc-Prop f h H = htpy-eq (ap pr1 (contraction (unique-map-trunc-Prop f) (pair h H))) ``` ### The propositional truncation of the identity map is the identity map ```agda abstract id-map-trunc-Prop : { l1 : Level} {A : UU l1} → map-trunc-Prop (id {A = A}) ~ id id-map-trunc-Prop {l1} {A} = htpy-uniqueness-map-trunc-Prop id id refl-htpy ``` ### The propositional truncation of a composite is the composite of the propositional truncations ```agda abstract preserves-comp-map-trunc-Prop : { l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} ( g : B → C) (f : A → B) → ( map-trunc-Prop (g ∘ f)) ~ ( (map-trunc-Prop g) ∘ (map-trunc-Prop f)) preserves-comp-map-trunc-Prop g f = htpy-uniqueness-map-trunc-Prop ( g ∘ f) ( (map-trunc-Prop g) ∘ (map-trunc-Prop f)) ( ( (map-trunc-Prop g) ·l (htpy-map-trunc-Prop f)) ∙h ( ( htpy-map-trunc-Prop g) ·r f)) ``` ### The functorial action of propositional truncations preserves equivalences ```agda abstract map-equiv-trunc-Prop : {l1 l2 : Level} {A : UU l1} {B : UU l2} → (A ≃ B) → type-trunc-Prop A → type-trunc-Prop B map-equiv-trunc-Prop e = map-trunc-Prop (map-equiv e) abstract map-inv-equiv-trunc-Prop : {l1 l2 : Level} {A : UU l1} {B : UU l2} → (A ≃ B) → type-trunc-Prop B → type-trunc-Prop A map-inv-equiv-trunc-Prop e = map-equiv-trunc-Prop (inv-equiv e) abstract equiv-trunc-Prop : {l1 l2 : Level} {A : UU l1} {B : UU l2} → (A ≃ B) → (type-trunc-Prop A ≃ type-trunc-Prop B) pr1 (equiv-trunc-Prop e) = map-equiv-trunc-Prop e pr2 (equiv-trunc-Prop e) = is-equiv-has-converse-is-prop ( is-prop-type-trunc-Prop) ( is-prop-type-trunc-Prop) ( map-inv-equiv-trunc-Prop e) ```