Ian Ray, 7 February 2024

Singleton Properties. Of course there are a lot more we can add to this file.
For now we will show that singletons are closed under Σ types and equivalence.

\begin{code}

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

open import MLTT.Spartan
open import UF.Base
open import UF.Equiv
open import UF.Equiv-FunExt
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Subsingletons

module UF.Singleton-Properties where

Σ-is-singleton : {X : 𝓤 ̇ } {A : X  𝓥 ̇ }
                is-singleton X
                ((x : X)  is-singleton (A x))
                is-singleton (Σ A)
Σ-is-singleton {X = X} {A = A} (c , C) h = ((c , center (h c)) , Σ-centrality)
 where
  Σ-centrality : is-central (Σ A) (c , center (h c))
  Σ-centrality (x , a) =  Σ-=-≃ ⌝⁻¹ (C x , p)
   where
    p = transport A (C x) (center (h c)) =⟨ centrality (h x)
                                                (transport A (C x)
                                                     (center (h c))) ⁻¹ 
        center (h x)                     =⟨ centrality (h x) a 
        a                                

≃-is-singleton : FunExt
                {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                is-singleton X
                is-singleton Y
                is-singleton (X  Y)
≃-is-singleton fe i j = pointed-props-are-singletons
                         (singleton-≃ i j)
                         (≃-is-prop fe (singletons-are-props j))

\end{code}

Added by Martin Escardo 22nd June 2025.

\begin{code}

open import UF.Subsingletons-FunExt

the-singletons-form-a-singleton-type
 : funext 𝓤 𝓤
  propext 𝓤
  is-singleton (Σ X  𝓤 ̇ , is-singleton X)
the-singletons-form-a-singleton-type {𝓤} fe pe =
 equiv-to-singleton
  ((Σ X  𝓤 ̇ , is-singleton X) ≃⟨ Σ-cong I 
   (Σ X  𝓤 ̇ , is-prop X × X) )
 (the-true-props-form-a-singleton-type fe pe)
  where
   I = λ X  logically-equivalent-props-are-equivalent
              (being-singleton-is-prop fe)
              (prop-criterion
                 (X-is-prop , _)  ×-is-prop
                                      (being-prop-is-prop fe)
                                      X-is-prop))
               (i : is-singleton X)  singletons-are-props i , center i)
               (j , x)  pointed-props-are-singletons x j)

\end{code}

Added 19 June 2026 by Tom de Jong.

\begin{code}

consts : (A : 𝓤 ̇ ) (X : 𝓥 ̇ )  X  (A  X)
consts A X x = λ _  x

universal-property-of-singletons⁻ : 𝓤 ̇   𝓤  ̇
universal-property-of-singletons⁻ {𝓤} A =
 (X : 𝓤 ̇ )  is-equiv (consts A X)

universal-property-of-singletons : 𝓤 ̇   𝓤ω
universal-property-of-singletons {𝓤} A =
 {𝓥 : Universe} (X : 𝓥 ̇ )  is-equiv (consts A X)

singletons-satisfy-universal-property : Fun-Ext
                                       {A : 𝓤 ̇ }
                                       is-singleton A
                                       universal-property-of-singletons A
singletons-satisfy-universal-property fe {A} s X =
 qinvs-are-equivs (consts A X) (f ,  _  refl) , II)
  where
   f : (A  X)  X
   f g = g (center s)
   II :  g _  g (center s))  id
   II g = dfunext fe  a  ap g (centrality s a))

singleton-if-consts-is-equiv : {A : 𝓤 ̇ }
                              is-equiv (consts A A)
                              is-singleton A
singleton-if-consts-is-equiv {𝓤} {A} e = a₀ , I
 where
  c : A  A  A
  c = consts A A

  f : (A  A)  A
  f = inverse (consts A A) e

  a₀ : A
  a₀ = f id

  I : (a : A)  a₀  a
  I a = a₀         =⟨refl⟩
        c a₀ a     =⟨refl⟩
        c (f id) a =⟨ happly (inverses-are-sections c e id) a 
        id a       =⟨refl⟩
        a          

singleton-if-universal-property⁻ : {A : 𝓤 ̇ }
                                  universal-property-of-singletons⁻ A
                                  is-singleton A
singleton-if-universal-property⁻ {𝓤} {A} up =
 singleton-if-consts-is-equiv (up A)

singleton-if-universal-property : {A : 𝓤 ̇ }
                                 universal-property-of-singletons A
                                 is-singleton A
singleton-if-universal-property {𝓤} {A} up = singleton-if-universal-property⁻ up

\end{code}