# Truncations ```agda module foundation.truncations where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-functions open import foundation.contractible-types open import foundation.dependent-pair-types open import foundation.function-extensionality open import foundation.functoriality-dependent-function-types open import foundation.fundamental-theorem-of-identity-types open import foundation.identity-types open import foundation.truncated-types open import foundation.universal-property-dependent-pair-types open import foundation.universe-levels open import foundation.whiskering-homotopies-composition open import foundation-core.contractible-maps open import foundation-core.equality-dependent-pair-types open import foundation-core.equivalences open import foundation-core.fibers-of-maps open import foundation-core.function-types open import foundation-core.functoriality-dependent-pair-types open import foundation-core.homotopies open import foundation-core.propositions open import foundation-core.torsorial-type-families open import foundation-core.truncation-levels open import foundation-core.universal-property-truncation ``` </details> ## Idea We postulate the existence of truncations. ## Postulates ```agda postulate type-trunc : {l : Level} (k : 𝕋) → UU l → UU l postulate is-trunc-type-trunc : {l : Level} {k : 𝕋} {A : UU l} → is-trunc k (type-trunc k A) trunc : {l : Level} (k : 𝕋) → UU l → Truncated-Type l k pr1 (trunc k A) = type-trunc k A pr2 (trunc k A) = is-trunc-type-trunc postulate unit-trunc : {l : Level} {k : 𝕋} {A : UU l} → A → type-trunc k A postulate is-truncation-trunc : {l : Level} {k : 𝕋} {A : UU l} → is-truncation (trunc k A) unit-trunc equiv-universal-property-trunc : {l1 l2 : Level} {k : 𝕋} (A : UU l1) (B : Truncated-Type l2 k) → (type-trunc k A → type-Truncated-Type B) ≃ (A → type-Truncated-Type B) pr1 (equiv-universal-property-trunc A B) = precomp-Trunc unit-trunc B pr2 (equiv-universal-property-trunc A B) = is-truncation-trunc B ``` ## Properties ### The `n`-truncations satisfy the universal property of `n`-truncations ```agda universal-property-trunc : {l1 : Level} (k : 𝕋) (A : UU l1) → universal-property-truncation (trunc k A) unit-trunc universal-property-trunc k A = universal-property-truncation-is-truncation ( trunc k A) ( unit-trunc) ( is-truncation-trunc) module _ {l1 l2 : Level} {k : 𝕋} {A : UU l1} where apply-universal-property-trunc : (B : Truncated-Type l2 k) (f : A → type-Truncated-Type B) → Σ ( type-trunc k A → type-Truncated-Type B) ( λ h → h ∘ unit-trunc ~ f) apply-universal-property-trunc B f = center ( universal-property-truncation-is-truncation ( trunc k A) ( unit-trunc) ( is-truncation-trunc) ( B) ( f)) map-universal-property-trunc : (B : Truncated-Type l2 k) → (A → type-Truncated-Type B) → type-trunc k A → type-Truncated-Type B map-universal-property-trunc B f = pr1 (apply-universal-property-trunc B f) triangle-universal-property-trunc : (B : Truncated-Type l2 k) (f : A → type-Truncated-Type B) → map-universal-property-trunc B f ∘ unit-trunc ~ f triangle-universal-property-trunc B f = pr2 (apply-universal-property-trunc B f) ``` ### The `n`-truncations satisfy the dependent universal property of `n`-truncations ```agda module _ {l1 : Level} {k : 𝕋} {A : UU l1} where dependent-universal-property-trunc : dependent-universal-property-truncation (trunc k A) unit-trunc dependent-universal-property-trunc = dependent-universal-property-truncation-is-truncation ( trunc k A) ( unit-trunc) ( is-truncation-trunc) equiv-dependent-universal-property-trunc : {l2 : Level} (B : type-trunc k A → Truncated-Type l2 k) → ((x : type-trunc k A) → type-Truncated-Type (B x)) ≃ ((a : A) → type-Truncated-Type (B (unit-trunc a))) pr1 (equiv-dependent-universal-property-trunc B) = precomp-Π-Truncated-Type unit-trunc B pr2 (equiv-dependent-universal-property-trunc B) = dependent-universal-property-trunc B unique-dependent-function-trunc : {l2 : Level} (B : type-trunc k A → Truncated-Type l2 k) (f : (x : A) → type-Truncated-Type (B (unit-trunc x))) → is-contr ( Σ ( (x : type-trunc k A) → type-Truncated-Type (B x)) ( λ h → (h ∘ unit-trunc) ~ f)) unique-dependent-function-trunc B f = is-contr-equiv' ( fiber (precomp-Π-Truncated-Type unit-trunc B) f) ( equiv-tot ( λ h → equiv-funext)) ( is-contr-map-is-equiv ( dependent-universal-property-trunc B) ( f)) apply-dependent-universal-property-trunc : {l2 : Level} (B : type-trunc k A → Truncated-Type l2 k) → (f : (x : A) → type-Truncated-Type (B (unit-trunc x))) → Σ ( (x : type-trunc k A) → type-Truncated-Type (B x)) ( λ h → (h ∘ unit-trunc) ~ f) apply-dependent-universal-property-trunc B f = center (unique-dependent-function-trunc B f) function-dependent-universal-property-trunc : {l2 : Level} (B : type-trunc k A → Truncated-Type l2 k) → (f : (x : A) → type-Truncated-Type (B (unit-trunc x))) → (x : type-trunc k A) → type-Truncated-Type (B x) function-dependent-universal-property-trunc B f = pr1 (apply-dependent-universal-property-trunc B f) htpy-dependent-universal-property-trunc : {l2 : Level} (B : type-trunc k A → Truncated-Type l2 k) → (f : (x : A) → type-Truncated-Type (B (unit-trunc x))) → ( function-dependent-universal-property-trunc B f ∘ unit-trunc) ~ f htpy-dependent-universal-property-trunc B f = pr2 (apply-dependent-universal-property-trunc B f) ``` ### Families of `k`-truncated-types over `k+1`-truncations of types ```agda unique-truncated-fam-trunc : {l1 l2 : Level} {k : 𝕋} {A : UU l1} → (B : A → Truncated-Type l2 k) → is-contr ( Σ ( type-trunc (succ-𝕋 k) A → Truncated-Type l2 k) ( λ C → (x : A) → type-equiv-Truncated-Type (B x) (C (unit-trunc x)))) unique-truncated-fam-trunc {l1} {l2} {k} {A} B = is-contr-equiv' ( Σ ( type-trunc (succ-𝕋 k) A → Truncated-Type l2 k) ( λ C → (C ∘ unit-trunc) ~ B)) ( equiv-tot ( λ C → equiv-Π-equiv-family ( λ x → ( extensionality-Truncated-Type (B x) (C (unit-trunc x))) ∘e ( equiv-inv (C (unit-trunc x)) (B x))))) ( universal-property-trunc ( succ-𝕋 k) ( A) ( Truncated-Type-Truncated-Type l2 k) ( B)) module _ {l1 l2 : Level} {k : 𝕋} {A : UU l1} (B : A → Truncated-Type l2 k) where truncated-fam-trunc : type-trunc (succ-𝕋 k) A → Truncated-Type l2 k truncated-fam-trunc = pr1 (center (unique-truncated-fam-trunc B)) fam-trunc : type-trunc (succ-𝕋 k) A → UU l2 fam-trunc = type-Truncated-Type ∘ truncated-fam-trunc compute-truncated-fam-trunc : (x : A) → type-equiv-Truncated-Type (B x) (truncated-fam-trunc (unit-trunc x)) compute-truncated-fam-trunc = pr2 (center (unique-truncated-fam-trunc B)) map-compute-truncated-fam-trunc : (x : A) → type-Truncated-Type (B x) → (fam-trunc (unit-trunc x)) map-compute-truncated-fam-trunc x = map-equiv (compute-truncated-fam-trunc x) total-truncated-fam-trunc : UU (l1 ⊔ l2) total-truncated-fam-trunc = Σ (type-trunc (succ-𝕋 k) A) fam-trunc module _ {l1 l2 l3 : Level} {k : 𝕋} {A : UU l1} (B : A → Truncated-Type l2 k) ( C : total-truncated-fam-trunc B → Truncated-Type l3 k) ( f : ( x : A) ( y : type-Truncated-Type (B x)) → type-Truncated-Type ( C (unit-trunc x , map-equiv (compute-truncated-fam-trunc B x) y))) where dependent-universal-property-total-truncated-fam-trunc : is-contr ( Σ ( (t : total-truncated-fam-trunc B) → type-Truncated-Type (C t)) ( λ h → (x : A) (y : type-Truncated-Type (B x)) → Id ( h (unit-trunc x , map-compute-truncated-fam-trunc B x y)) ( f x y))) dependent-universal-property-total-truncated-fam-trunc = is-contr-equiv _ ( equiv-Σ ( λ g → (x : A) → Id ( g (unit-trunc x)) ( map-equiv-Π ( λ u → type-Truncated-Type (C (unit-trunc x , u))) ( compute-truncated-fam-trunc B x) ( λ u → id-equiv) ( f x))) ( equiv-ev-pair) ( λ g → equiv-Π-equiv-family ( λ x → ( inv-equiv equiv-funext) ∘e ( equiv-Π ( λ y → Id ( g (unit-trunc x , y)) ( map-equiv-Π ( λ u → type-Truncated-Type (C (unit-trunc x , u))) ( compute-truncated-fam-trunc B x) ( λ u → id-equiv) ( f x) ( y))) ( compute-truncated-fam-trunc B x) ( λ y → equiv-concat' ( g (unit-trunc x , map-compute-truncated-fam-trunc B x y)) ( inv ( compute-map-equiv-Π ( λ u → type-Truncated-Type (C (unit-trunc x , u))) ( compute-truncated-fam-trunc B x) ( λ y → id-equiv) ( f x) ( y)))))))) ( unique-dependent-function-trunc ( λ y → truncated-type-succ-Truncated-Type k ( Π-Truncated-Type k ( truncated-fam-trunc B y) ( λ u → C (y , u)))) ( λ y → map-equiv-Π ( λ u → type-Truncated-Type (C (unit-trunc y , u))) ( compute-truncated-fam-trunc B y) ( λ u → id-equiv) ( f y))) function-dependent-universal-property-total-truncated-fam-trunc : (t : total-truncated-fam-trunc B) → type-Truncated-Type (C t) function-dependent-universal-property-total-truncated-fam-trunc = pr1 (center dependent-universal-property-total-truncated-fam-trunc) htpy-dependent-universal-property-total-truncated-fam-trunc : (x : A) (y : type-Truncated-Type (B x)) → Id ( function-dependent-universal-property-total-truncated-fam-trunc ( unit-trunc x , map-compute-truncated-fam-trunc B x y)) ( f x y) htpy-dependent-universal-property-total-truncated-fam-trunc = pr2 (center dependent-universal-property-total-truncated-fam-trunc) ``` ### An `n`-truncated type is equivalent to its `n`-truncation ```agda module _ {l : Level} {k : 𝕋} (A : Truncated-Type l k) where map-inv-unit-trunc : type-trunc k (type-Truncated-Type A) → type-Truncated-Type A map-inv-unit-trunc = map-universal-property-trunc A id is-retraction-map-inv-unit-trunc : ( map-inv-unit-trunc ∘ unit-trunc) ~ id is-retraction-map-inv-unit-trunc = triangle-universal-property-trunc A id is-section-map-inv-unit-trunc : ( unit-trunc ∘ map-inv-unit-trunc) ~ id is-section-map-inv-unit-trunc = htpy-eq ( pr1 ( pair-eq-Σ ( eq-is-prop' ( is-trunc-succ-is-trunc ( neg-two-𝕋) ( universal-property-trunc ( k) ( type-Truncated-Type A) ( trunc k (type-Truncated-Type A)) ( unit-trunc))) ( unit-trunc ∘ map-inv-unit-trunc , unit-trunc ·l is-retraction-map-inv-unit-trunc) ( id , refl-htpy)))) is-equiv-unit-trunc : is-equiv unit-trunc is-equiv-unit-trunc = is-equiv-is-invertible map-inv-unit-trunc is-section-map-inv-unit-trunc is-retraction-map-inv-unit-trunc equiv-unit-trunc : type-Truncated-Type A ≃ type-trunc k (type-Truncated-Type A) pr1 equiv-unit-trunc = unit-trunc pr2 equiv-unit-trunc = is-equiv-unit-trunc ``` ### A contractible type is equivalent to its `k`-truncation ```agda module _ {l : Level} (k : 𝕋) (A : UU l) where is-equiv-unit-trunc-is-contr : is-contr A → is-equiv unit-trunc is-equiv-unit-trunc-is-contr c = is-equiv-unit-trunc (A , is-trunc-is-contr k c) ``` ### Truncation is idempotent ```agda module _ {l : Level} (k : 𝕋) (A : UU l) where idempotent-trunc : type-trunc k (type-trunc k A) ≃ type-trunc k A idempotent-trunc = inv-equiv (equiv-unit-trunc (trunc k A)) ``` ### Characterization of the identity types of truncations ```agda module _ {l : Level} (k : 𝕋) {A : UU l} (a : A) where Eq-trunc-Truncated-Type : type-trunc (succ-𝕋 k) A → Truncated-Type l k Eq-trunc-Truncated-Type = truncated-fam-trunc (λ y → trunc k (a = y)) Eq-trunc : type-trunc (succ-𝕋 k) A → UU l Eq-trunc x = type-Truncated-Type (Eq-trunc-Truncated-Type x) compute-Eq-trunc : (x : A) → type-trunc k (a = x) ≃ Eq-trunc (unit-trunc x) compute-Eq-trunc = compute-truncated-fam-trunc (λ y → trunc k (a = y)) map-compute-Eq-trunc : (x : A) → type-trunc k (a = x) → Eq-trunc (unit-trunc x) map-compute-Eq-trunc x = map-equiv (compute-Eq-trunc x) refl-Eq-trunc : Eq-trunc (unit-trunc a) refl-Eq-trunc = map-compute-Eq-trunc a (unit-trunc refl) refl-compute-Eq-trunc : map-compute-Eq-trunc a (unit-trunc refl) = refl-Eq-trunc refl-compute-Eq-trunc = refl is-torsorial-Eq-trunc : is-torsorial Eq-trunc pr1 (pr1 is-torsorial-Eq-trunc) = unit-trunc a pr2 (pr1 is-torsorial-Eq-trunc) = refl-Eq-trunc pr2 is-torsorial-Eq-trunc = function-dependent-universal-property-total-truncated-fam-trunc ( λ y → trunc k (a = y)) ( Id-Truncated-Type ( Σ-Truncated-Type ( trunc (succ-𝕋 k) A) ( λ b → truncated-type-succ-Truncated-Type k ( Eq-trunc-Truncated-Type b))) ( unit-trunc a , refl-Eq-trunc)) ( λ y → function-dependent-universal-property-trunc ( λ q → Id-Truncated-Type ( Σ-Truncated-Type ( trunc (succ-𝕋 k) A) ( λ y → truncated-type-succ-Truncated-Type k ( Eq-trunc-Truncated-Type y))) ( unit-trunc a , refl-Eq-trunc) ( unit-trunc y , map-compute-Eq-trunc y q)) ( r y)) where r : (y : A) (p : a = y) → Id { A = Σ (type-trunc (succ-𝕋 k) A) Eq-trunc} ( unit-trunc a , refl-Eq-trunc) ( unit-trunc y , (map-compute-Eq-trunc y (unit-trunc p))) r .a refl = refl Eq-eq-trunc : (x : type-trunc (succ-𝕋 k) A) → (unit-trunc a = x) → Eq-trunc x Eq-eq-trunc .(unit-trunc a) refl = refl-Eq-trunc is-equiv-Eq-eq-trunc : (x : type-trunc (succ-𝕋 k) A) → is-equiv (Eq-eq-trunc x) is-equiv-Eq-eq-trunc = fundamental-theorem-id ( is-torsorial-Eq-trunc) ( Eq-eq-trunc) extensionality-trunc : (x : type-trunc (succ-𝕋 k) A) → (unit-trunc a = x) ≃ Eq-trunc x pr1 (extensionality-trunc x) = Eq-eq-trunc x pr2 (extensionality-trunc x) = is-equiv-Eq-eq-trunc x effectiveness-trunc : (x : A) → type-trunc k (a = x) ≃ (unit-trunc {k = succ-𝕋 k} a = unit-trunc x) effectiveness-trunc x = inv-equiv (extensionality-trunc (unit-trunc x)) ∘e compute-Eq-trunc x map-effectiveness-trunc : (x : A) → type-trunc k (a = x) → (unit-trunc {k = succ-𝕋 k} a = unit-trunc x) map-effectiveness-trunc x = map-equiv (effectiveness-trunc x) refl-effectiveness-trunc : map-effectiveness-trunc a (unit-trunc refl) = refl refl-effectiveness-trunc = is-retraction-map-inv-equiv (extensionality-trunc (unit-trunc a)) refl ``` ### Truncations of Σ-types ```agda module _ {l1 l2 : Level} (k : 𝕋) {A : UU l1} {B : A → UU l2} where map-trunc-Σ : type-trunc k (Σ A B) → type-trunc k (Σ A (λ x → type-trunc k (B x))) map-trunc-Σ = map-universal-property-trunc ( trunc k (Σ A (λ x → type-trunc k (B x)))) ( λ (a , b) → unit-trunc (a , unit-trunc b)) map-inv-trunc-Σ : type-trunc k (Σ A (λ x → type-trunc k (B x))) → type-trunc k (Σ A B) map-inv-trunc-Σ = map-universal-property-trunc ( trunc k (Σ A B)) ( λ (a , |b|) → map-universal-property-trunc ( trunc k (Σ A B)) ( λ b → unit-trunc (a , b)) ( |b|)) is-retraction-map-inv-trunc-Σ : ( map-inv-trunc-Σ ∘ map-trunc-Σ) ~ id is-retraction-map-inv-trunc-Σ = function-dependent-universal-property-trunc ( λ |ab| → Id-Truncated-Type' ( trunc k (Σ A B)) ( map-inv-trunc-Σ (map-trunc-Σ |ab|)) ( |ab|)) ( λ (a , b) → ( ap ( map-inv-trunc-Σ) ( triangle-universal-property-trunc _ ( λ (a' , b') → unit-trunc (a' , unit-trunc b')) ( a , b))) ∙ ( triangle-universal-property-trunc _ ( λ (a' , |b'|) → map-universal-property-trunc ( trunc k (Σ A B)) ( λ b' → unit-trunc (a' , b')) ( |b'|)) ( a , unit-trunc b) ∙ triangle-universal-property-trunc _ ( λ b' → unit-trunc (a , b')) ( b))) is-section-map-inv-trunc-Σ : ( map-trunc-Σ ∘ map-inv-trunc-Σ) ~ id is-section-map-inv-trunc-Σ = function-dependent-universal-property-trunc ( λ |a|b|| → Id-Truncated-Type' ( trunc k (Σ A (λ x → type-trunc k (B x)))) ( map-trunc-Σ (map-inv-trunc-Σ |a|b||)) ( |a|b||)) ( λ (a , |b|) → function-dependent-universal-property-trunc (λ |b'| → Id-Truncated-Type' ( trunc k (Σ A (λ x → type-trunc k (B x)))) (map-trunc-Σ (map-inv-trunc-Σ (unit-trunc (a , |b'|)))) (unit-trunc (a , |b'|))) (λ b → ap map-trunc-Σ (triangle-universal-property-trunc _ ( λ (a' , |b'|) → map-universal-property-trunc ( trunc k (Σ A B)) ( λ b' → unit-trunc (a' , b')) ( |b'|)) ( a , unit-trunc b)) ∙ (ap map-trunc-Σ (triangle-universal-property-trunc ( trunc k (Σ A B)) ( λ b' → unit-trunc (a , b')) ( b)) ∙ triangle-universal-property-trunc _ ( λ (a' , b') → unit-trunc (a' , unit-trunc b')) ( a , b))) ( |b|)) equiv-trunc-Σ : type-trunc k (Σ A B) ≃ type-trunc k (Σ A (λ x → type-trunc k (B x))) pr1 equiv-trunc-Σ = map-trunc-Σ pr2 equiv-trunc-Σ = is-equiv-is-invertible map-inv-trunc-Σ is-section-map-inv-trunc-Σ is-retraction-map-inv-trunc-Σ inv-equiv-trunc-Σ : type-trunc k (Σ A (λ x → type-trunc k (B x))) ≃ type-trunc k (Σ A B) pr1 inv-equiv-trunc-Σ = map-inv-trunc-Σ pr2 inv-equiv-trunc-Σ = is-equiv-is-invertible map-trunc-Σ is-retraction-map-inv-trunc-Σ is-section-map-inv-trunc-Σ ```