-------------------------------------------------------------
- Three equivalent ordinal notation systems in Cubical Agda -
-------------------------------------------------------------
§3.1 The subset approach
Following the traditional subset approach, we construct a notation
system of ordinals below ε₀ as a Σ-type.
\begin{code}
{-# OPTIONS --cubical --safe #-}
module SigmaOrd where
open import Preliminaries
\end{code}
■ Binary trees (ordinal terms)
\begin{code}
infix 40 ω^_+_
data Tree : Type₀ where
𝟎 : Tree
ω^_+_ : Tree → Tree → Tree
private
variable a b c d : Tree
caseTree : {A : Type ℓ} (x y : A) → Tree → A
caseTree x y 𝟎 = x
caseTree x y (ω^ _ + _) = y
𝟎≢ω^+ : ¬ (𝟎 ≡ ω^ a + b)
𝟎≢ω^+ e = subst (caseTree Tree ⊥) e 𝟎
ω^+≢𝟎 : ¬ (ω^ a + b ≡ 𝟎)
ω^+≢𝟎 e = subst (caseTree ⊥ Tree) e 𝟎
fst : Tree → Tree
fst 𝟎 = 𝟎
fst (ω^ a + _) = a
rest : Tree → Tree
rest 𝟎 = 𝟎
rest (ω^ _ + b) = b
TreeIsDiscrete : Discrete Tree
TreeIsDiscrete 𝟎 𝟎 = yes refl
TreeIsDiscrete 𝟎 (ω^ _ + _) = no 𝟎≢ω^+
TreeIsDiscrete (ω^ _ + _) 𝟎 = no ω^+≢𝟎
TreeIsDiscrete (ω^ a + c) (ω^ b + d) with TreeIsDiscrete a b
TreeIsDiscrete (ω^ a + c) (ω^ b + d) | yes a=b with TreeIsDiscrete c d
TreeIsDiscrete (ω^ a + c) (ω^ b + d) | yes a=b | yes c=d = yes (cong₂ ω^_+_ a=b c=d)
TreeIsDiscrete (ω^ a + c) (ω^ b + d) | yes a=b | no c≠d = no (λ e → c≠d (cong rest e))
TreeIsDiscrete (ω^ a + c) (ω^ b + d) | no a≠b = no (λ e → a≠b (cong fst e))
TreeIsSet : isSet Tree
TreeIsSet = Discrete→isSet TreeIsDiscrete _ _
\end{code}
■ Ordering on trees
\begin{code}
infix 30 _<_ _≤_ _>_ _≥_
data _<_ : Tree → Tree → Type₀ where
<₁ : 𝟎 < ω^ a + b
<₂ : a < c → ω^ a + b < ω^ c + d
<₃ : a ≡ c → b < d → ω^ a + b < ω^ c + d
_>_ _≥_ _≤_ : Tree → Tree → Type₀
a > b = b < a
a ≥ b = a > b ⊎ a ≡ b
a ≤ b = b ≥ a
≥𝟎 : a ≥ 𝟎
≥𝟎 {𝟎} = inj₂ refl
≥𝟎 {ω^ a + b} = inj₁ <₁
<-irrefl : ¬ a < a
<-irrefl (<₂ r) = <-irrefl r
<-irrefl (<₃ _ r) = <-irrefl r
<-irreflexive : a ≡ b → ¬ a < b
<-irreflexive {a} p = subst (λ x → ¬ a < x) p <-irrefl
<IsPropValued : isProp (a < b)
<IsPropValued <₁ <₁ = refl
<IsPropValued (<₂ r) (<₂ s) = cong <₂ (<IsPropValued r s)
<IsPropValued (<₂ r) (<₃ q s) = ⊥-elim (<-irreflexive q r)
<IsPropValued (<₃ p r) (<₂ s) = ⊥-elim (<-irreflexive p s)
<IsPropValued (<₃ p r) (<₃ q s) = cong₂ <₃ (TreeIsSet p q) (<IsPropValued r s)
≤IsPropValued : isProp (a ≤ b)
≤IsPropValued (inj₁ r) (inj₁ s) = cong inj₁ (<IsPropValued r s)
≤IsPropValued (inj₁ r) (inj₂ q) = ⊥-elim (<-irreflexive (q ⁻¹) r)
≤IsPropValued (inj₂ p) (inj₁ s) = ⊥-elim (<-irreflexive (p ⁻¹) s)
≤IsPropValued (inj₂ p) (inj₂ q) = cong inj₂ (TreeIsSet p q)
\end{code}
■ Cantor normal form
\begin{code}
data isCNF : Tree → Type₀ where
𝟎IsCNF : isCNF 𝟎
ω^+IsCNF : isCNF a → isCNF b → a ≥ fst b
→ isCNF (ω^ a + b)
isCNFIsPropValued : isProp (isCNF a)
isCNFIsPropValued 𝟎IsCNF 𝟎IsCNF = refl
isCNFIsPropValued (ω^+IsCNF pa pb ra) (ω^+IsCNF qa qb rb) =
λ i → ω^+IsCNF (isCNFIsPropValued pa qa i) (isCNFIsPropValued pb qb i) (≤IsPropValued ra rb i)
\end{code}
■ Subset of trees in Cantor normal form
\begin{code}
SigmaOrd : Type₀
SigmaOrd = Σ \(a : Tree) → isCNF a
SigmaOrd⁼ : {x y : SigmaOrd} → pr₁ x ≡ pr₁ y → x ≡ y
SigmaOrd⁼ {a , p} e = subst P e pa
where
P : (b : Tree) → Type₀
P b = {q : isCNF b} → (a , p) ≡ (b , q)
pa : P a
pa {q} i = a , isCNFIsPropValued p q i
\end{code}