Martin Escardo, 29 June 2018 To get closure under sums constructively, we need to restrict to particular kinds of ordinals. Having a top element is a simple sufficient condition, which holds in the applications we have in mind (for compact ordinals). Classically, ordinals with a top element are precisely the successor ordinals. Constructively, ℕ∞ is an example of an ordinal with a top element, which "is not" a successor ordinal, as its top element is not isolated. TODO. Generalize this from 𝓤₀ to an arbitrary universe. The (practical) problem is that the type of natural numbers is defined at 𝓤₀. We could (1) either using universe lifting, or (2) define the type in any universe (like we did for the the types 𝟘 and 𝟙). But (1) is cumbersome and (2) requires much work in other modules. \begin{code} {-# OPTIONS --safe --without-K #-} open import UF.FunExt module Ordinals.ToppedArithmetic (fe : FunExt) where open import UF.Subsingletons open import MLTT.Spartan open import CoNaturals.Type open import TypeTopology.SquashedSum fe open import Notation.CanonicalMap open import Ordinals.Type open import Ordinals.Arithmetic fe open import Ordinals.WellOrderArithmetic open import Ordinals.ToppedType fe open import Ordinals.Injectivity open import Ordinals.Underlying Ordᵀ = Ordinalᵀ 𝓤₀ succₒ : Ordinal 𝓤 → Ordinalᵀ 𝓤 succₒ α = α +ₒ 𝟙ₒ , plus.top-preservation (underlying-order α) (underlying-order 𝟙ₒ) (prop.topped 𝟙 𝟙-is-prop ⋆) succₒ-is-trichotomous : (α : Ordinal 𝓤) → is-trichotomous α → is-trichotomous [ succₒ α ] succₒ-is-trichotomous α t = +ₒ-is-trichotomous α 𝟙ₒ t 𝟙ₒ-is-trichotomous 𝟙ᵒ 𝟚ᵒ : Ordinalᵀ 𝓤 𝟙ᵒ = 𝟙ₒ , prop.topped 𝟙 𝟙-is-prop ⋆ 𝟚ᵒ = succₒ 𝟙ₒ ℕ∞ᵒ : Ordᵀ ℕ∞ᵒ = (ℕ∞ₒ , ∞ , ∞-top) \end{code} Sum of an ordinal-indexed family of ordinals: \begin{code} ∑ : (τ : Ordinalᵀ 𝓤) → (⟨ τ ⟩ → Ordinalᵀ 𝓤) → Ordinalᵀ 𝓤 ∑ {𝓤} ((X , _<_ , o) , t) υ = ((Σ x ꞉ X , ⟨ υ x ⟩) , Sum.order , Sum.well-order o (λ x → tis-well-ordered (υ x))) , Sum.top-preservation t where _≺_ : {x : X} → ⟨ υ x ⟩ → ⟨ υ x ⟩ → 𝓤 ̇ y ≺ z = y ≺⟨ υ _ ⟩ z module Sum = sum-top fe _<_ _≺_ (λ x → top (υ x)) (λ x → top-is-top (υ x)) ∑-is-trichotomous : (τ : Ordinalᵀ 𝓤) (υ : ⟨ τ ⟩ → Ordinalᵀ 𝓤) → is-trichotomous [ τ ] → ((x : ⟨ τ ⟩) → is-trichotomous [ υ x ]) → is-trichotomous [ ∑ τ υ ] ∑-is-trichotomous τ υ = sum.trichotomy-preservation _ _ \end{code} Addition and multiplication can be reduced to ∑, given the ordinal 𝟚ᵒ defined above: \begin{code} _+ᵒ_ : Ordinalᵀ 𝓤 → Ordinalᵀ 𝓤 → Ordinalᵀ 𝓤 τ +ᵒ υ = ∑ 𝟚ᵒ (cases (λ _ → τ) (λ _ → υ)) +ᵒ-is-trichotomous : (τ υ : Ordinalᵀ 𝓤) → is-trichotomous [ τ ] → is-trichotomous [ υ ] → is-trichotomous [ τ +ᵒ υ ] +ᵒ-is-trichotomous τ υ t u = ∑-is-trichotomous 𝟚ᵒ (cases (λ _ → τ) (λ _ → υ)) 𝟚ₒ-is-trichotomous (dep-cases (λ _ → t) (λ _ → u)) _×ᵒ_ : Ordinalᵀ 𝓤 → Ordinalᵀ 𝓤 → Ordinalᵀ 𝓤 τ ×ᵒ υ = ∑ τ (λ (_ : ⟨ τ ⟩) → υ) ×ᵒ-is-trichotomous : (τ υ : Ordinalᵀ 𝓤) → is-trichotomous [ τ ] → is-trichotomous [ υ ] → is-trichotomous [ τ ×ᵒ υ ] ×ᵒ-is-trichotomous τ υ t u = ∑-is-trichotomous τ (λ _ → υ) t (λ _ → u) \end{code} Extension of a family X → Ordᵀ along an embedding j : X → A to get a family A → Ordᵀ. (This can also be done for Ord-valued families.) This uses the module UF.InjectiveTypes to calculate Y / j. Sum of a countable family with an added non-isolated top element. We first extend the family to ℕ∞ and then take the ordinal-indexed sum of ordinals defined above. \begin{code} open topped-ordinals-injectivity fe ∑¹ : (ℕ → Ordᵀ) → Ordᵀ ∑¹ τ = ∑ ℕ∞ᵒ (τ ↗ embedding-ℕ-to-ℕ∞ (fe 𝓤₀ 𝓤₀)) \end{code} And now with an isolated top element: \begin{code} ∑₁ : (ℕ → Ordᵀ) → Ordᵀ ∑₁ τ = ∑ (succₒ ω) (τ ↗ (over , over-embedding)) \end{code} Added 4th May 2022. \begin{code} module Omega {𝓤} (pe : propext 𝓤) where open import Ordinals.OrdinalOfTruthValues fe 𝓤 pe open import Ordinals.Notions open import UF.SubtypeClassifier Ωᵒ : Ordinalᵀ (𝓤 ⁺) Ωᵒ = Ωₒ , ⊤ , h where h : is-top (underlying-order Ωₒ) ⊤ h y (p , _) = ⊥-is-not-⊤ (p ⁻¹) \end{code}