-- Martin Escardo, 3rd August 2015.

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

module prop where

open import preliminaries
open import isprop public

-- The type of small propositions is large:
Prp : {i : 𝕃}  U(lsuc i)
Prp{i} = Σ \(P : U i)  isProp P

-- Destructors:

_holds : {i : 𝕃}  Prp{i}  U i
_holds = pr₁

holdsIsProp : {i : 𝕃} (p : Prp{i})  isProp(p holds)
holdsIsProp = pr₂

-- The idea of the terminology is that we cannot assert a point of the
-- type Prop, as it is a pair, but we can assert that it holds, meaning
-- that we assert that its first component has an inhabitant, as it is
-- a truth-value (a type P with the asserted side-condition isProp P).

-- We have the following judgemental equalities:
--
--    (β₁)   ( P , isp ) holds = P,
--    (β₂)   holdsIsProp ( P , isp ) = isp,
--    (η)    p = ( p holds , holdsIsProp p ).

-- NB. holdsIsProp shows that _holds is an embedding in the sense of
-- the HoTT book https://homotopytypetheory.org/book/.

Prop-≡ : {i : 𝕃} {p q : Prp{i}}  p holds  q holds  p  q
Prop-≡ {i} {p} {q} e = e'
 where
   e' : p  q
   e' = Σ-≡ e (isProp-isProp (transport isProp e (holdsIsProp p)) (holdsIsProp q))

-- Propositional univalence says that any two (logically) equivalent
-- propositions are equal:

postulate propua : {i : 𝕃} {P Q : U i}  isProp P  isProp Q  (P  Q)  (Q  P)  P  Q

-- It can be formulated as follows:

propext : {i : 𝕃} {p q : Prp{i}}  (p holds  q holds)  (q holds  p holds)  p  q
propext {i} {p} {q} f g = Prop-≡ (propua (holdsIsProp p) (holdsIsProp q) f g)