-------------------------------------------------------------
- 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}