Martin Escardo, April 2013.
Adapted to this development June 2018, with further additions.
Ordinals like in the HoTT book and variations.
\begin{code}
{-# OPTIONS --without-K --exact-split --safe #-}
open import SpartanMLTT
open import DiscreteAndSeparated
open import UF-Base
open import UF-Subsingletons
open import UF-FunExt
open import UF-Subsingletons-FunExt
open import UF-ExcludedMiddle
module OrdinalNotions
{π€ π₯ : Universe}
{X : π€ Μ }
(_<_ : X β X β π₯ Μ )
where
is-prop-valued : π€ β π₯ Μ
is-prop-valued = (x y : X) β is-prop (x < y)
data is-accessible : X β π€ β π₯ Μ where
next : (x : X) β ((y : X) β y < x β is-accessible y) β is-accessible x
accessible-induction : (P : (x : X) β is-accessible x β π¦ Μ )
β ((x : X) (Ο : (y : X) β y < x β is-accessible y)
β ((y : X) (l : y < x) β P y (Ο y l))
β P x (next x Ο))
β (x : X) (a : is-accessible x) β P x a
accessible-induction P f = h
where
h : (x : X) (a : is-accessible x) β P x a
h x (next x Ο) = f x Ο (Ξ» y l β h y (Ο y l))
prev : (x : X)
β is-accessible x
β (y : X) β y < x β is-accessible y
prev = accessible-induction
(Ξ» x _ β (y : X) β y < x β is-accessible y)
(Ξ» x Ο f β Ο)
prev-behaviour : (x : X) (a : is-accessible x)
β next x (prev x a) β‘ a
prev-behaviour = accessible-induction _ (Ξ» _ _ _ β refl)
prev-behaviour' : (x : X) (Ο : (y : X) β y < x β is-accessible y)
β prev x (next x Ο) β‘ Ο
prev-behaviour' x Ο = refl
transfinite-induction' : (P : X β π¦ Μ )
β ((x : X) β (β(y : X) β y < x β P y) β P x)
β (x : X) β is-accessible x β P x
transfinite-induction' P f = accessible-induction
(Ξ» x _ β P x)
(Ξ» x _ β f x)
is-well-founded : π€ β π₯ Μ
is-well-founded = (x : X) β is-accessible x
Well-founded : π€ β π₯ β π¦ βΊ Μ
Well-founded {π¦} = (P : X β π¦ Μ )
β ((x : X) β ((y : X) β y < x β P y) β P x)
β (x : X) β P x
transfinite-induction : is-well-founded β β {π¦} β Well-founded {π¦}
transfinite-induction w P f x = transfinite-induction' P f x (w x)
transfinite-induction-converse : Well-founded {π€ β π₯} β is-well-founded
transfinite-induction-converse Ο = Ο is-accessible next
transfinite-recursion : is-well-founded
β β {π¦} {Y : π¦ Μ }
β ((x : X) β ((y : X) β y < x β Y) β Y)
β X β Y
transfinite-recursion w {π¦} {Y} = transfinite-induction w (Ξ» x β Y)
is-transitive : π€ β π₯ Μ
is-transitive = (x y z : X) β x < y β y < z β x < z
private
_βΌ_ : X β X β π€ β π₯ Μ
x βΌ y = β u β u < x β u < y
extensional-po = _βΌ_
extensional-po-is-prop-valued : FunExt
β is-prop-valued
β (x y : X) β is-prop (x βΌ y)
extensional-po-is-prop-valued fe isp x y =
Ξ β-is-prop (Ξ» {π€} {π₯} β fe π€ π₯) (Ξ» u l β isp u y)
βΌ-refl : {x : X} β x βΌ x
βΌ-refl u l = l
βΌ-trans : {x y z : X} β x βΌ y β y βΌ z β x βΌ z
βΌ-trans f g u l = g u (f u l)
is-extensional : π€ β π₯ Μ
is-extensional = (x y : X) β x βΌ y β y βΌ x β x β‘ y
is-extensional' : π€ β π₯ Μ
is-extensional' = (x y : X) β ((u : X) β (u < x) β (u < y)) β x β‘ y
extensional-gives-extensional' : is-extensional β is-extensional'
extensional-gives-extensional' e x y f = e x y
(Ξ» u l β prβ (f u) l)
(Ξ» u l β prβ (f u) l)
extensional'-gives-extensional : is-extensional' β is-extensional
extensional'-gives-extensional e' x y g h = e' x y (Ξ» u β (g u , h u))
\end{code}
The HoTT Book additionally requires that the underlying type is a set
in the following definition, but this actually follows from the
extensionality condition (see below):
\begin{code}
is-well-order : π€ β π₯ Μ
is-well-order = is-prop-valued
Γ is-well-founded
Γ is-extensional
Γ is-transitive
prop-valuedness : is-well-order β is-prop-valued
prop-valuedness (p , w , e , t) = p
well-foundedness : is-well-order β is-well-founded
well-foundedness (p , w , e , t) = w
extensionality : is-well-order β is-extensional
extensionality (p , w , e , t) = e
transitivity : is-well-order β is-transitive
transitivity (p , w , e , t) = t
accessibility-is-prop : FunExt
β (x : X) β is-prop (is-accessible x)
accessibility-is-prop fe = accessible-induction P Ο
where
P : (x : X) β is-accessible x β π€ β π₯ Μ
P x a = (b : is-accessible x) β a β‘ b
Ο : (x : X) (Ο : (y : X) β y < x β is-accessible y)
β ((y : X) (l : y < x) (a : is-accessible y) β Ο y l β‘ a)
β (b : is-accessible x) β next x Ο β‘ b
Ο x Ο IH b = next x Ο β‘β¨ i β©
next x Ο β‘β¨ prev-behaviour x b β©
b β
where
Ο : (y : X) β y < x β is-accessible y
Ο = prev x b
h : (y : X) (l : y < x) β Ο y l β‘ Ο y l
h y l = IH y l (Ο y l)
i = ap (next x)
(dfunext (fe π€ (π€ β π₯)) (Ξ» y β dfunext (fe π₯ (π€ β π₯)) (h y)))
well-foundedness-is-prop : FunExt β is-prop is-well-founded
well-foundedness-is-prop fe = Ξ -is-prop (fe π€ (π€ β π₯))
(accessibility-is-prop fe)
extensionally-ordered-types-are-sets : FunExt
β is-prop-valued
β is-extensional
β is-set X
extensionally-ordered-types-are-sets fe isp e = Ξ³
where
f : {x y : X} β x β‘ y β x β‘ y
f {x} {y} p = e x y (transport (x βΌ_) p (βΌ-refl {x}))
(transport (_βΌ x) p (βΌ-refl {x}))
ec : {x y : X} {l l' : x βΌ y} {m m' : y βΌ x} β e x y l m β‘ e x y l' m'
ec {x} {y} {l} {l'} {m} {m'} = apβ (e x y)
(extensional-po-is-prop-valued fe isp x y l l')
(extensional-po-is-prop-valued fe isp y x m m')
ΞΊ : {x y : X} β wconstant (f {x} {y})
ΞΊ p q = ec
Ξ³ : is-set X
Ξ³ = Id-collapsibles-are-sets (f , ΞΊ)
well-ordered-types-are-sets : FunExt β is-well-order β is-set X
well-ordered-types-are-sets fe (p , w , e , t) =
extensionally-ordered-types-are-sets fe p e
extensionality-is-prop : FunExt β is-prop-valued β is-prop is-extensional
extensionality-is-prop fe isp e e' =
dfunext (fe π€ (π€ β π₯))
(Ξ» x β dfunext (fe π€ (π€ β π₯))
(Ξ» y β Ξ β-is-prop (Ξ» {π€} {π₯} β fe π€ π₯)
(Ξ» l m β extensionally-ordered-types-are-sets fe isp e)
(e x y)
(e' x y)))
transitivity-is-prop : FunExt β is-prop-valued β is-prop is-transitive
transitivity-is-prop fe isp = Ξ β
-is-prop (Ξ» {π€} {π₯} β fe π€ π₯)
(Ξ» x y z l m β isp x z)
being-well-order-is-prop : FunExt β is-prop is-well-order
being-well-order-is-prop fe = prop-criterion Ξ³
where
Ξ³ : is-well-order β is-prop is-well-order
Ξ³ o = Γβ-is-prop (Ξ β-is-prop ((Ξ» {π€} {π₯} β fe π€ π₯))
(Ξ» x y β being-prop-is-prop (fe π₯ π₯)))
(well-foundedness-is-prop fe)
(extensionality-is-prop fe (prop-valuedness o))
(transitivity-is-prop fe (prop-valuedness o))
_βΎ_ : X β X β π₯ Μ
x βΎ y = Β¬ (y < x)
βΎ-is-prop-valued : funext π₯ π€β β is-prop-valued β (x y : X) β is-prop (x βΎ y)
βΎ-is-prop-valued fe p x y = negations-are-props fe
is-top : X β π€ β π₯ Μ
is-top x = (y : X) β y βΎ x
has-top : π€ β π₯ Μ
has-top = Ξ£ x κ X , is-top x
<-coarser-than-βΎ : (x : X)
β is-accessible x
β (y : X) β y < x β y βΎ x
<-coarser-than-βΎ = transfinite-induction'
(Ξ» x β (y : X) β y < x β y βΎ x)
(Ξ» x f y l m β f y l x m l)
βΎ-refl : (x : X) β is-accessible x β x βΎ x
βΎ-refl x a l = <-coarser-than-βΎ x a x l l
irreflexive : (x : X) β is-accessible x β Β¬ (x < x)
irreflexive = βΎ-refl
<-gives-β’ : is-well-founded
β (x y : X) β x < y β x β’ y
<-gives-β’ w x y l p = irreflexive y (w y) (transport (_< y) p l)
<-coarser-than-βΌ : is-transitive β {x y : X} β x < y β x βΌ y
<-coarser-than-βΌ t {x} {y} l u m = t u x y m l
βΌ-coarser-than-βΎ : (y : X) β is-accessible y β (x : X) β x βΌ y β x βΎ y
βΌ-coarser-than-βΎ y a x f l = βΎ-refl y a (f y l)
no-minimal-is-empty : is-well-founded
β β {π¦} (A : X β π¦ Μ )
β ((x : X) β A x β is-nonempty (Ξ£ y κ X , (y < x) Γ A y))
β is-empty (Ξ£ A)
no-minimal-is-empty w A s (x , p) = Ξ³
where
g : (x : X) β is-accessible x β Β¬ (A x)
g x (next x Ο) Ξ½ = Ξ΄
where
h : ¬¬ (Ξ£ y κ X , (y < x) Γ A y)
h = s x Ξ½
IH : (y : X) β y < x β Β¬ (A y)
IH y l = g y (Ο y l)
k : Β¬ (Ξ£ y κ X , (y < x) Γ A y)
k (y , l , a) = IH y l a
Ξ΄ : π
Ξ΄ = h k
f : ((x : X) β A x β ¬¬ (Ξ£ y κ X , (y < x) Γ A y))
β (x : X) β Β¬ (A x)
f s x p = g x (w x) p
Ξ³ : π
Ξ³ = f s x p
no-minimal-is-empty-weaker-version : is-well-founded
β β {π¦} (A : X β π¦ Μ )
β ((x : X) β A x β Ξ£ y κ X , (y < x) Γ A y)
β is-empty (Ξ£ A)
no-minimal-is-empty-weaker-version w A s =
no-minimal-is-empty w A (Ξ» x a β double-negation-intro (s x a))
\end{code}
The remainder of this file is not needed anywhere else (at least at
the time of writing, namely 11th January 2021).
\begin{code}
is-trichotomous : π€ β π₯ Μ
is-trichotomous = (x y : X) β (x < y) + (x β‘ y) + (y < x)
\end{code}
Not all ordinals are trichotomous, in the absence of excluded middle
or even just LPO, because ββ is not discrete unless LPO holds, but its
natural order is well-founded, and types with well-founded trichotomous
relations are discrete (have decidable equality):
\begin{code}
trichomous-gives-discrete : is-well-founded
β is-trichotomous
β is-discrete X
trichomous-gives-discrete w t x y = f (t x y)
where
f : (x < y) + (x β‘ y) + (y < x) β (x β‘ y) + (x β’ y)
f (inl l) = inr (<-gives-β’ w x y l)
f (inr (inl p)) = inl p
f (inr (inr l)) = inr (β’-sym (<-gives-β’ w y x l))
\end{code}
The following proof that excluded middle gives trichotomy, added 11th
Jan 2021, is the same as that in the HoTT book, except that we use
negation instead of the assumption of existence of propositional
truncations to get a proposition to which we can apply excluded
middle. But notice that, under excluded middle and function
extensionality, double negation is the same thing as propositional
truncation. Notice also we additionally need function extensionality
as an assumption (to know that the negation of a type is a
proposition).
\begin{code}
module _ (fe : Fun-Ext)
(em : Excluded-Middle)
where
trichotomy : is-well-order
β is-trichotomous
trichotomy (p , w , e , t) = Ξ³
where
P : X β X β π€ β π₯ Μ
P x y = (x < y) + (x β‘ y) + (y < x)
Ξ³ : (x y : X) β P x y
Ξ³ = transfinite-induction w (Ξ» x β β y β P x y) Ο
where
Ο : (x : X)
β ((x' : X) β x' < x β (y : X) β P x' y)
β (y : X) β P x y
Ο x IH-x = transfinite-induction w (Ξ» y β P x y) Ο
where
Ο : (y : X)
β ((y' : X) β y' < y β P x y')
β P x y
Ο y IH-y = Ξ΄
where
A = Ξ£ x' κ X , (x' < x) Γ ((y < x') + (x' β‘ y))
¬¬A-gives-P : ¬¬ A β P x y
¬¬A-gives-P = b
where
a : A β y < x
a (x' , l , inl m) = t y x' x m l
a (x' , l , inr p) = transport (_< x) p l
b : ¬¬ A β (x < y) + (x β‘ y) + (y < x)
b = inr β inr β EM-gives-DNE em (y < x) (p y x) β ¬¬-functor a
Β¬A-gives-βΌ : Β¬ A β x βΌ y
Β¬A-gives-βΌ Ξ½ x' l = d
where
a : Β¬ ((y < x') + (x' β‘ y))
a f = Ξ½ (x' , l , f)
b : P x' y
b = IH-x x' l y
c : Β¬ ((y < x') + (x' β‘ y)) β P x' y β x' < y
c g (inl i) = i
c g (inr (inl ii)) = π-elim (g (inr ii))
c g (inr (inr iii)) = π-elim (g (inl iii))
d : x' < y
d = c a b
B = Ξ£ y' κ X , (y' < y) Γ ((x < y') + (x β‘ y'))
¬¬B-gives-P : ¬¬ B β P x y
¬¬B-gives-P = b
where
a : B β x < y
a (y' , l , inl m) = t x y' y m l
a (y' , l , inr p) = transport (_< y) (p β»ΒΉ) l
b : ¬¬ B β (x < y) + (x β‘ y) + (y < x)
b = inl β EM-gives-DNE em (x < y) (p x y) β ¬¬-functor a
Β¬B-gives-βΌ : Β¬ B β y βΌ x
Β¬B-gives-βΌ Ξ½ y' l = d
where
a : Β¬ ((x < y') + (x β‘ y'))
a f = Ξ½ (y' , l , f)
b : P x y'
b = IH-y y' l
c : Β¬ ((x < y') + (x β‘ y')) β P x y' β y' < x
c g (inl i) = π-elim (g (inl i))
c g (inr (inl ii)) = π-elim (g (inr ii))
c g (inr (inr iii)) = iii
d : y' < x
d = c a b
Β¬A-and-Β¬B-give-P : Β¬ A β Β¬ B β P x y
Β¬A-and-Β¬B-give-P Ξ½ Ξ½' = b
where
a : Β¬ A β Β¬ B β x β‘ y
a Ξ½ Ξ½' = e x y (Β¬A-gives-βΌ Ξ½) (Β¬B-gives-βΌ Ξ½')
b : (x < y) + (x β‘ y) + (y < x)
b = inr (inl (a Ξ½ Ξ½'))
Ξ΄ : P x y
Ξ΄ = Cases (em (Β¬ A) (negations-are-props fe))
(Ξ» (Ξ½ : Β¬ A)
β Cases (em (Β¬ B) (negations-are-props fe))
(Β¬A-and-Β¬B-give-P Ξ½)
¬¬B-gives-P)
¬¬A-gives-P
\end{code}
Because we assume function extensionality and excluded middle in this
annonymous submodule, propositional truncations are available, and it
amounts to double negation.
\begin{code}
open import UF-PropTrunc
open PropositionalTruncation (fem-proptrunc (Ξ» π€ π₯ β fe {π€} {π₯}) em)
nonempty-has-minimal : is-well-order
β (A : X β π¦ Μ )
β ((x : X) β is-prop (A x))
β β x κ X , A x
β Ξ£ x κ X , A x Γ ((y : X) β A y β x βΎ y)
nonempty-has-minimal {π¦} W A A-is-prop-valued f = Ξ³
where
B : π€ β π₯ β π¦ Μ
B = Ξ£ x κ X , A x Γ ((y : X) β A y β x βΎ y)
g : Β¬ ((x : X) β A x β β y κ X , (y < x) Γ A y)
g = contrapositive (no-minimal-is-empty (well-foundedness W) A) f
h : β x κ X , Β¬ (A x β β y κ X , (y < x) Γ A y)
h = not-Ξ -implies-not-not-Ξ£
(Ξ» x β EM-gives-DNE em
(A x β β y κ X , (y < x) Γ A y)
(Ξ β-is-prop fe (Ξ» _ _ β π-is-prop)))
g
Ο : (x : X)
β Β¬ (A x β β y κ X , (y < x) Γ A y)
β A x Γ ((y : X) β A y β x βΎ y)
Ο x Ο = EM-gives-DNE em (A x)
(A-is-prop-valued x)
((Ξ» Ξ½ β Ο (Ξ» a _ β Ξ½ a))) ,
Ξ» y a l β Ο (Ξ» _ Ξ½ β Ξ½ (y , l , a))
δ : ¬¬ B
Ξ΄ = ¬¬-functor (Ξ» (x , f) β x , Ο x f) h
j : (x : X) β is-prop ((y : X) β A y β x βΎ y)
j x = Ξ β-is-prop fe (Ξ» x a l β π-is-prop)
i : (x : X) β is-prop (A x Γ ((y : X) β A y β x βΎ y))
i x = Γ-is-prop (A-is-prop-valued x) (j x)
B-is-prop : is-prop B
B-is-prop (x , a , f) (x' , a' , f') = to-subtype-β‘ i q
where
q : x β‘ x'
q = k (trichotomy W x x')
where
k : (x < x') + (x β‘ x') + (x' < x) β x β‘ x'
k (inl l) = π-elim (f' x a l)
k (inr (inl p)) = p
k (inr (inr l)) = π-elim (f x' a' l)
Ξ³ : B
Ξ³ = EM-gives-DNE em B B-is-prop Ξ΄
\end{code}
When do we get x βΎ y β x βΌ y (say for ordinals)? When do we get
cotransitivity? Jean S. Josef observed that cotransitivity gives x βΎ y
β x βΌ y if _<_ is an order. But cotransitivity alone is enough.
Or consider the truncated version of the following, if _<_ is
proposition valued.
\begin{code}
cotransitive : π€ β π₯ Μ
cotransitive = (x y z : X) β x < y β (x < z) + (z < y)
cotransitive-βΎ-coarser-than-βΌ : cotransitive β (x y : X) β x βΎ y β x βΌ y
cotransitive-βΎ-coarser-than-βΌ c x y n u l = Ξ³ (c u x y l)
where
Ξ³ : (u < y) + (y < x) β u < y
Ξ³ (inl l) = l
Ξ³ (inr l) = π-elim (n l)
\end{code}
This is the end of the submodule with the assumption of excluded
middle.
Originally, in 2011 (see my JSL publication), we needed to work with
the following weakening of well-foundedness (transfinite induction for
detachable subsets), but as of Summer 2018, it is not needed any
longer as we are able to show that our compact ordinals are
well-founded in the standard, stronger, sense.
\begin{code}
is-well-foundedβ : π€ β π₯ Μ
is-well-foundedβ = (p : X β π) β ((x : X) β ((y : X) β y < x β p y β‘ β) β p x β‘ β)
β (x : X) β p x β‘ β
well-founded-Wellfoundedβ : is-well-founded β is-well-foundedβ
well-founded-Wellfoundedβ w p = transfinite-induction w (Ξ» x β p x β‘ β)
open import UF-Miscelanea
being-well-foundedβ-is-prop : FunExt β is-prop is-well-foundedβ
being-well-foundedβ-is-prop fe = Ξ β-is-prop (Ξ» {π€} {π₯} β fe π€ π₯)
(Ξ» p s x β π-is-set)
is-well-orderβ : π€ β π₯ Μ
is-well-orderβ = is-prop-valued Γ is-well-foundedβ Γ is-extensional Γ is-transitive
is-well-order-gives-is-well-orderβ : is-well-order β is-well-orderβ
is-well-order-gives-is-well-orderβ (p , w , e , t) = p , (well-founded-Wellfoundedβ w) , e , t
being-well-orderβ-is-prop : FunExt β is-prop-valued β is-prop is-well-orderβ
being-well-orderβ-is-prop fe isp = Γβ-is-prop
(Ξ β-is-prop (Ξ» {π€} {π₯} β fe π€ π₯)
(Ξ» x y β being-prop-is-prop (fe π₯ π₯)))
(being-well-foundedβ-is-prop fe)
(extensionality-is-prop fe isp)
(transitivity-is-prop fe isp)
\end{code}
Experimental ideas. We don't truncate the Ξ£, at least not for the
moment, so x <β y won't be a proposition (i.e. subsingleton) in
general. However, given π-order-separation, this is logically
equivalent to a proposition (has split support).
\begin{code}
open import Two-Properties
_βΊβ_ : X β X β π€ β π₯ Μ
x βΊβ y = Ξ£ p κ (X β π) , (p x <β p y)
Γ ((u v : X) β (u < v β p u β€β p v)
Γ (p u <β p v β u < v))
βΊβ-courser-than-< : (x y : X) β x βΊβ y β x < y
βΊβ-courser-than-< x y (p , l , Ο) = prβ (Ο x y) l
π-order-separated : π€ β π₯ Μ
π-order-separated = (x y : X) β x < y β x βΊβ y
π-order-separated-gives-cotransitive : π-order-separated β cotransitive
π-order-separated-gives-cotransitive s x y z l = g (s x y l)
where
g : (Ξ£ p κ (X β π) , (p x <β p y)
Γ ((u v : X) β (u < v β p u β€β p v)
Γ (p u <β p v β u < v)))
β (x < z) + (z < y)
g (p , (r , s) , Ο) = Cases (π-is-discrete (p z) β)
(Ξ» (t : p z β‘ β)
β inr (prβ (Ο z y) (t , s)))
(Ξ» (t : Β¬ (p z β‘ β))
β inl (prβ (Ο x z) (r , (different-from-β-equal-β t))))
\end{code}
It seems that this is not going to be useful, because although ββ
satisfies this property, the property doesn't seem to be preserved by
the lexicographic order (think about this).