Skip to content

MGS.hlevels

Martin Escardo 1st May 2020.

This is ported from the Midlands Graduate School 2019 lecture notes

 https://www.cs.bham.ac.uk/~mhe/HoTT-UF.in-Agda-Lecture-Notes/HoTT-UF-Agda.html
 https://github.com/martinescardo/HoTT-UF.Agda-Lecture-Notes


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

module MGS.hlevels where

open import MGS.Basic-UF public

_is-of-hlevel_ : 𝓤 ̇    𝓤 ̇
X is-of-hlevel 0        = is-singleton X
X is-of-hlevel (succ n) = (x x' : X)  ((x  x') is-of-hlevel n)

wconstant : {X : 𝓤 ̇ } {Y : 𝓥 ̇ }  (X  Y)  𝓤  𝓥 ̇
wconstant f = (x x' : domain f)  f x  f x'

wconstant-endomap : 𝓤 ̇  𝓤 ̇
wconstant-endomap X = Σ f  (X  X), wconstant f

wcmap : (X : 𝓤 ̇ )  wconstant-endomap X  (X  X)
wcmap X (f , w) = f

wcmap-constancy : (X : 𝓤 ̇ ) (c : wconstant-endomap X)
                 wconstant (wcmap X c)
wcmap-constancy X (f , w) = w

Hedberg : {X : 𝓤 ̇ } (x : X)
         ((y : X)  wconstant-endomap (x  y))
         (y : X)  is-subsingleton (x  y)

Hedberg {𝓤} {X} x c y p q =

 p                         =⟨ a y p 
 (f x (refl x))⁻¹  f y p  =⟨ ap  -  (f x (refl x))⁻¹  -) (κ y p q) 
 (f x (refl x))⁻¹  f y q  =⟨ (a y q)⁻¹ 
 q                         

 where
  f : (y : X)  x  y  x  y
  f y = wcmap (x  y) (c y)

  κ : (y : X) (p q : x  y)  f y p  f y q
  κ y = wcmap-constancy (x  y) (c y)

  a : (y : X) (p : x  y)  p  (f x (refl x))⁻¹  f y p
  a x (refl x) = (⁻¹-left∙ (f x (refl x)))⁻¹

wconstant-=-endomaps : 𝓤 ̇  𝓤 ̇
wconstant-=-endomaps X = (x y : X)  wconstant-endomap (x  y)

sets-have-wconstant-=-endomaps : (X : 𝓤 ̇ )  is-set X  wconstant-=-endomaps X
sets-have-wconstant-=-endomaps X s x y = (f , κ)
 where
  f : x  y  x  y
  f p = p

  κ : (p q : x  y)  f p  f q
  κ p q = s x y p q

types-with-wconstant-=-endomaps-are-sets : (X : 𝓤 ̇ )
                                          wconstant-=-endomaps X  is-set X

types-with-wconstant-=-endomaps-are-sets X c x = Hedberg x
                                                   y  wcmap (x  y) (c x y) ,
                                                   wcmap-constancy (x  y) (c x y))

subsingletons-have-wconstant-=-endomaps : (X : 𝓤 ̇ )
                                         is-subsingleton X
                                         wconstant-=-endomaps X

subsingletons-have-wconstant-=-endomaps X s x y = (f , κ)
 where
  f : x  y  x  y
  f p = s x y

  κ : (p q : x  y)  f p  f q
  κ p q = refl (s x y)

subsingletons-are-sets : (X : 𝓤 ̇ )  is-subsingleton X  is-set X
subsingletons-are-sets X s = types-with-wconstant-=-endomaps-are-sets X
                               (subsingletons-have-wconstant-=-endomaps X s)

singletons-are-sets : (X : 𝓤 ̇ )  is-singleton X  is-set X
singletons-are-sets X = subsingletons-are-sets X  singletons-are-subsingletons X

𝟘-is-set : is-set 𝟘
𝟘-is-set = subsingletons-are-sets 𝟘 𝟘-is-subsingleton

𝟙-is-set : is-set 𝟙
𝟙-is-set = subsingletons-are-sets 𝟙 𝟙-is-subsingleton

subsingletons-are-of-hlevel-1 : (X : 𝓤 ̇ )
                               is-subsingleton X
                               X is-of-hlevel 1

subsingletons-are-of-hlevel-1 X = g
 where
  g : ((x y : X)  x  y)  (x y : X)  is-singleton (x  y)
  g t x y = t x y , subsingletons-are-sets X t x y (t x y)

types-of-hlevel-1-are-subsingletons : (X : 𝓤 ̇ )
                                     X is-of-hlevel 1
                                     is-subsingleton X

types-of-hlevel-1-are-subsingletons X = f
 where
  f : ((x y : X)  is-singleton (x  y))  (x y : X)  x  y
  f s x y = center (x  y) (s x y)

sets-are-of-hlevel-2 : (X : 𝓤 ̇ )  is-set X  X is-of-hlevel 2
sets-are-of-hlevel-2 X = g
 where
  g : ((x y : X)  is-subsingleton (x  y))  (x y : X)  (x  y) is-of-hlevel 1
  g t x y = subsingletons-are-of-hlevel-1 (x  y) (t x y)

types-of-hlevel-2-are-sets : (X : 𝓤 ̇ )  X is-of-hlevel 2  is-set X
types-of-hlevel-2-are-sets X = f
 where
  f : ((x y : X)  (x  y) is-of-hlevel 1)  (x y : X)  is-subsingleton (x  y)
  f s x y = types-of-hlevel-1-are-subsingletons (x  y) (s x y)

hlevel-upper : (X : 𝓤 ̇ ) (n : )  X is-of-hlevel n  X is-of-hlevel (succ n)
hlevel-upper X zero = γ
 where
  γ : is-singleton X  (x y : X)  is-singleton (x  y)
  γ h x y = p , subsingletons-are-sets X k x y p
   where
    k : is-subsingleton X
    k = singletons-are-subsingletons X h

    p : x  y
    p = k x y

hlevel-upper X (succ n) = λ h x y  hlevel-upper (x  y) n (h x y)

_has-minimal-hlevel_ : 𝓤 ̇    𝓤 ̇
X has-minimal-hlevel 0        = X is-of-hlevel 0
X has-minimal-hlevel (succ n) = (X is-of-hlevel (succ n)) × ¬ (X is-of-hlevel n)

_has-minimal-hlevel-∞ : 𝓤 ̇  𝓤 ̇
X has-minimal-hlevel-∞ = (n : )  ¬ (X is-of-hlevel n)

pointed-types-have-wconstant-endomap : {X : 𝓤 ̇ }  X  wconstant-endomap X
pointed-types-have-wconstant-endomap x = ((λ y  x) ,  y y'  refl x))

empty-types-have-wconstant-endomap : {X : 𝓤 ̇ }  is-empty X  wconstant-endomap X
empty-types-have-wconstant-endomap e = (id ,  x x'  !𝟘 (x  x') (e x)))

decidable-has-wconstant-endomap : {X : 𝓤 ̇ }  decidable X  wconstant-endomap X
decidable-has-wconstant-endomap (inl x) = pointed-types-have-wconstant-endomap x
decidable-has-wconstant-endomap (inr e) = empty-types-have-wconstant-endomap e

hedberg-lemma : {X : 𝓤 ̇ }  has-decidable-equality X  wconstant-=-endomaps X
hedberg-lemma {𝓤} {X} d x y = decidable-has-wconstant-endomap (d x y)

hedberg : {X : 𝓤 ̇ }  has-decidable-equality X  is-set X
hedberg {𝓤} {X} d = types-with-wconstant-=-endomaps-are-sets X (hedberg-lemma d)

ℕ-is-set : is-set 
ℕ-is-set = hedberg ℕ-has-decidable-equality

𝟚-is-set : is-set 𝟚
𝟚-is-set = hedberg 𝟚-has-decidable-equality