Martin Escardo

Properties of the type of truth values.

\begin{code}

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

module UF.SubtypeClassifier-Properties where

open import MLTT.Spartan
open import UF.Base
open import UF.Embeddings
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Hedberg
open import UF.Lower-FunExt
open import UF.Sets
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.SubtypeClassifier

Ī©-is-set : funext š“¤ š“¤ → propext š“¤ → is-set (Ī© š“¤)
Ī©-is-set {š“¤} fe pe = Id-collapsibles-are-sets pc
 where
  A : (p q : Ī© š“¤) → š“¤ ̇
  A p q = (p holds → q holds) Ɨ (q holds → p holds)

  A-is-prop : (p q : Ī© š“¤) → is-prop (A p q)
  A-is-prop p q = Σ-is-prop (Π-is-prop fe
                              (Ī» _ → holds-is-prop q))
                              (Ī» _ → Ī -is-prop fe (Ī» _ → holds-is-prop p))

  g : (p q : Ī© š“¤) → p ļ¼ q → A p q
  g p q e = (b , c)
   where
    a : p holds ļ¼ q holds
    a = ap _holds e

    b : p holds → q holds
    b = transport id a

    c : q holds → p holds
    c = transport id (a ⁻¹)

  h  : (p q : Ī© š“¤) → A p q → p ļ¼ q
  h p q (u , v) = Ī©-extensionality pe fe u v

  f  : (p q : Ī© š“¤) → p ļ¼ q → p ļ¼ q
  f p q e = h p q (g p q e)

  wconstant-f : (p q : Ī© š“¤) (d e : p ļ¼ q) → f p q d ļ¼ f p q e
  wconstant-f p q d e = ap (h p q) (A-is-prop p q (g p q d) (g p q e))

  pc : {p q : Ī© š“¤} → Ī£ f źž‰ (p ļ¼ q → p ļ¼ q) , wconstant f
  pc {p} {q} = (f p q , wconstant-f p q)

Ī©-extensionality-ā‰ƒ : propext š“¤
                   → funext š“¤ š“¤
                   → {p q : Ī© š“¤}
                   → ((p holds) ↔ (q holds)) ā‰ƒ (p ļ¼ q)
Ī©-extensionality-ā‰ƒ pe fe {p} {q} =
 logically-equivalent-props-are-equivalent
  (Ɨ-is-prop
    (Ī -is-prop fe (Ī» _ → holds-is-prop q))
    (Ī -is-prop fe (Ī» _ → holds-is-prop p)))
  (Ī©-is-set fe pe)
  (Ī» (f , g) → to-Ī©-ļ¼ fe (pe (holds-is-prop p) (holds-is-prop q) f g))
  (Ī» {refl → id , id})

equal-⊤-ā‰ƒ : propext š“¤
          → funext š“¤ š“¤
          → (p : Ī© š“¤) → (p ļ¼ ⊤) ā‰ƒ (p holds)
equal-⊤-ā‰ƒ {š“¤} pe fe p =
 logically-equivalent-props-are-equivalent
  (Ī©-is-set fe pe)
  (holds-is-prop p)
  (equal-⊤-gives-holds p)
  (holds-gives-equal-⊤ pe fe p)

equal-⊄-ā‰ƒ : propext š“¤
          → funext š“¤ š“¤
          → (p : Ī© š“¤) → (p ļ¼ ⊄) ā‰ƒ ¬ (p holds)
equal-⊄-ā‰ƒ {š“¤} pe fe p =
 logically-equivalent-props-are-equivalent
 (Ī©-is-set fe pe)
 (negations-are-props (lower-funext š“¤ š“¤ fe))
 (equal-⊄-gives-fails p)
 (fails-gives-equal-⊄ pe fe p)

šŸš-to-Ī© : šŸš → Ī© š“¤
šŸš-to-Ī© ā‚€ = ⊄
šŸš-to-Ī© ₁ = ⊤

module _ (fe : funext š“¤ š“¤) (pe : propext š“¤) where

 šŸš-to-Ī©-is-embedding : is-embedding (šŸš-to-Ī© {š“¤})
 šŸš-to-Ī©-is-embedding _ (ā‚€ , p) (ā‚€ , q) = to-Ī£-ļ¼ (refl , Ī©-is-set fe pe p q)
 šŸš-to-Ī©-is-embedding _ (ā‚€ , p) (₁ , q) = šŸ˜-elim (⊄-is-not-⊤ (p āˆ™ q ⁻¹))
 šŸš-to-Ī©-is-embedding _ (₁ , p) (ā‚€ , q) = šŸ˜-elim (⊄-is-not-⊤ (q āˆ™ p ⁻¹))
 šŸš-to-Ī©-is-embedding _ (₁ , p) (₁ , q) = to-Ī£-ļ¼ (refl , Ī©-is-set fe pe p q)

 šŸš-to-Ī©-fiber : (p : Ī© š“¤) → fiber šŸš-to-Ī© p ā‰ƒ (¬ (p holds) + p holds)
 šŸš-to-Ī©-fiber p =
  fiber (šŸš-to-Ī© {š“¤}) p           ā‰ƒāŸØ ā‰ƒ-refl _ ⟩
  (Ī£ n źž‰ šŸš , šŸš-to-Ī© {š“¤} n ļ¼ p) ā‰ƒāŸØ Iā‚€ ⟩
  (⊄ ļ¼ p) + (⊤ ļ¼ p)            ā‰ƒāŸØ I₁ ⟩
  (¬ (p holds) + p holds)        ā– 
    where
     Iā‚€ = alternative-+
     I₁ = +-cong
           (ļ¼-flip ā— equal-⊄-ā‰ƒ pe fe p)
           (ļ¼-flip ā— equal-⊤-ā‰ƒ pe fe p)

\end{code}