------------------------------------------------------------- - Three equivalent ordinal notation systems in Cubical Agda - ------------------------------------------------------------- §3.3 The higher inductive approach We consider finite multisets of ordinal representations, where the order of elements does not matter. Because the elements of the multiset again are ordinal representations, we construct a higher inductive type (HIT) of so-called hereditary multisets. \begin{code} {-# OPTIONS --cubical --safe #-} module HITOrd where open import Preliminaries \end{code} ■ HIT of hereditary multisets \begin{code} infixr 40 ω^_⊕_ data HITOrd : Type₀ where 𝟎 : HITOrd ω^_⊕_ : HITOrd → HITOrd → HITOrd swap : ∀ a b c → ω^ a ⊕ ω^ b ⊕ c ≡ ω^ b ⊕ ω^ a ⊕ c trunc : isSet HITOrd private variable a b c : HITOrd example : ω^ a ⊕ ω^ b ⊕ ω^ c ⊕ 𝟎 ≡ ω^ c ⊕ ω^ b ⊕ ω^ a ⊕ 𝟎 example {a} {b} {c} = begin ω^ a ⊕ ω^ b ⊕ ω^ c ⊕ 𝟎 ≡⟨ swap a b _ ⟩ ω^ b ⊕ ω^ a ⊕ ω^ c ⊕ 𝟎 ≡⟨ cong (ω^ b ⊕_) (swap a c _) ⟩ ω^ b ⊕ ω^ c ⊕ ω^ a ⊕ 𝟎 ≡⟨ swap b c _ ⟩ ω^ c ⊕ ω^ b ⊕ ω^ a ⊕ 𝟎 ∎ \end{code} ■ Induction/elimination principles of HITOrd \begin{code} ind : (A : HITOrd → Type ℓ) → (a₀ : A 𝟎) → (_⋆_ : ∀ {x y} → A x → A y → A (ω^ x ⊕ y)) → (⋆swap : ∀ {x y z} (a : A x) (b : A y) (c : A z) → PathP _ (a ⋆ (b ⋆ c)) (b ⋆ (a ⋆ c))) → (sv : ∀ {x} → isSet (A x)) → ∀ x → A x ind A a₀ _⋆_ ⋆swap sv 𝟎 = a₀ ind A a₀ _⋆_ ⋆swap sv (ω^ x ⊕ y) = ind A a₀ _⋆_ ⋆swap sv x ⋆ ind A a₀ _⋆_ ⋆swap sv y ind A a₀ _⋆_ ⋆swap sv (swap x y z i) = ⋆swap (ind A a₀ _⋆_ ⋆swap sv x) (ind A a₀ _⋆_ ⋆swap sv y) (ind A a₀ _⋆_ ⋆swap sv z) i ind A a₀ _⋆_ ⋆swap sv (trunc p q i j) = isOfHLevel→isOfHLevelDep {n = 2} (λ x a b → sv {x} {a} {b}) _ _ (cong (ind A a₀ _⋆_ ⋆swap sv) p) (cong (ind A a₀ _⋆_ ⋆swap sv) q) (trunc p q) i j \end{code} ■ The recursion principle and the induction principle for propositions are just instances of the above full induction principle. \begin{code} rec : {A : Type ℓ} → isSet A → A → (_⋆_ : A → A → A) → (∀ x y z → x ⋆ (y ⋆ z) ≡ y ⋆ (x ⋆ z)) → HITOrd → A rec hset a₀ _⋆_ ⋆swap = ind _ a₀ _⋆_ ⋆swap hset indProp : {P : HITOrd → Type ℓ} → (∀ {x} → isProp (P x)) → P 𝟎 → (∀ {x y} → P x → P y → P (ω^ x ⊕ y)) → ∀ x → P x indProp pv p₀ _⋆_ = ind _ p₀ _⋆_ (λ a b c → toPathP (pv _ _)) (isProp→isSet pv _ _) \end{code} ■ Singleton multisets, representing the ω-based exponentiation \begin{code} ω^⟨_⟩ : HITOrd → HITOrd ω^⟨ a ⟩ = ω^ a ⊕ 𝟎 𝟏 ω : HITOrd 𝟏 = ω^⟨ 𝟎 ⟩ ω = ω^⟨ 𝟏 ⟩ \end{code}