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).