{-# OPTIONS --allow-unsolved-metas #-}
{-
0, 1, 2, 3, 4, ..., ω, ω + 1, ω + 2, ...,
^^^^^^^^^^^^^^^^^^ ^
these are natural ∞ is not a nat. numb.
numbers
ω + ω = ω·2, ..., ω·3, ..., ω·ω = ω², ..., ω³, ...,
ω^ω, ..., ω^(ω·2), ..., ω^(ω^ω), ..., ω^(ω^(ω^ω)), ...,
ω^(ω^(ω^…)) = ε₀, ε₀ + 1, ..., ε₀·2, ...,
ε₀^(ε₀^(ε₀^…)) = ε₁, ..., ε₂, ..., ε_ω, ..., ε_{ω+1}, ...,
ε_{ε₀}, ..., ε_{ε₁}, ..., ε_{ε₂}, ..., ε_{ε_{ε_…}} = ζ₀, ...
This is the beginning of the list of ordinal numbers.
The displayed numbers are still tiny in the sense that
each number has only countably many predeccesors.
-}
{-
Picture of ω:
:-) I I I I I ...
Picture of ω + 1:
+------------------+
:-) |I I I I I ...| I
+------------------+
Picture of ω + ω + 1:
+-------------+ +-------------+
:-) |I I I ... | |I I I ... | I
+-------------+ +-------------+
Picture of 1 + ω:
:-) I I I I I I ...
What do we know about ω + 1 vs. 1 + ω?
A: succ ω = ω + 1 > ω; 1 + ω = ω.
-}
{-
The three fundamental convictions regarding (countable)
ordinals numbers are:
1. Zero should exist.
2. Every number should have a successor.
3. Every (strictly ascending) sequence should have a limit.
For instance, ω is the limit of the sequence
0, 1, 2, 3, ...
|| || ||
f 0 f 1 f 2
Note: ω is also the limit of the sequence
0, 1, 2, 4, 8, 16, 32, ...
|| || || || ||
g 0 g 1 g 2 g 3 g 4
-}
data ℕ : Set where
zer : ℕ
suc : ℕ → ℕ
-- The type "Monotonic f" is the type of witnesses
-- that "f" is a strictly increasing sequence.
data O : Set
Monotonic : (ℕ → O) → Set
_<_ : O → O → Set
data _≤_ : O → O → Set
Monotonic f = (n : ℕ) → f n < f (suc n)
-- O is not precisely the type of ordinals,
-- but the type of representations of ordinals.
-- Many ordinals have more than one representation.
data O where
zero : O
succ : O → O
lim : (f : ℕ → O) → Monotonic f → O
x < y = succ x ≤ y
data _≤_ where
≤-zero : {x : O} → zero ≤ x
≤-succ-mon : {x y : O} → x ≤ y → succ x ≤ succ y
≤-trans : {x y z : O} → x ≤ y → y ≤ z → x ≤ z
≤-cocone : {f : ℕ → O} {fmon : Monotonic f} {x : O} {n : ℕ}
→ x ≤ f n → x ≤ lim f fmon
≤-limiting : {f : ℕ → O} {fmon : Monotonic f} {x : O}
→ ((n : ℕ) → f n ≤ x) → lim f fmon ≤ x
fromℕ : ℕ → O
fromℕ zer = zero
fromℕ (suc n) = succ (fromℕ n)
fromℕ-monotonic : Monotonic fromℕ
fromℕ-monotonic = {!!}
ω : O
ω = lim fromℕ fromℕ-monotonic
-- "ω is the limit of the sequence 0, 1, 2, ..."
ω' : O
ω' = lim (λ n → fromℕ (suc n)) {!!}
-- "ω' is the limit of the sequence 1, 2, 3, ..."
data ⊥ : Set where
_≡_ = {!!}
example₀ : ω ≡ ω' → ⊥
example₀ = {!!}
example₁ : ω ≤ ω'
example₁ = {!!}
example₂ : ω' ≤ ω
example₂ = {!!}
_+_ : O → O → O
x + zero = x
x + succ y = succ (x + y)
x + lim f fmon = lim (λ n → x + f n) {!!}
example₃ : ω < succ ω
example₃ = {!!}
example₄ : (succ zero + ω) ≤ ω
example₄ = {!!}