Martin Escardo

UF things that depend on non-UF things.

\begin{code}

{-# OPTIONS --without-K --exact-split --safe --auto-inline #-}

module UF.Miscelanea where

open import MLTT.Spartan

open import MLTT.Plus-Properties
open import Naturals.Properties
open import UF.Base
open import UF.Subsingletons renaming (⊤Ω to  ; ⊥Ω to )
open import UF.FunExt
open import UF.Lower-FunExt
open import UF.Subsingletons-FunExt
open import UF.Equiv
open import UF.Embeddings
open import TypeTopology.DiscreteAndSeparated

decidable-is-collapsible : {X : 𝓤 ̇ }  decidable X  collapsible X
decidable-is-collapsible (inl x) = pointed-types-are-collapsible x
decidable-is-collapsible (inr u) = empty-types-are-collapsible u

discrete-is-Id-collapsible : {X : 𝓤 ̇ }  is-discrete X  Id-collapsible X
discrete-is-Id-collapsible d = decidable-is-collapsible (d _ _)

discrete-types-are-sets : {X : 𝓤 ̇ }  is-discrete X  is-set X
discrete-types-are-sets d = Id-collapsibles-are-sets (discrete-is-Id-collapsible d)

being-isolated-is-prop : FunExt  {X : 𝓤 ̇ } (x : X)  is-prop (is-isolated x)
being-isolated-is-prop {𝓤} fe x = prop-criterion γ
 where
  γ : is-isolated x  is-prop (is-isolated x)
  γ i = Π-is-prop (fe 𝓤 𝓤)
          x  sum-of-contradictory-props
                 (local-hedberg _  y  decidable-is-collapsible (i y)) x)
                 (negations-are-props (fe 𝓤 𝓤₀))
                  p n  n p))

being-isolated'-is-prop : FunExt  {X : 𝓤 ̇ } (x : X)  is-prop (is-isolated' x)
being-isolated'-is-prop {𝓤} fe x = prop-criterion γ
 where
  γ : is-isolated' x  is-prop (is-isolated' x)
  γ i = Π-is-prop (fe 𝓤 𝓤)
          x  sum-of-contradictory-props
                 (local-hedberg' _  y  decidable-is-collapsible (i y)) x)
                 (negations-are-props (fe 𝓤 𝓤₀))
                  p n  n p))

being-discrete-is-prop : FunExt  {X : 𝓤 ̇ }  is-prop (is-discrete X)
being-discrete-is-prop {𝓤} fe {X} = Π-is-prop (fe 𝓤 𝓤) (being-isolated-is-prop fe)

isolated-is-h-isolated : {X : 𝓤 ̇ } (x : X)  is-isolated x  is-h-isolated x
isolated-is-h-isolated {𝓤} {X} x i {y} = local-hedberg x  y  γ y (i y)) y
 where
  γ : (y : X)  decidable (x  y)  Σ f  (x  y  x  y) , wconstant f
  γ y (inl p) =  _  p) ,  q r  refl)
  γ y (inr n) = id ,  q r  𝟘-elim (n r))

isolated-inl : {X : 𝓤 ̇ } (x : X) (i : is-isolated x) (y : X) (r : x  y)  i y  inl r
isolated-inl x i y r =
  equality-cases (i y)
     (p : x  y) (q : i y  inl p)  q  ap inl (isolated-is-h-isolated x i p r))
     (h : x  y) (q : i y  inr h)  𝟘-elim(h r))

isolated-inr : {X : 𝓤 ̇ }
              funext 𝓤 𝓤₀
              (x : X) (i : is-isolated x) (y : X) (n : x  y)  i y  inr n
isolated-inr fe x i y n =
  equality-cases (i y)
   (p : x  y) (q : i y  inl p)  𝟘-elim (n p))
   (m : x  y) (q : i y  inr m)  q  ap inr (dfunext fe  (p : x  y)  𝟘-elim (m p))))

\end{code}

The following variation of the above doesn't require function extensionality:

\begin{code}

isolated-inr' : {X : 𝓤 ̇ }
               (x : X) (i : is-isolated x) (y : X) (n : x  y)  Σ m  x  y , i y  inr m
isolated-inr' x i y n =
  equality-cases (i y)
   (p : x  y) (q : i y  inl p)  𝟘-elim (n p))
   (m : x  y) (q : i y  inr m)  m , q)

discrete-inl : {X : 𝓤 ̇ } (d : is-discrete X) (x y : X) (r : x  y)  d x y  inl r
discrete-inl d x = isolated-inl x (d x)

discrete-inr : funext 𝓤 𝓤₀
              {X : 𝓤 ̇ }
               (d : is-discrete X)
               (x y : X)
               (n : ¬ (x  y))
              d x y  inr n
discrete-inr fe d x = isolated-inr fe x (d x)

isolated-Id-is-prop : {X : 𝓤 ̇ } (x : X)  is-isolated' x  (y : X)  is-prop (y  x)
isolated-Id-is-prop x i = local-hedberg' x  y  decidable-is-collapsible (i y))

lc-maps-reflect-isolatedness : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                              left-cancellable f
                              (x : X)  is-isolated (f x)  is-isolated x
lc-maps-reflect-isolatedness f l x i y = γ (i (f y))
 where
  γ : (f x  f y) + ¬ (f x  f y)  (x  y) + ¬ (x  y)
  γ (inl p) = inl (l p)
  γ (inr n) = inr (contrapositive (ap f) n)

lc-maps-reflect-discreteness : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                              left-cancellable f
                              is-discrete Y
                              is-discrete X
lc-maps-reflect-discreteness f l d x = lc-maps-reflect-isolatedness f l x (d (f x))

embeddings-reflect-isolatedness : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                                 is-embedding f
                                 (x : X)  is-isolated (f x)
                                 is-isolated x
embeddings-reflect-isolatedness f e x i y = lc-maps-reflect-isolatedness f
                                              (embeddings-are-lc f e) x i y

equivs-reflect-isolatedness : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                             is-equiv f
                             (x : X)  is-isolated (f x)
                             is-isolated x
equivs-reflect-isolatedness f e = embeddings-reflect-isolatedness f
                                   (equivs-are-embeddings f e)

embeddings-reflect-discreteness : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                                 is-embedding f
                                 is-discrete Y
                                 is-discrete X
embeddings-reflect-discreteness f e = lc-maps-reflect-discreteness f (embeddings-are-lc f e)


open import UF.Equiv

equivs-preserve-discreteness : {X : 𝓤 ̇ } {Y : 𝓥 ̇ } (f : X  Y)
                              is-equiv f
                              is-discrete X
                              is-discrete Y
equivs-preserve-discreteness f e = lc-maps-reflect-discreteness
                                     (inverse f e)
                                     (equivs-are-lc
                                        (inverse f e)
                                        (inverses-are-equivs f e))

equiv-to-discrete : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }
                   X  Y
                   is-discrete X
                   is-discrete Y
equiv-to-discrete (f , e) = equivs-preserve-discreteness f e

𝟙-is-set : is-set (𝟙 {𝓤})
𝟙-is-set = discrete-types-are-sets 𝟙-is-discrete

𝟚-is-set : is-set 𝟚
𝟚-is-set = discrete-types-are-sets 𝟚-is-discrete

ℕ-is-set : is-set 
ℕ-is-set = discrete-types-are-sets ℕ-is-discrete

𝟚-to-Ω : 𝟚  Ω 𝓤
𝟚-to-Ω  = 
𝟚-to-Ω  = 

𝟚-to-Ω-is-embedding : funext 𝓤 𝓤  propext 𝓤  is-embedding (𝟚-to-Ω {𝓤})
𝟚-to-Ω-is-embedding fe pe (P , isp) ( , p) ( , q) = to-Σ-= (refl , Ω-is-set fe pe p q)
𝟚-to-Ω-is-embedding fe pe (P , isp) ( , p) ( , q) = 𝟘-elim (⊥-is-not-⊤ (p  q ⁻¹))
𝟚-to-Ω-is-embedding fe pe (P , isp) ( , p) ( , q) = 𝟘-elim (⊥-is-not-⊤ (q  p ⁻¹))
𝟚-to-Ω-is-embedding fe pe (P , isp) ( , p) ( , q) = to-Σ-= (refl , Ω-is-set fe pe p q)

nonempty : 𝓤 ̇  𝓤 ̇
nonempty X = is-empty(is-empty X)

stable : 𝓤 ̇  𝓤 ̇
stable X = nonempty X  X

decidable-is-stable : {X : 𝓤 ̇ }  decidable X  stable X
decidable-is-stable (inl x) φ = x
decidable-is-stable (inr u) φ = unique-from-𝟘(φ u)

stable-is-collapsible : funext 𝓤 𝓤₀
                       {X : 𝓤 ̇ }  stable X  collapsible X
stable-is-collapsible {𝓤} fe {X} s = (f , g)
 where
  f : X  X
  f x = s u  u x)

  claim₀ : (x y : X)  (u : is-empty X)  u x  u y
  claim₀ x y u = unique-from-𝟘(u x)

  claim₁ : (x y : X)   u  u x)   u  u y)
  claim₁ x y = dfunext fe (claim₀ x y)

  g : (x y : X)  f x  f y
  g x y = ap s (claim₁ x y)

¬¬-separated-is-Id-collapsible : funext 𝓤 𝓤₀  {X : 𝓤 ̇ }
                                is-¬¬-separated X
                                Id-collapsible X
¬¬-separated-is-Id-collapsible fe s = stable-is-collapsible fe (s _ _)

¬¬-separated-types-are-sets : funext 𝓤 𝓤₀  {X : 𝓤 ̇ }
                             is-¬¬-separated X
                             is-set X
¬¬-separated-types-are-sets fe s = Id-collapsibles-are-sets (¬¬-separated-is-Id-collapsible fe s)

being-¬¬-separated-is-prop : funext 𝓤 𝓤
                            {X : 𝓤 ̇ }
                            is-prop (is-¬¬-separated X)
being-¬¬-separated-is-prop {𝓤} fe {X} = prop-criterion f
 where
  f : is-¬¬-separated X  is-prop (is-¬¬-separated X)
  f s = Π-is-prop fe  _ 
        Π-is-prop fe  _ 
        Π-is-prop fe  _  ¬¬-separated-types-are-sets (lower-funext 𝓤 𝓤 fe) s)))

\end{code}

Find a better home for this:

\begin{code}

𝟚-ℕ-embedding : 𝟚  
𝟚-ℕ-embedding  = 0
𝟚-ℕ-embedding  = 1

𝟚-ℕ-embedding-is-lc : left-cancellable 𝟚-ℕ-embedding
𝟚-ℕ-embedding-is-lc {} {} refl = refl
𝟚-ℕ-embedding-is-lc {} {} r    = 𝟘-elim (positive-not-zero 0 (r ⁻¹))
𝟚-ℕ-embedding-is-lc {} {} r    = 𝟘-elim (positive-not-zero 0 r)
𝟚-ℕ-embedding-is-lc {} {} refl = refl

C-B-embedding : (  𝟚)  (  )
C-B-embedding α = 𝟚-ℕ-embedding  α

C-B-embedding-is-lc : funext 𝓤₀ 𝓤₀  left-cancellable C-B-embedding
C-B-embedding-is-lc fe {α} {β} p = dfunext fe h
 where
  h : (n : )  α n  β n
  h n = 𝟚-ℕ-embedding-is-lc (ap  -  - n) p)

\end{code}

Added 19th Feb 2020:

\begin{code}

open import UF.Embeddings

maps-of-props-into-h-isolated-points-are-embeddings : {P : 𝓤 ̇ } {X : 𝓥 ̇ } (f : P  X)
                                                     is-prop P
                                                     ((p : P)  is-h-isolated (f p))
                                                     is-embedding f
maps-of-props-into-h-isolated-points-are-embeddings f i j q (p , s) (p' , s') = to-Σ-= (i p p' , j p' _ s')

maps-of-props-into-isolated-points-are-embeddings : {P : 𝓤 ̇ } {X : 𝓥 ̇ } (f : P  X)
                                                   is-prop P
                                                   ((p : P)  is-isolated (f p))
                                                   is-embedding f
maps-of-props-into-isolated-points-are-embeddings f i j = maps-of-props-into-h-isolated-points-are-embeddings
                                                           f i  p  isolated-is-h-isolated (f p) (j p))

\end{code}