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           β‰ƒβŸ¨by-definition⟩
  (Ξ£ 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}