# The universal property of propositional truncations with respect to sets
```agda
module foundation.universal-property-propositional-truncation-into-sets 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.propositional-truncations
open import foundation.universe-levels
open import foundation.weakly-constant-maps
open import foundation-core.equivalences
open import foundation-core.fibers-of-maps
open import foundation-core.function-types
open import foundation-core.homotopies
open import foundation-core.identity-types
open import foundation-core.propositions
open import foundation-core.sets
open import foundation-core.subtypes
```
</details>
## Idea
The propositional truncation of `A` can be thought of as the quotient of `A` by
the full equivalence relation, i.e., the equivalence relation by which all
elements of `A` are considered to be equivalent. This idea leads to the
universal property of the propositional truncations with respect to sets.
## Definition
### The precomposition map that is used to state the universal property
```agda
is-weakly-constant-precomp-unit-trunc-Prop :
{l1 l2 : Level} {A : UU l1} {B : UU l2} (g : type-trunc-Prop A → B) →
is-weakly-constant (g ∘ unit-trunc-Prop)
is-weakly-constant-precomp-unit-trunc-Prop g x y =
ap
( g)
( eq-is-prop (is-prop-type-trunc-Prop))
precomp-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
(type-trunc-Prop A → type-Set B) → Σ (A → type-Set B) is-weakly-constant
pr1 (precomp-universal-property-set-quotient-trunc-Prop B g) =
g ∘ unit-trunc-Prop
pr2 (precomp-universal-property-set-quotient-trunc-Prop B g) =
is-weakly-constant-precomp-unit-trunc-Prop g
```
## Properties
### The image of the propositional truncation into a set is a proposition
```agda
abstract
all-elements-equal-image-is-weakly-constant :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
is-weakly-constant f →
all-elements-equal (Σ (type-Set B) (λ b → type-trunc-Prop (fiber f b)))
all-elements-equal-image-is-weakly-constant B f H (x , s) (y , t) =
eq-type-subtype
( λ b → trunc-Prop (fiber f b))
( apply-universal-property-trunc-Prop s
( Id-Prop B x y)
( λ u →
apply-universal-property-trunc-Prop t
( Id-Prop B x y)
( λ v → inv (pr2 u) ∙ H (pr1 u) (pr1 v) ∙ pr2 v)))
abstract
is-prop-image-is-weakly-constant :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
is-weakly-constant f →
is-prop (Σ (type-Set B) (λ b → type-trunc-Prop (fiber f b)))
is-prop-image-is-weakly-constant B f H =
is-prop-all-elements-equal
( all-elements-equal-image-is-weakly-constant B f H)
image-weakly-constant-map-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
is-weakly-constant f → Prop (l1 ⊔ l2)
pr1 (image-weakly-constant-map-Prop B f H) =
Σ (type-Set B) (λ b → type-trunc-Prop (fiber f b))
pr2 (image-weakly-constant-map-Prop B f H) =
is-prop-image-is-weakly-constant B f H
```
### The universal property
```agda
map-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
is-weakly-constant f → type-trunc-Prop A → type-Set B
map-universal-property-set-quotient-trunc-Prop B f H =
( pr1) ∘
( map-universal-property-trunc-Prop
( image-weakly-constant-map-Prop B f H)
( λ a → (f a , unit-trunc-Prop (a , refl))))
map-universal-property-set-quotient-trunc-Prop' :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
Σ (A → type-Set B) is-weakly-constant → type-trunc-Prop A → type-Set B
map-universal-property-set-quotient-trunc-Prop' B (f , H) =
map-universal-property-set-quotient-trunc-Prop B f H
abstract
htpy-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) (f : A → type-Set B) →
(H : is-weakly-constant f) →
map-universal-property-set-quotient-trunc-Prop B f H ∘ unit-trunc-Prop ~ f
htpy-universal-property-set-quotient-trunc-Prop B f H a =
ap
( pr1)
( eq-is-prop'
( is-prop-image-is-weakly-constant B f H)
( map-universal-property-trunc-Prop
( image-weakly-constant-map-Prop B f H)
( λ x → (f x , unit-trunc-Prop (x , refl)))
( unit-trunc-Prop a))
( f a , unit-trunc-Prop (a , refl)))
is-section-map-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
( ( precomp-universal-property-set-quotient-trunc-Prop {A = A} B) ∘
( map-universal-property-set-quotient-trunc-Prop' B)) ~ id
is-section-map-universal-property-set-quotient-trunc-Prop B (f , H) =
eq-type-subtype
( is-weakly-constant-prop-Set B)
( eq-htpy (htpy-universal-property-set-quotient-trunc-Prop B f H))
is-retraction-map-universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
( ( map-universal-property-set-quotient-trunc-Prop' B) ∘
( precomp-universal-property-set-quotient-trunc-Prop {A = A} B)) ~ id
is-retraction-map-universal-property-set-quotient-trunc-Prop B g =
eq-htpy
( ind-trunc-Prop
( λ x →
Id-Prop B
( map-universal-property-set-quotient-trunc-Prop' B
( precomp-universal-property-set-quotient-trunc-Prop B g)
( x))
( g x))
( htpy-universal-property-set-quotient-trunc-Prop B
( g ∘ unit-trunc-Prop)
( is-weakly-constant-precomp-unit-trunc-Prop g)))
universal-property-set-quotient-trunc-Prop :
{l1 l2 : Level} {A : UU l1} (B : Set l2) →
is-equiv (precomp-universal-property-set-quotient-trunc-Prop {A = A} B)
universal-property-set-quotient-trunc-Prop B =
is-equiv-is-invertible
( map-universal-property-set-quotient-trunc-Prop' B)
( is-section-map-universal-property-set-quotient-trunc-Prop B)
( is-retraction-map-universal-property-set-quotient-trunc-Prop B)
```