Alice Laroche, 25th September 2023 With additions by Fredrik Nordvall Forsberg on 9 October 2025 Fin n is an ordinal \begin{code} {-# OPTIONS --safe --without-K --lossy-unification #-} module Ordinals.Fin where open import Fin.Embeddings open import Fin.Order open import Fin.Type open import MLTT.Spartan open import MLTT.Plus-Properties open import Naturals.Addition renaming (_+_ to _+ℕ_) open import Naturals.Multiplication open import Naturals.Exponentiation open import Notation.Order open import Ordinals.Equivalence open import Ordinals.Maps open import Ordinals.Notions open import Ordinals.Type open import UF.Base open import UF.Equiv open import UF.FunExt open import UF.UA-FunExt open import UF.Univalence import Naturals.Order as ℕ <-is-prop-valued : (n : ℕ) → is-prop-valued {X = Fin n} _<_ <-is-prop-valued n i j = ℕ.<-is-prop-valued ⟦ i ⟧ ⟦ j ⟧ <-is-well-founded : (n : ℕ) → is-well-founded {X = Fin n} _<_ <-is-well-founded n i = recurs (ℕ.<-is-well-founded (⟦ i ⟧)) where recurs : {i : Fin n} → is-accessible {X = ℕ} _<_ (⟦ i ⟧) → is-accessible {X = Fin n} _<_ i recurs (acc rec₁) = acc (λ j r → recurs (rec₁ ⟦ j ⟧ r)) <-is-extensional : (n : ℕ) → is-extensional {X = Fin n} _<_ <-is-extensional (succ n) 𝟎 𝟎 i≼j j≼i = refl <-is-extensional (succ n) 𝟎 (suc x) i≼j j≼i = 𝟘-elim (j≼i 𝟎 ⋆) <-is-extensional (succ n) (suc i) 𝟎 i≼j j≼i = 𝟘-elim (i≼j 𝟎 ⋆) <-is-extensional (succ n) (suc i) (suc j) i≼j j≼i = ap suc (<-is-extensional n i j (i≼j ∘ suc) (j≼i ∘ suc)) <-trans : (n : ℕ) → is-transitive {X = Fin n} _<_ <-trans n i j k = ℕ.<-trans ⟦ i ⟧ ⟦ j ⟧ ⟦ k ⟧ <-is-well-order : (n : ℕ) → is-well-order {X = Fin n} _<_ <-is-well-order n = <-is-prop-valued n , <-is-well-founded n , <-is-extensional n , <-trans n Fin-ordinal : (n : ℕ) → Ord Fin-ordinal n = Fin n , _<_ , <-is-well-order n \end{code} Added 9 October 2025 by Fredrik Nordvall Forsberg. The construction of finite ordinals, from natural numbers to ordinals, preserves many arithmetical operations. \begin{code} module _ (ua : Univalence) where private fe : FunExt fe = Univalence-gives-FunExt ua fe' : Fun-Ext fe' {𝓤} {𝓥} = fe 𝓤 𝓥 open import Ordinals.Arithmetic fe open import Ordinals.AdditionProperties ua open import Ordinals.MultiplicationProperties ua open import Ordinals.OrdinalOfOrdinals ua Fin-ordinal-zero : Fin-ordinal 0 = 𝟘ₒ Fin-ordinal-zero = eqtoidₒ (ua _) fe' (Fin-ordinal 0) 𝟘ₒ (id , (λ x y l → 𝟘-elim x) , id-is-equiv 𝟘 , (λ x y l → 𝟘-elim x)) Fin-ordinal-succ : (n : ℕ) → Fin-ordinal (succ n) = 𝟙ₒ +ₒ Fin-ordinal n Fin-ordinal-succ n = eqtoidₒ (ua _) fe' α β (f , f-order-equiv) where α = Fin-ordinal (succ n) β = 𝟙ₒ +ₒ Fin-ordinal n f : Fin n + 𝟙 → 𝟙 + Fin n f = +-commutative f-equiv : is-equiv f f-equiv = qinvs-are-equivs f (g , ε , η) where g : 𝟙 + Fin n → Fin n + 𝟙 g = +-commutative ε : ∀ x → g (f x) = x ε (inl x) = refl ε (inr x) = refl η : ∀ x → f (g x) = x η (inl x) = refl η (inr x) = refl f-order-preserving : is-order-preserving α β f f-order-preserving (inl n) (inl m) l = l f-order-preserving (inr ⋆) (inl m) l = l f-order-reflecting : is-order-reflecting α β f f-order-reflecting (inl n) (inl m) l = l f-order-reflecting (inr ⋆) (inl m) l = l f-order-equiv : is-order-equiv α β f f-order-equiv = order-preserving-reflecting-equivs-are-order-equivs α β f f-equiv f-order-preserving f-order-reflecting \end{code} The construction of finite ordinals preserves addition. \begin{code} Fin-ordinal-+ₒ : (n m : ℕ) → Fin-ordinal (n +ℕ m) = Fin-ordinal n +ₒ Fin-ordinal m Fin-ordinal-+ₒ zero m = F (0 +ℕ m) =⟨ ap F (zero-left-neutral m) ⟩ F m =⟨ 𝟘ₒ-left-neutral (F m) ⁻¹ ⟩ 𝟘ₒ +ₒ F m =⟨ ap (_+ₒ F m) Fin-ordinal-zero ⁻¹ ⟩ F zero +ₒ F m ∎ where F = Fin-ordinal Fin-ordinal-+ₒ (succ n) m = F (succ n +ℕ m) =⟨ ap F (succ-left n m) ⟩ F (succ (n +ℕ m)) =⟨ Fin-ordinal-succ (n +ℕ m) ⟩ 𝟙ₒ +ₒ F (n +ℕ m) =⟨ ap (𝟙ₒ +ₒ_) (Fin-ordinal-+ₒ n m) ⟩ 𝟙ₒ +ₒ (F n +ₒ F m) =⟨ +ₒ-assoc 𝟙ₒ (F n) (F m) ⁻¹ ⟩ (𝟙ₒ +ₒ F n) +ₒ F m =⟨ ap (_+ₒ F m) (Fin-ordinal-succ n ⁻¹) ⟩ F (succ n) +ₒ F m ∎ where F = Fin-ordinal Fin-ordinal-one : Fin-ordinal 1 = 𝟙ₒ Fin-ordinal-one = Fin-ordinal 1 =⟨ Fin-ordinal-succ 0 ⟩ 𝟙ₒ +ₒ Fin-ordinal 0 =⟨ ap (𝟙ₒ +ₒ_) Fin-ordinal-zero ⟩ 𝟙ₒ +ₒ 𝟘ₒ =⟨ 𝟘ₒ-right-neutral 𝟙₀ ⟩ 𝟙ₒ ∎ Fin-ordinal-succ' : (n : ℕ) → Fin-ordinal (succ n) = Fin-ordinal n +ₒ 𝟙ₒ Fin-ordinal-succ' n = Fin-ordinal (succ n) =⟨ refl ⟩ Fin-ordinal (n +ℕ 1) =⟨ Fin-ordinal-+ₒ n 1 ⟩ Fin-ordinal n +ₒ Fin-ordinal 1 =⟨ ap (Fin-ordinal n +ₒ_) Fin-ordinal-one ⟩ Fin-ordinal n +ₒ 𝟙ₒ ∎ Fin-ordinal-two : Fin-ordinal 2 = 𝟚ₒ Fin-ordinal-two = Fin-ordinal-succ' 1 ∙ ap (_+ₒ 𝟙ₒ) Fin-ordinal-one Fin-ordinal-three : Fin-ordinal 3 = 𝟛ₒ Fin-ordinal-three = Fin-ordinal-succ' 2 ∙ ap (_+ₒ 𝟙ₒ) Fin-ordinal-two \end{code} The construction of finite ordinals preserves multiplication. \begin{code} Fin-ordinal-×ₒ : (n m : ℕ) → Fin-ordinal (n * m) = Fin-ordinal n ×ₒ Fin-ordinal m Fin-ordinal-×ₒ n zero = transport⁻¹ (λ - → - = Fin-ordinal n ×ₒ -) Fin-ordinal-zero (×ₒ-𝟘ₒ-right (Fin-ordinal n) ⁻¹) Fin-ordinal-×ₒ n (succ m) = F (n +ℕ n * m) =⟨ Fin-ordinal-+ₒ n (n * m) ⟩ F n +ₒ F (n * m) =⟨ ap (F n +ₒ_) (Fin-ordinal-×ₒ n m) ⟩ F n +ₒ F n ×ₒ F m =⟨ I ⟩ F n ×ₒ 𝟙₀ +ₒ F n ×ₒ F m =⟨ ×ₒ-distributes-+ₒ-right (F n) 𝟙ₒ (F m) ⁻¹ ⟩ F n ×ₒ (𝟙₀ +ₒ F m) =⟨ ap (F n ×ₒ_) (Fin-ordinal-succ m ⁻¹) ⟩ F n ×ₒ F (succ m) ∎ where F = Fin-ordinal I = ap (_+ₒ F n ×ₒ F m) (𝟙ₒ-right-neutral-×ₒ (F n) ⁻¹) \end{code} The construction of finite ordinals is order preserving. \begin{code} Fin-ordinal-preserves-≤ : {n m : ℕ} → n ≤ m → Fin-ordinal n ⊴ Fin-ordinal m Fin-ordinal-preserves-≤ {zero} {m} l = transport⁻¹ (_⊴ Fin-ordinal m) Fin-ordinal-zero (𝟘ₒ-least-⊴ (Fin-ordinal m)) Fin-ordinal-preserves-≤ {succ n} {succ m} l = transport₂⁻¹ _⊴_ (Fin-ordinal-succ n) (Fin-ordinal-succ m) (+ₒ-right-monotone-⊴ 𝟙ₒ (Fin-ordinal n) (Fin-ordinal m) (Fin-ordinal-preserves-≤ l)) Fin-ordinal-succ-positive : (n : ℕ) → 𝟙ₒ ⊴ Fin-ordinal (succ n) Fin-ordinal-succ-positive n = transport (_⊴ Fin-ordinal (succ n)) Fin-ordinal-one (Fin-ordinal-preserves-≤ ⋆) \end{code} The construction of finite ordinals preserves exponentiation whenever the base is positive. \begin{code} open import UF.PropTrunc open import UF.Size module _ (pt : propositional-truncations-exist) (sr : Set-Replacement pt) where open import Ordinals.Exponentiation.Supremum ua pt sr Fin-ordinal-^ₒ : (n m : ℕ) → let n' = succ n in Fin-ordinal (n' ℕ^ m) = Fin-ordinal n' ^ₒ Fin-ordinal m Fin-ordinal-^ₒ n zero = Fin-ordinal (succ n ℕ^ zero) =⟨ refl ⟩ Fin-ordinal 1 =⟨ Fin-ordinal-one ⟩ 𝟙₀ =⟨ I ⟩ Fin-ordinal (succ n) ^ₒ 𝟘ₒ =⟨ II ⟩ Fin-ordinal (succ n) ^ₒ Fin-ordinal zero ∎ where I = ^ₒ-satisfies-zero-specification (Fin-ordinal (succ n)) ⁻¹ II = ap (Fin-ordinal (succ n) ^ₒ_) (Fin-ordinal-zero ⁻¹) Fin-ordinal-^ₒ n (succ m) = Fin-ordinal (n' ℕ^ succ m) =⟨ refl ⟩ Fin-ordinal (n' * n' ℕ^ m) =⟨ I ⟩ Fin-ordinal (n' ℕ^ m * n') =⟨ II ⟩ Fin-ordinal (n' ℕ^ m) ×ₒ Fin-ordinal n' =⟨ III ⟩ Fin-ordinal n' ^ₒ Fin-ordinal m ×ₒ Fin-ordinal n' =⟨ IV ⟩ Fin-ordinal n' ^ₒ (Fin-ordinal m +ₒ 𝟙₀) =⟨ V ⟩ Fin-ordinal n' ^ₒ Fin-ordinal (succ m) ∎ where n' = succ n I = ap Fin-ordinal (mult-commutativity n' (n' ℕ^ m)) II = Fin-ordinal-×ₒ (n' ℕ^ m) n' III = ap (_×ₒ Fin-ordinal n') (Fin-ordinal-^ₒ n m) IV = ^ₒ-satisfies-succ-specification (Fin-ordinal n') (Fin-ordinal-succ-positive n) (Fin-ordinal m) ⁻¹ V = ap (Fin-ordinal n' ^ₒ_) (Fin-ordinal-succ' m ⁻¹) \end{code}