# The universal property of truncations
```agda
module foundation.universal-property-truncation where
open import foundation-core.universal-property-truncation public
```
<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.identity-types
open import foundation.propositional-truncations
open import foundation.surjective-maps
open import foundation.type-arithmetic-dependent-function-types
open import foundation.universal-property-dependent-pair-types
open import foundation.universal-property-identity-types
open import foundation.universe-levels
open import foundation-core.contractible-maps
open import foundation-core.equivalences
open import foundation-core.fibers-of-maps
open import foundation-core.functoriality-dependent-function-types
open import foundation-core.functoriality-dependent-pair-types
open import foundation-core.torsorial-type-families
open import foundation-core.truncated-types
open import foundation-core.truncation-levels
open import foundation-core.type-theoretic-principle-of-choice
```
</details>
## Properties
### A map `f : A → B` is a `k+1`-truncation if and only if it is surjective and `ap f : (x = y) → (f x = f y)` is a `k`-truncation for all `x y : A`
```agda
module _
{l1 l2 : Level} {k : 𝕋} {A : UU l1} (B : Truncated-Type l2 (succ-𝕋 k))
{f : A → type-Truncated-Type B} (H : is-surjective f)
( K :
(x y : A) → is-truncation (Id-Truncated-Type B (f x) (f y)) (ap f {x} {y}))
where
unique-extension-fiber-is-truncation-is-truncation-ap :
{l : Level} (C : Truncated-Type l (succ-𝕋 k))
(g : A → type-Truncated-Type C) (y : type-Truncated-Type B) →
is-contr
( Σ ( type-Truncated-Type C)
( λ z → (t : fiber f y) → g (pr1 t) = z))
unique-extension-fiber-is-truncation-is-truncation-ap C g =
apply-dependent-universal-property-surjection-is-surjective f H
( λ y → is-contr-Prop _)
( λ x →
is-contr-equiv
( Σ (type-Truncated-Type C) (λ z → g x = z))
( equiv-tot
( λ z →
( ( equiv-ev-refl' x) ∘e
( equiv-Π-equiv-family
( λ x' →
equiv-is-truncation
( Id-Truncated-Type B (f x') (f x))
( ap f)
( K x' x)
( Id-Truncated-Type C (g x') z)))) ∘e
( equiv-ev-pair)))
( is-torsorial-Id (g x)))
is-truncation-is-truncation-ap :
is-truncation B f
is-truncation-is-truncation-ap C =
is-equiv-is-contr-map
( λ g →
is-contr-equiv'
( (y : type-Truncated-Type B) →
Σ ( type-Truncated-Type C)
( λ z → (t : fiber f y) → (g (pr1 t) = z)))
( ( equiv-tot
( λ h →
( ( ( inv-equiv (equiv-funext)) ∘e
( equiv-Π-equiv-family
( λ x →
equiv-inv (g x) (h (f x)) ∘e equiv-ev-refl (f x)))) ∘e
( equiv-swap-Π)) ∘e
( equiv-Π-equiv-family (λ x → equiv-ev-pair)))) ∘e
( distributive-Π-Σ))
( is-contr-Π
( unique-extension-fiber-is-truncation-is-truncation-ap C g)))
module _
{l1 l2 : Level} {k : 𝕋} {A : UU l1} (B : Truncated-Type l2 (succ-𝕋 k))
{f : A → type-Truncated-Type B}
where
is-surjective-is-truncation :
is-truncation B f → is-surjective f
is-surjective-is-truncation H =
map-inv-is-equiv
( dependent-universal-property-truncation-is-truncation B f H
( λ y → truncated-type-trunc-Prop k (fiber f y)))
( λ x → unit-trunc-Prop (pair x refl))
```