Martin Escardo, 29 June 2018
The type Ordinals of ordinals in a universe 𝓤, and the subtype Ordinalsᵀ of
ordinals with a top element.
\begin{code}
{-# OPTIONS --without-K --exact-split --safe --auto-inline #-}
open import MLTT.Spartan
open import Ordinals.Underlying
open import Ordinals.Notions
open import UF.Base
open import UF.Embeddings
open import UF.FunExt
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
module Ordinals.Type where
\end{code}
An ordinal is a type equipped with ordinal structure. Such a type is
automatically a set.
\begin{code}
OrdinalStructure : 𝓤 ̇ → 𝓤 ⁺ ̇
OrdinalStructure {𝓤} X = Σ _<_ ꞉ (X → X → 𝓤 ̇ ) , (is-well-order _<_)
Ordinal : ∀ 𝓤 → 𝓤 ⁺ ̇
Ordinal 𝓤 = Σ X ꞉ 𝓤 ̇ , OrdinalStructure X
Ord = Ordinal 𝓤₀
\end{code}
NB. Perhaps we will eventually need to have two parameters 𝓤 (the
universe where the underlying type X lives) and 𝓥 (the universe where
_<_ takes values in) for Ordinal.
Ordinals are ranged over by α,β,γ.
The underlying type of an ordinal (which happens to be necessarily a
set):
\begin{code}
instance
underlying-type-of-ordinal : Underlying (Ordinal 𝓤)
⟨_⟩ {{underlying-type-of-ordinal}} (X , _) = X
underlying-order {{underlying-type-of-ordinal}} (X , _<_ , o) = _<_
structure : (α : Ordinal 𝓤) → OrdinalStructure ⟨ α ⟩
structure (X , s) = s
is-trichotomous : Ordinal 𝓤 → 𝓤 ̇
is-trichotomous α = is-trichotomous-order (underlying-order α)
is-well-ordered : (α : Ordinal 𝓤) → is-well-order (underlying-order α)
is-well-ordered (X , _<_ , o) = o
Prop-valuedness : (α : Ordinal 𝓤) → is-prop-valued (underlying-order α)
Prop-valuedness α = prop-valuedness (underlying-order α) (is-well-ordered α)
Reflexivity : (α : Ordinal 𝓤) {x : ⟨ α ⟩} → x ≼⟨ α ⟩ x
Reflexivity α = ≼-refl (underlying-order α)
Transitivity : (α : Ordinal 𝓤) → is-transitive (underlying-order α)
Transitivity α = transitivity (underlying-order α) (is-well-ordered α)
Well-foundedness : (α : Ordinal 𝓤) (x : ⟨ α ⟩) → is-accessible (underlying-order α) x
Well-foundedness α = well-foundedness (underlying-order α) (is-well-ordered α)
Transfinite-induction : (α : Ordinal 𝓤)
→ (P : ⟨ α ⟩ → 𝓦 ̇ )
→ ((x : ⟨ α ⟩)
→ ((y : ⟨ α ⟩) → y ≺⟨ α ⟩ x → P y) → P x)
→ (x : ⟨ α ⟩) → P x
Transfinite-induction α = transfinite-induction
(underlying-order α)
(Well-foundedness α)
Transfinite-recursion : (α : Ordinal 𝓤) {Y : 𝓥 ̇ }
→ ((x : ⟨ α ⟩)
→ ((y : ⟨ α ⟩) → y ≺⟨ α ⟩ x → Y) → Y)
→ ⟨ α ⟩ → Y
Transfinite-recursion α = transfinite-recursion
(underlying-order α)
(Well-foundedness α)
\end{code}
Added 31 October 2022 by Tom de Jong.
We record the (computational) behaviour of transfinite induction for use in
other constructions.
\begin{code}
Transfinite-induction-behaviour : FunExt
→ (α : Ordinal 𝓤)
→ (P : ⟨ α ⟩ → 𝓦 ̇ )
→ (f : (x : ⟨ α ⟩) → ((y : ⟨ α ⟩) → y ≺⟨ α ⟩ x → P y) → P x)
→ (x : ⟨ α ⟩)
→ Transfinite-induction α P f x
= f x (λ y l → Transfinite-induction α P f y)
Transfinite-induction-behaviour fe α = transfinite-induction-behaviour
(underlying-order α) fe
(Well-foundedness α)
\end{code}
End of addition.
\begin{code}
Transfinite-recursion-behaviour : FunExt
→ (α : Ordinal 𝓤)
→ {Y : 𝓥 ̇ }
→ (f : (x : ⟨ α ⟩) → ((y : ⟨ α ⟩) → y ≺⟨ α ⟩ x → Y) → Y)
→ (x : ⟨ α ⟩)
→ Transfinite-recursion α f x
= f x (λ y l → Transfinite-recursion α f y)
Transfinite-recursion-behaviour fe α =
transfinite-recursion-behaviour (underlying-order α) fe (Well-foundedness α)
Extensionality : (α : Ordinal 𝓤) → is-extensional (underlying-order α)
Extensionality α = extensionality (underlying-order α) (is-well-ordered α)
Antisymmetry : (α : Ordinal 𝓤) (x y : ⟨ α ⟩) → x ≼⟨ α ⟩ y → y ≼⟨ α ⟩ x → x = y
Antisymmetry = Extensionality
underlying-type-is-set : FunExt
→ (α : Ordinal 𝓤)
→ is-set ⟨ α ⟩
underlying-type-is-set fe α =
extensionally-ordered-types-are-sets
(underlying-order α)
fe
(Prop-valuedness α)
(Extensionality α)
is-least : (α : Ordinal 𝓤) → ⟨ α ⟩ → 𝓤 ̇
is-least α x = (y : ⟨ α ⟩) → x ≼⟨ α ⟩ y
being-least-is-prop : Fun-Ext → (α : Ordinal 𝓤) (x : ⟨ α ⟩) → is-prop (is-least α x)
being-least-is-prop fe α x = Π₃-is-prop fe (λ y u _ → Prop-valuedness α u y)
at-most-one-least : (α : Ordinal 𝓤) (x y : ⟨ α ⟩)
→ is-least α x
→ is-least α y
→ x = y
at-most-one-least α x y l l' = Antisymmetry α x y (l y) (l' x)
has-least : Ordinal 𝓤 → 𝓤 ̇
has-least α = Σ ⊥ ꞉ ⟨ α ⟩ , is-least α ⊥
having-least-is-prop : Fun-Ext → (α : Ordinal 𝓤) → is-prop (has-least α)
having-least-is-prop fe α (⊥ , l) (⊥' , l') =
to-subtype-=
(being-least-is-prop fe α)
(at-most-one-least α ⊥ ⊥' l l')
is-largest : (α : Ordinal 𝓤) → ⟨ α ⟩ → 𝓤 ̇
is-largest α x = (y : ⟨ α ⟩) → y ≼⟨ α ⟩ x
being-largest-is-prop : Fun-Ext → (α : Ordinal 𝓤) (x : ⟨ α ⟩) → is-prop (is-largest α x)
being-largest-is-prop fe α x = Π₃-is-prop fe (λ y u _ → Prop-valuedness α u x)
at-most-one-largest : (α : Ordinal 𝓤) (x y : ⟨ α ⟩)
→ is-largest α x
→ is-largest α y
→ x = y
at-most-one-largest α x y l l' = Antisymmetry α x y (l' x) (l y)
has-largest : Ordinal 𝓤 → 𝓤 ̇
has-largest α = Σ ⊤ ꞉ ⟨ α ⟩ , is-largest α ⊤
having-largest-is-prop : Fun-Ext → (α : Ordinal 𝓤) → is-prop (has-largest α)
having-largest-is-prop fe α (⊥ , l) (⊥' , l') =
to-subtype-=
(being-largest-is-prop fe α)
(at-most-one-largest α ⊥ ⊥' l l')
\end{code}
TODO. We should add further properties of the order from the module
OrdinalNotions. For the moment, we add this:
\begin{code}
irrefl : (α : Ordinal 𝓤) (x : ⟨ α ⟩) → ¬(x ≺⟨ α ⟩ x)
irrefl α x = irreflexive (underlying-order α) x (Well-foundedness α x)
≼-gives-≾ : (α : Ordinal 𝓤) (x y : ⟨ α ⟩) → x ≼⟨ α ⟩ y → x ≾⟨ α ⟩ y
≼-gives-≾ {𝓤} α x y = ≼-coarser-than-≾ (underlying-order α)
y (Well-foundedness α y) x
\end{code}
Characterization of equality of ordinals using the structure identity
principle:
\begin{code}
open import UF.Equiv
open import UF.Univalence
Ordinal-= : FunExt
→ is-univalent 𝓤
→ (α β : Ordinal 𝓤)
→ (α = β)
≃ (Σ f ꞉ (⟨ α ⟩ → ⟨ β ⟩) ,
is-equiv f
× ((λ x x' → x ≺⟨ α ⟩ x') = (λ x x' → f x ≺⟨ β ⟩ f x')))
Ordinal-= {𝓤} fe = generalized-metric-space.characterization-of-M-= (𝓤 ̇ )
(λ _ → is-well-order)
(λ X _<_ → being-well-order-is-prop _<_ fe)
where
open import UF.SIP-Examples
\end{code}
Often it is convenient to work with the following alternative notion _≃ₒ_
of ordinal equivalence, which we take as the official one:
\begin{code}
is-order-preserving : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
→ (⟨ α ⟩ → ⟨ β ⟩) → 𝓤 ⊔ 𝓥 ̇
is-order-preserving α β f = (x y : ⟨ α ⟩) → x ≺⟨ α ⟩ y → f x ≺⟨ β ⟩ f y
is-order-equiv : (α : Ordinal 𝓤) (β : Ordinal 𝓥) → (⟨ α ⟩ → ⟨ β ⟩) → 𝓤 ⊔ 𝓥 ̇
is-order-equiv α β f = is-order-preserving α β f
× (Σ e ꞉ is-equiv f , is-order-preserving β α (inverse f e))
order-equivs-are-order-preserving : (α : Ordinal 𝓤) (β : Ordinal 𝓥) {f : ⟨ α ⟩ → ⟨ β ⟩}
→ is-order-equiv α β f
→ is-order-preserving α β f
order-equivs-are-order-preserving α β = pr₁
order-equivs-are-equivs : (α : Ordinal 𝓤) (β : Ordinal 𝓥) {f : ⟨ α ⟩ → ⟨ β ⟩}
→ (i : is-order-equiv α β f)
→ is-equiv f
order-equivs-are-equivs α β = pr₁ ∘ pr₂
_≃ₒ_ : Ordinal 𝓤 → Ordinal 𝓥 → 𝓤 ⊔ 𝓥 ̇
α ≃ₒ β = Σ f ꞉ (⟨ α ⟩ → ⟨ β ⟩) , is-order-equiv α β f
\end{code}
See the module for a proof that α ≃ₒ β is canonically equivalent to
α = β. (For historical reasons, that proof doesn't use the structure
identity principle.)
\begin{code}
≃ₒ-refl : (α : Ordinal 𝓤) → α ≃ₒ α
≃ₒ-refl α = id , (λ x y → id) , id-is-equiv ⟨ α ⟩ , (λ x y → id)
≃ₒ-sym : (α : Ordinal 𝓤) (β : Ordinal 𝓥 )
→ α ≃ₒ β → β ≃ₒ α
≃ₒ-sym α β (f , p , e , q) = inverse f e , q , inverses-are-equivs f e , p
≃ₒ-trans : ∀ {𝓤} {𝓥} {𝓦} (α : Ordinal 𝓤) (β : Ordinal 𝓥 ) (γ : Ordinal 𝓦)
→ α ≃ₒ β → β ≃ₒ γ → α ≃ₒ γ
≃ₒ-trans α β γ (f , p , e , q) (f' , p' , e' , q') =
f' ∘ f ,
(λ x y l → p' (f x) (f y) (p x y l)) ,
∘-is-equiv e e' ,
(λ x y l → q (inverse f' e' x) (inverse f' e' y) (q' x y l))
≃ₒ-to-fun : (α : Ordinal 𝓤) (β : Ordinal 𝓥) → α ≃ₒ β → ⟨ α ⟩ → ⟨ β ⟩
≃ₒ-to-fun α β = pr₁
≃ₒ-to-fun-is-order-equiv : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (e : α ≃ₒ β)
→ is-order-equiv α β (≃ₒ-to-fun α β e)
≃ₒ-to-fun-is-order-equiv α β = pr₂
≃ₒ-to-fun-is-equiv : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (e : α ≃ₒ β)
→ is-equiv (≃ₒ-to-fun α β e)
≃ₒ-to-fun-is-equiv α β e = order-equivs-are-equivs α β (≃ₒ-to-fun-is-order-equiv α β e)
inverses-of-order-equivs-are-order-preserving : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
{f : ⟨ α ⟩ → ⟨ β ⟩}
→ (i : is-order-equiv α β f)
→ is-order-preserving β α
(inverse f (order-equivs-are-equivs α β i))
inverses-of-order-equivs-are-order-preserving α β = pr₂ ∘ pr₂
is-order-reflecting : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
→ (⟨ α ⟩ → ⟨ β ⟩) → 𝓤 ⊔ 𝓥 ̇
is-order-reflecting α β f = (x y : ⟨ α ⟩) → f x ≺⟨ β ⟩ f y → x ≺⟨ α ⟩ y
order-preserving-reflecting-equivs-are-order-equivs : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
(f : ⟨ α ⟩ → ⟨ β ⟩)
→ is-equiv f
→ is-order-preserving α β f
→ is-order-reflecting α β f
→ is-order-equiv α β f
order-preserving-reflecting-equivs-are-order-equivs α β f e p r = p , e , q
where
g : ⟨ β ⟩ → ⟨ α ⟩
g = inverse f e
q : is-order-preserving β α g
q x y l = m
where
l' : f (g x) ≺⟨ β ⟩ f (g y)
l' = transport₂ (λ x y → x ≺⟨ β ⟩ y)
((inverses-are-sections f e x)⁻¹) ((inverses-are-sections f e y)⁻¹) l
s : f (g x) ≺⟨ β ⟩ f (g y) → g x ≺⟨ α ⟩ g y
s = r (g x) (g y)
m : g x ≺⟨ α ⟩ g y
m = s l'
order-equivs-are-order-reflecting : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (f : ⟨ α ⟩ → ⟨ β ⟩)
→ is-order-equiv α β f
→ is-order-reflecting α β f
order-equivs-are-order-reflecting α β f (p , e , q) x y l = r
where
g : ⟨ β ⟩ → ⟨ α ⟩
g = inverse f e
s : g (f x) ≺⟨ α ⟩ g (f y)
s = q (f x) (f y) l
r : x ≺⟨ α ⟩ y
r = transport₂ (λ x y → x ≺⟨ α ⟩ y)
(inverses-are-retractions f e x) (inverses-are-retractions f e y) s
inverses-of-order-equivs-are-order-reflecting : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
{f : ⟨ α ⟩ → ⟨ β ⟩}
→ (i : is-order-equiv α β f)
→ is-order-reflecting β α
(inverse f (order-equivs-are-equivs α β i))
inverses-of-order-equivs-are-order-reflecting α β {f} (p , e , q) =
order-equivs-are-order-reflecting β α (inverse f e) (q , inverses-are-equivs f e , p)
inverses-of-order-equivs-are-order-equivs : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
{f : ⟨ α ⟩ → ⟨ β ⟩}
→ (i : is-order-equiv α β f)
→ is-order-equiv β α
(inverse f (order-equivs-are-equivs α β i))
inverses-of-order-equivs-are-order-equivs α β {f} (p , e , q) =
(q , inverses-are-equivs f e , p)
≃ₒ-to-fun⁻¹ : (α : Ordinal 𝓤) (β : Ordinal 𝓥) → α ≃ₒ β → ⟨ β ⟩ → ⟨ α ⟩
≃ₒ-to-fun⁻¹ α β e = inverse (≃ₒ-to-fun α β e)
(order-equivs-are-equivs α β
(≃ₒ-to-fun-is-order-equiv α β e))
≃ₒ-to-fun⁻¹-is-equiv : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (e : α ≃ₒ β)
→ is-equiv (≃ₒ-to-fun⁻¹ α β e)
≃ₒ-to-fun⁻¹-is-equiv α β e = inverses-are-equivs (≃ₒ-to-fun α β e)
(≃ₒ-to-fun-is-equiv α β e)
order-equivs-preserve-largest : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
→ (f : ⟨ α ⟩ → ⟨ β ⟩)
→ is-order-equiv α β f
→ (x : ⟨ α ⟩)
→ is-largest α x
→ is-largest β (f x)
order-equivs-preserve-largest α β f (o , e , p) x ℓ = δ
where
f⁻¹ : ⟨ β ⟩ → ⟨ α ⟩
f⁻¹ = inverse f e
δ : (y : ⟨ β ⟩) → y ≼⟨ β ⟩ f x
δ y t l = IV
where
I : f⁻¹ t ≺⟨ α ⟩ f⁻¹ y
I = p t y l
II : f⁻¹ t ≺⟨ α ⟩ x
II = ℓ (f⁻¹ y) (f⁻¹ t) I
III : f (f⁻¹ t) ≺⟨ β ⟩ f x
III = o (f⁻¹ t) x II
IV : t ≺⟨ β ⟩ f x
IV = transport (λ - → - ≺⟨ β ⟩ f x) (inverses-are-sections f e t) III
\end{code}