Martin Escardo

In univalent logic, as opposed to Curry-Howard logic, a proposition is
a prop or a type such that any two of its elements are
identified.

https://www.newton.ac.uk/files/seminar/20170711100011001-1009756.pdf
https://unimath.github.io/bham2017/uf.pdf

About (sub)singletons using function extensionality.

\begin{code}

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

module UF.Subsingletons-FunExt where

open import MLTT.Spartan
open import UF.Base
open import UF.FunExt
open import UF.Hedberg
open import UF.Retracts
open import UF.Sets
open import UF.Subsingletons
open import UF.Subsingletons-Properties

ฮ -is-prop : funext ๐“ค ๐“ฅ
          โ†’ {X : ๐“ค ฬ‡ } {A : X โ†’ ๐“ฅ ฬ‡ }
          โ†’ ((x : X) โ†’ is-prop (A x))
          โ†’ is-prop (ฮ  A)
ฮ -is-prop fe i f g = dfunext fe (ฮป x โ†’ i x (f x) (g x))

ฮ -is-prop' : funext ๐“ค ๐“ฅ
           โ†’ {X : ๐“ค ฬ‡ } {A : X โ†’ ๐“ฅ ฬ‡ }
           โ†’ ((x : X) โ†’ is-prop (A x))
           โ†’ is-prop ({x : X} โ†’ A x)
ฮ -is-prop' fe {X} {A} i = retract-of-prop retr (ฮ -is-prop fe i)
 where
  retr : retract ({x : X} โ†’ A x) of ฮ  A
  retr = (ฮป f {x} โ†’ f x) , (ฮป g x โ†’ g {x}) , (ฮป x โ†’ refl)

ฮ -is-singleton : funext ๐“ค ๐“ฅ
               โ†’ {X : ๐“ค ฬ‡ } {A : X โ†’ ๐“ฅ ฬ‡ }
               โ†’ ((x : X) โ†’ is-singleton (A x))
               โ†’ is-singleton (ฮ  A)
ฮ -is-singleton fe i = (ฮป x โ†’ prโ‚ (i x)) ,
                      (ฮป f โ†’ dfunext fe (ฮป x โ†’ prโ‚‚ (i x) (f x)))

being-prop-is-prop : {X : ๐“ค ฬ‡ }
                   โ†’ funext ๐“ค ๐“ค
                   โ†’ is-prop (is-prop X)
being-prop-is-prop {๐“ค} {X} fe f g = cโ‚
 where
  l : is-set X
  l = props-are-sets f

  c : (x y : X) โ†’ f x y ๏ผ g x y
  c x y = l (f x y) (g x y)

  cโ‚€ : (x : X) โ†’ f x ๏ผ g x
  cโ‚€ x = dfunext fe (c x)

  cโ‚ : f ๏ผ g
  cโ‚  = dfunext fe cโ‚€

โ†”-is-prop : {X : ๐“ค ฬ‡ } {Y : ๐“ฅ ฬ‡ }
          โ†’ funext ๐“ค ๐“ฅ
          โ†’ funext ๐“ฅ ๐“ค
          โ†’ is-prop X
          โ†’ is-prop Y
          โ†’ is-prop (X โ†” Y)
โ†”-is-prop fe fe' X-is-prop Y-is-prop = ร—-is-prop
                                       (ฮ -is-prop fe  (ฮป _ โ†’ Y-is-prop))
                                       (ฮ -is-prop fe' (ฮป _ โ†’ X-is-prop))

\end{code}

The following means that propositions are h-isolated elements of type
universes:

\begin{code}

identifications-with-props-are-props : propext ๐“ค
                                     โ†’ funext ๐“ค ๐“ค
                                     โ†’ (P : ๐“ค ฬ‡ )
                                     โ†’ is-prop P
                                     โ†’ (X : ๐“ค ฬ‡ ) โ†’ is-prop (X ๏ผ P)
identifications-with-props-are-props {๐“ค} pe fe P i = ฮณ
 where
  f : (X : ๐“ค ฬ‡ ) โ†’ X ๏ผ P โ†’ is-prop X ร— (X โ†” P)
  f X refl = i , (id , id)

  g : (X : ๐“ค ฬ‡ ) โ†’ is-prop X ร— (X โ†” P) โ†’ X ๏ผ P
  g X (l , ฯ† , ฮณ) = pe l i ฯ† ฮณ

  j : (X : ๐“ค ฬ‡ ) โ†’ is-prop (is-prop X ร— (X โ†” P))
  j X = ร—-prop-criterion ( (ฮป _ โ†’ being-prop-is-prop fe)
                         , (ฮป l โ†’ โ†”-is-prop fe fe l i))

  k : (X : ๐“ค ฬ‡ ) โ†’ wconstant (g X โˆ˜ f X)
  k X p q = ap (g X) (j X (f X p) (f X q))

  ฮณ : (X : ๐“ค ฬ‡ ) โ†’ is-prop (X ๏ผ P)
  ฮณ = local-hedberg' P (ฮป X โ†’ g X โˆ˜ f X , k X)

being-singleton-is-prop : funext ๐“ค ๐“ค โ†’ {X : ๐“ค ฬ‡ } โ†’ is-prop (is-singleton X)
being-singleton-is-prop fe {X} (x , ฯ†) (y , ฮณ) = ฮด
 where
  isp : is-prop X
  isp = singletons-are-props (y , ฮณ)

  iss : is-set X
  iss = props-are-sets isp

  ฮด : x , ฯ† ๏ผ y , ฮณ
  ฮด = to-ฮฃ-๏ผ (ฯ† y , dfunext fe ฮป z โ†’ iss {y} {z} _ _)

โˆƒ!-is-prop : {X : ๐“ค ฬ‡ } {A : X โ†’ ๐“ฅ ฬ‡ }
           โ†’ funext (๐“ค โŠ” ๐“ฅ) (๐“ค โŠ” ๐“ฅ)
           โ†’ is-prop (โˆƒ! A)
โˆƒ!-is-prop fe = being-singleton-is-prop fe

negations-are-props : {X : ๐“ค ฬ‡ } โ†’ funext ๐“ค ๐“คโ‚€ โ†’ is-prop (ยฌ X)
negations-are-props fe = ฮ -is-prop fe (ฮป x โ†’ ๐Ÿ˜-is-prop)

decidability-of-prop-is-prop : funext ๐“ค ๐“คโ‚€
                             โ†’ {P : ๐“ค ฬ‡ }
                             โ†’ is-prop P
                             โ†’ is-prop (P + ยฌ P)
decidability-of-prop-is-prop feโ‚€ i = sum-of-contradictory-props
                                      i
                                      (negations-are-props feโ‚€)
                                      (ฮป p u โ†’ u p)

empty-types-are-props : {X : ๐“ค ฬ‡ } โ†’ ยฌ X โ†’ is-prop X
empty-types-are-props f x = ๐Ÿ˜-elim (f x)

equal-๐Ÿ˜-is-empty : {X : ๐“ค ฬ‡ } โ†’ X ๏ผ ๐Ÿ˜ โ†’ ยฌ X
equal-๐Ÿ˜-is-empty e x = ๐Ÿ˜-elim (transport id e x)

empty-types-are-๏ผ-๐Ÿ˜ : funext ๐“ค ๐“คโ‚€ โ†’ propext ๐“ค โ†’ {X : ๐“ค ฬ‡ } โ†’ ยฌ X โ†’ X ๏ผ ๐Ÿ˜
empty-types-are-๏ผ-๐Ÿ˜ fe pe f = pe (empty-types-are-props f)
                                ๐Ÿ˜-is-prop
                                (ฮป x โ†’ ๐Ÿ˜-elim (f x))
                                ๐Ÿ˜-elim

holds-gives-equal-๐Ÿ™ : propext ๐“ค โ†’ (P : ๐“ค ฬ‡ ) โ†’ is-prop P โ†’ P โ†’ P ๏ผ ๐Ÿ™
holds-gives-equal-๐Ÿ™ pe P i p = pe i ๐Ÿ™-is-prop unique-to-๐Ÿ™ (ฮป _ โ†’ p)

equal-๐Ÿ™-gives-holds : (P : ๐“ค ฬ‡ ) โ†’ P ๏ผ ๐Ÿ™ โ†’ P
equal-๐Ÿ™-gives-holds P r = Idtofun (r โปยน) โ‹†

not-๐Ÿ˜-is-๐Ÿ™ : funext ๐“ค ๐“คโ‚€
           โ†’ propext ๐“ค
           โ†’ (ยฌ ๐Ÿ˜) ๏ผ ๐Ÿ™
not-๐Ÿ˜-is-๐Ÿ™ fe pe = pe (negations-are-props fe)
                      ๐Ÿ™-is-prop
                      (ฮป _ โ†’ โ‹†)
                      (ฮป _ z โ†’ ๐Ÿ˜-elim z)

\end{code}

In the above and in the following, ๐Ÿ˜-elim is used to coerce from ๐Ÿ˜ {๐“ค}
to ๐Ÿ˜ {๐“คโ‚€} as this is where negations take values in.

Sometimes it is convenient to work with the type of true propositions,
which is a singleton and hence a subsingleton. But we will leave this
type nameless:

\begin{code}

๐Ÿ™-is-true-props-center : funext ๐“ค ๐“ค
                       โ†’ propext ๐“ค
                       โ†’ (ฯƒ : ฮฃ P ๊ž‰ ๐“ค ฬ‡ , is-prop P ร— P) โ†’ (๐Ÿ™ , ๐Ÿ™-is-prop , โ‹†) ๏ผ ฯƒ
๐Ÿ™-is-true-props-center fe pe = ฮณ
 where
  ฯ† : โˆ€ P โ†’ is-prop (is-prop P ร— P)
  ฯ† P (i , p) = ร—-is-prop (being-prop-is-prop fe) i (i , p)

  ฮณ : โˆ€ ฯƒ โ†’ (๐Ÿ™ , ๐Ÿ™-is-prop , โ‹†) ๏ผ ฯƒ
  ฮณ (P , i , p) = to-subtype-๏ผ ฯ† s
   where
    s : ๐Ÿ™ ๏ผ P
    s = pe ๐Ÿ™-is-prop i (ฮป _ โ†’ p) (ฮป _ โ†’ โ‹†)

the-true-props-form-a-singleton-type : funext ๐“ค ๐“ค
                                     โ†’ propext ๐“ค
                                     โ†’ is-singleton (ฮฃ P ๊ž‰ ๐“ค ฬ‡ , is-prop P ร— P)
the-true-props-form-a-singleton-type fe pe = (๐Ÿ™ , ๐Ÿ™-is-prop , โ‹†) ,
                                             ๐Ÿ™-is-true-props-center fe pe

the-true-props-form-a-prop : funext ๐“ค ๐“ค
                           โ†’ propext ๐“ค
                           โ†’ is-prop (ฮฃ P ๊ž‰ ๐“ค ฬ‡ , is-prop P ร— P)
the-true-props-form-a-prop fe pe =
 singletons-are-props (the-true-props-form-a-singleton-type fe pe)

\end{code}

Added 16th June 2020. (Should have added this ages ago to avoid
boiler-plate code.)

\begin{code}

ฮ โ‚‚-is-prop : Fun-Ext
           โ†’ {X : ๐“ค ฬ‡ }
             {Y : X โ†’ ๐“ฅ ฬ‡ }
             {Z : (x : X) โ†’ Y x โ†’ ๐“ฆ ฬ‡ }
           โ†’ ((x : X) (y : Y x) โ†’ is-prop (Z x y))
           โ†’ is-prop ((x : X) (y : Y x) โ†’ Z x y)
ฮ โ‚‚-is-prop fe i = ฮ -is-prop fe (ฮป x โ†’ ฮ -is-prop fe (i x))

ฮ โ‚ƒ-is-prop : Fun-Ext
           โ†’ {X : ๐“ค ฬ‡ }
             {Y : X โ†’ ๐“ฅ ฬ‡ }
             {Z : (x : X) โ†’ Y x โ†’ ๐“ฆ ฬ‡ }
             {T : (x : X) (y : Y x) โ†’ Z x y โ†’ ๐“ฃ ฬ‡ }
           โ†’ ((x : X) (y : Y x) (z : Z x y) โ†’ is-prop (T x y z))
           โ†’ is-prop ((x : X) (y : Y x) (z : Z x y) โ†’ T x y z)
ฮ โ‚ƒ-is-prop fe i = ฮ -is-prop fe (ฮป x โ†’ ฮ โ‚‚-is-prop fe (i x))

ฮ โ‚„-is-prop : Fun-Ext
           โ†’ {๐“ฅโ‚€ ๐“ฅโ‚ ๐“ฅโ‚‚ ๐“ฅโ‚ƒ : Universe}
             {A : ๐“ค ฬ‡ }
             {B : A โ†’ ๐“ฅโ‚€ ฬ‡ }
             {C : (a : A) โ†’ B a โ†’ ๐“ฅโ‚ ฬ‡ }
             {D : (a : A) (b : B a) โ†’ C a b โ†’ ๐“ฅโ‚‚ ฬ‡ }
             {E : (a : A) (b : B a) (c : C a b) โ†’ D a b c โ†’ ๐“ฅโ‚ƒ ฬ‡ }
           โ†’ ((a : A) (b : B a) (c : C a b) (d : D a b c) โ†’ is-prop (E a b c d))
           โ†’ is-prop ((a : A) (b : B a) (c : C a b) (d : D a b c) โ†’ E a b c d)
ฮ โ‚„-is-prop fe i = ฮ -is-prop fe (ฮป x โ†’ ฮ โ‚ƒ-is-prop fe (i x))

ฮ โ‚…-is-prop : Fun-Ext
           โ†’ {๐“ฅโ‚€ ๐“ฅโ‚ ๐“ฅโ‚‚ ๐“ฅโ‚ƒ ๐“ฅโ‚„ : Universe}
             {A : ๐“ค ฬ‡ }
             {B : A โ†’ ๐“ฅโ‚€ ฬ‡ }
             {C : (a : A) โ†’ B a โ†’ ๐“ฅโ‚ ฬ‡ }
             {D : (a : A) (b : B a) โ†’ C a b โ†’ ๐“ฅโ‚‚ ฬ‡ }
             {E : (a : A) (b : B a) (c : C a b) โ†’ D a b c โ†’ ๐“ฅโ‚ƒ ฬ‡ }
             {F : (a : A) (b : B a) (c : C a b) (d : D a b c) โ†’ E a b c d โ†’ ๐“ฅโ‚„ ฬ‡ }
           โ†’ ((a : A) (b : B a) (c : C a b) (d : D a b c) (e : E a b c d) โ†’ is-prop (F a b c d e))
           โ†’ is-prop ((a : A) (b : B a) (c : C a b) (d : D a b c) (e : E a b c d) โ†’ F a b c d e)
ฮ โ‚…-is-prop fe i = ฮ -is-prop fe (ฮป x โ†’ ฮ โ‚„-is-prop fe (i x))

ฮ โ‚‚-is-prop' : Fun-Ext
           โ†’ {X : ๐“ค ฬ‡ }
             {Y : X โ†’ ๐“ฅ ฬ‡ }
             {Z : (x : X) โ†’ Y x โ†’ ๐“ฆ ฬ‡ }
           โ†’ ((x : X) (y : Y x) โ†’ is-prop (Z x y))
           โ†’ is-prop ({x : X} {y : Y x} โ†’ Z x y)
ฮ โ‚‚-is-prop' fe i = ฮ -is-prop' fe (ฮป x โ†’ ฮ -is-prop' fe (i x))

\end{code}