Tom de Jong, 4 & 5 April 2022.

Assuming set quotients, we derive propositional truncations in the
presence of function extensionality.

\begin{code}

{-# OPTIONS --safe --without-K #-}

module Quotient.GivesPropTrunc where

open import MLTT.Spartan

open import Quotient.Type

open import UF.FunExt
open import UF.PropTrunc
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.Subsingletons-Properties

module _ (sq : set-quotients-exist) where

 open general-set-quotients-exist sq

 private
  module _ {X : 𝓤 ̇ } where
   _≈_ : X  X  𝓤₀ ̇
   x  y = 𝟙
    : EqRel X
    = _≈_ ,  x y  𝟙-is-prop) ,  x  ) ,  x y _  ) ,  x y z _ _  )

  ∥_∥ : 𝓤 ̇  𝓤 ̇
  ∥_∥ X = X / 

  ∣_∣ : {X : 𝓤 ̇ }  X   X 
  ∣_∣ = η/ 

  ∥∥-is-prop : {X : 𝓤 ̇ }  funext 𝓤 𝓤  is-prop  X 
  ∥∥-is-prop {𝓤} {X} fe = /-induction   x'  Π-is-prop fe  y'  /-is-set ))
                            x  /-induction   y'  /-is-set )
                                   y  η/-identifies-related-points  ))

  ∥∥-rec : {X : 𝓤 ̇ } {P : 𝓥 ̇ }  is-prop P  (X  P)   X   P
  ∥∥-rec {𝓤} {𝓥} {X} {P} i f =
   ∃!-witness (/-universality  (props-are-sets i) f
                               {x} {x'}_  i (f x) (f x')))

 abstract
  propositional-truncations-from-set-quotients :
   Fun-Ext  propositional-truncations-exist
  propositional-truncations-from-set-quotients fe = record
   { ∥_∥        = ∥_∥
   ; ∥∥-is-prop = ∥∥-is-prop fe
   ; ∣_∣        = ∣_∣
   ; ∥∥-rec     = ∥∥-rec
   }

\end{code}