We give a concrete construction of ordinal exponentiation using decreasing
lists.

\begin{code}

{-# OPTIONS --safe --without-K --exact-split #-}

open import UF.Univalence

module Ordinals.Exponentiation.DecreasingList
       (ua : Univalence)
       where

open import UF.FunExt
open import UF.UA-FunExt

private
 fe : FunExt
 fe = Univalence-gives-FunExt ua

 fe' : Fun-Ext
 fe' {𝓤} {𝓥} = fe 𝓤 𝓥

open import MLTT.List
open import MLTT.Plus-Properties
open import MLTT.Spartan

open import UF.Base
open import UF.Equiv
open import UF.Sets
open import UF.Subsingletons

open import Ordinals.Arithmetic fe
open import Ordinals.AdditionProperties ua
open import Ordinals.Equivalence
open import Ordinals.Maps
open import Ordinals.Notions
open import Ordinals.OrdinalOfOrdinals ua renaming (_≼_ to _≼OO_)
open import Ordinals.Propositions ua
open import Ordinals.Type
open import Ordinals.Underlying

open import Ordinals.Exponentiation.TrichotomousLeastElement ua

\end{code}

The lexicographic order on lists.

\begin{code}

data lex {X : 𝓤 ̇  } (R : X → X → 𝓥 ̇  ) : List X → List X → 𝓤 ⊔ 𝓥 ̇  where
 []-lex : {x : X} {l : List X} → lex R [] (x ∷ l)
 head-lex : {x y : X} {l l' : List X} → R x y → lex R (x ∷ l) (y ∷ l')
 tail-lex : {x y : X} {l l' : List X} → x = y → lex R l l' → lex R (x ∷ l) (y ∷ l')

lex-for-ordinal : (α : Ordinal 𝓤) → List ⟨ α ⟩ → List ⟨ α ⟩ → 𝓤 ̇
lex-for-ordinal α = lex (underlying-order α)

syntax lex-for-ordinal α l l' = l ≺⟨List α ⟩ l'

\end{code}

The lexicographic order preserves many properties of the order.

\begin{code}

module _ {X : 𝓤 ̇  } (R : X → X → 𝓥 ̇  ) where

 lex-transitive : is-transitive R → is-transitive (lex R)
 lex-transitive tr [] (y ∷ l₂) (z ∷ l₃) []-lex (head-lex q) = []-lex
 lex-transitive tr [] (y ∷ l₂) (z ∷ l₃) []-lex (tail-lex r q) = []-lex
 lex-transitive tr (x ∷ l₁) (y ∷ l₂) (z ∷ l₃) (head-lex p) (head-lex q) =
  head-lex (tr x y z p q)
 lex-transitive tr (x ∷ l₁) (y ∷ l₂) (.y ∷ l₃) (head-lex p) (tail-lex refl q) =
  head-lex p
 lex-transitive tr (x ∷ l₁) (.x ∷ l₂) (z ∷ l₃) (tail-lex refl p) (head-lex q) =
  head-lex q
 lex-transitive tr (x ∷ l₁) (x ∷ l₂) (x ∷ l₃) (tail-lex refl p) (tail-lex refl q)
  = tail-lex refl (lex-transitive tr l₁ l₂ l₃ p q)

 []-lex-bot : is-bot (lex R) []
 []-lex-bot l ()

 lex-irreflexive : is-irreflexive R → is-irreflexive (lex R)
 lex-irreflexive ir (x ∷ l) (head-lex p) = ir x p
 lex-irreflexive ir (x ∷ l) (tail-lex e q) = lex-irreflexive ir l q

 lex-prop-valued : is-set X
                 → is-prop-valued R
                 → is-irreflexive R
                 → is-prop-valued (lex R)
 lex-prop-valued st pr irR l (y ∷ l') []-lex []-lex = refl
 lex-prop-valued st pr irR (x ∷ l) (y ∷ l') (head-lex u) (head-lex v) =
  ap head-lex (pr x y u v)
 lex-prop-valued st pr irR (x ∷ l) (y ∷ l') (head-lex u) (tail-lex refl v) =
  𝟘-elim (irR y u)
 lex-prop-valued st pr irR (x ∷ l) (y ∷ l') (tail-lex refl u) (head-lex v) =
  𝟘-elim (irR x v)
 lex-prop-valued st pr irR (x ∷ l) (y ∷ l') (tail-lex refl u) (tail-lex e v) =
  ap₂ tail-lex (st refl e) (lex-prop-valued st pr irR l l' u v)

\end{code}

We now consider the subtype of decreasing lists.

\begin{code}

 data is-decreasing : List X → 𝓤 ⊔ 𝓥 ̇  where
  []-decr : is-decreasing []
  sing-decr : {x : X} → is-decreasing [ x ]
  many-decr : {x y : X} {l : List X}
            → R y x
            → is-decreasing (y ∷ l)
            → is-decreasing (x ∷ y ∷ l)

 is-decreasing-is-prop : is-prop-valued R
                       → (l : List X) → is-prop (is-decreasing l)
 is-decreasing-is-prop pR [] []-decr []-decr = refl
 is-decreasing-is-prop pR (x ∷ []) sing-decr sing-decr = refl
 is-decreasing-is-prop pR (x ∷ y ∷ l) (many-decr p ps) (many-decr q qs) =
  ap₂ many-decr (pR y x p q) (is-decreasing-is-prop pR (y ∷ l) ps qs)

 tail-is-decreasing : {x : X} {l : List X}
                    → is-decreasing (x ∷ l) → is-decreasing l
 tail-is-decreasing sing-decr = []-decr
 tail-is-decreasing (many-decr _ d) = d

 heads-are-decreasing : {x y : X} {l : List X}
                     → is-decreasing (x ∷ y ∷ l) → R y x
 heads-are-decreasing (many-decr p _) = p

 is-decreasing-swap-heads : is-transitive R
                          → {y x : X} {l : List X}
                          → R x y
                          → is-decreasing (x ∷ l)
                          → is-decreasing (y ∷ l)
 is-decreasing-swap-heads τ {y} {x} {[]}    r δ = sing-decr
 is-decreasing-swap-heads τ {y} {x} {z ∷ l} r δ =
  many-decr (τ z x y (heads-are-decreasing δ) r) (tail-is-decreasing δ)

 is-decreasing-skip : is-transitive R
                    → {x x' : X} {l : List X}
                    → is-decreasing (x ∷ x' ∷ l)
                    → is-decreasing (x ∷ l)
 is-decreasing-skip τ δ =
  is-decreasing-swap-heads τ (heads-are-decreasing δ) (tail-is-decreasing δ)

 DecreasingList : 𝓤 ⊔ 𝓥 ̇
 DecreasingList = Σ l ꞉ List X , is-decreasing l

\end{code}

Next we show that the lexicographic order on lists when restricted to
DecreasingList is wellfounded, provided the original order is.

\begin{code}

 lex-decr : DecreasingList → DecreasingList → 𝓤 ⊔ 𝓥 ̇
 lex-decr (l , _) (l' , _) = lex R l l'

 []-acc-decr : {p : is-decreasing []} → is-accessible lex-decr ([] , p)
 []-acc-decr {[]-decr} = acc (λ xs q → 𝟘-elim ([]-lex-bot _ q))

 lex-decr-acc : is-transitive R
              → (x : X) → is-accessible R x
              → (l : List X) (δ : is-decreasing l)
              → is-accessible lex-decr (l , δ)
              → (ε : is-decreasing (x ∷ l))
              → is-accessible lex-decr ((x ∷ l) , ε)
 lex-decr-acc tr =
  transfinite-induction' R P ϕ
    where
     Q : X → DecreasingList → 𝓤 ⊔ 𝓥 ̇
     Q x (l , _) = (ε' : is-decreasing (x ∷ l))
                   → is-accessible lex-decr ((x ∷ l) , ε')
     P : X → 𝓤 ⊔ 𝓥 ̇
     P x = (l : List X) (δ : is-decreasing l)
           → is-accessible lex-decr (l , δ)
           → Q x (l , δ)
     ϕ : (x : X) → ((y : X) → R y x → P y) → P x
     ϕ x IH l δ β =
      transfinite-induction' lex-decr (Q x) (λ (l , ε) → ϕ' l ε) (l , δ) β
       where
        ϕ' : (l : List X) (ε : is-decreasing l)
           → ((l' : DecreasingList) → lex-decr l' (l , ε) → Q x l')
           → Q x (l , ε)
        ϕ' l _ IH₂ ε' = acc (λ (l' , ε) → g l' ε)
         where
          g : (l' : List X) → (ε : is-decreasing l')
             → lex-decr (l' , ε) ((x ∷ l) , ε')
             → is-accessible lex-decr (l' , ε)
          g [] ε u = []-acc-decr
          g (y ∷ []) ε (head-lex u) = IH y u [] []-decr []-acc-decr ε
          g (y ∷ []) ε (tail-lex refl u) = IH₂ ([] , []-decr) u ε
          g (y ∷ z ∷ l') ε (head-lex u) =
           IH y u (z ∷ l') (tail-is-decreasing ε)
                           (g (z ∷ l')
                            (tail-is-decreasing ε)
                            (head-lex (tr z y x (heads-are-decreasing ε) u)))
                           ε
          g (y ∷ z ∷ l') ε (tail-lex refl u) =
           IH₂ ((z ∷ l') , tail-is-decreasing ε) u ε

 lex-wellfounded : is-transitive R
                 → is-well-founded R
                 → is-well-founded lex-decr
 lex-wellfounded tr wf (l , δ) = lex-wellfounded' wf l δ
  where
   lex-wellfounded' : is-well-founded R
                    → (xs : List X) (δ : is-decreasing xs)
                    → is-accessible lex-decr (xs , δ)
   lex-wellfounded' wf [] δ = []-acc-decr
   lex-wellfounded' wf (x ∷ l) δ =
     lex-decr-acc tr x (wf x) l
      (tail-is-decreasing δ)
      (lex-wellfounded' wf l (tail-is-decreasing δ))
      δ

\end{code}

We construct an ordinal, which we denote by DecrList₂ α β, that implements
exponentiation of (𝟙ₒ +ₒ α) by β.

The reason that it implements exponentiation with base (𝟙ₒ +ₒ α) rather than α,
is because our construction needs a trichotomous least element (see
Ordinals.Exponentiation.TrichotomousLeastElement). Since we then restrict to the
positive elements of the base ordinal, it is convenient to only consider α
(rather than 𝟙ₒ +ₒ α).

\begin{code}

module _ (α : Ordinal 𝓤) (β : Ordinal 𝓥) where

 is-decreasing-pr₂ : List ⟨ α ×ₒ β ⟩ → 𝓥 ̇
 is-decreasing-pr₂ xs = is-decreasing (underlying-order β) (map pr₂ xs)

 heads-are-decreasing-pr₂ : (a a' : ⟨ α ⟩) {b b' : ⟨ β ⟩} {l : List ⟨ α ×ₒ β ⟩}
                          → is-decreasing-pr₂ ((a , b) ∷ (a' , b') ∷ l)
                          → b' ≺⟨ β ⟩ b
 heads-are-decreasing-pr₂ a a' = heads-are-decreasing (underlying-order β)

 tail-is-decreasing-pr₂ : (x : ⟨ α ×ₒ β ⟩) {l : List ⟨ α ×ₒ β ⟩}
                        → is-decreasing-pr₂ (x ∷ l)
                        → is-decreasing-pr₂ l
 tail-is-decreasing-pr₂ x = tail-is-decreasing (underlying-order β)

 is-decreasing-pr₂-skip : (x y : ⟨ α ×ₒ β ⟩) {l : List ⟨ α ×ₒ β ⟩}
                        → is-decreasing-pr₂ (x ∷ y ∷ l)
                        → is-decreasing-pr₂ (x ∷ l)
 is-decreasing-pr₂-skip x y = is-decreasing-skip (underlying-order β)
                                                 (Transitivity β)

 DecrList₂ : 𝓤 ⊔ 𝓥 ̇
 DecrList₂ = Σ l ꞉ List ⟨ α ×ₒ β ⟩ , is-decreasing-pr₂ l

 DecrList₂-list : DecrList₂ → List ⟨ α ×ₒ β ⟩
 DecrList₂-list = pr₁

 to-DecrList₂-= : {l l' : DecrList₂}
                → DecrList₂-list l = DecrList₂-list l' → l = l'
 to-DecrList₂-= = to-subtype-= (λ l → is-decreasing-is-prop
                                         (underlying-order β)
                                         (Prop-valuedness β)
                                         (map pr₂ l))

 DecrList₂-list-is-decreasing-pr₂ : (l : DecrList₂)
                                  → is-decreasing-pr₂ (DecrList₂-list l)
 DecrList₂-list-is-decreasing-pr₂ = pr₂

 is-decreasing-if-decreasing-pr₂ : (l : List ⟨ α ×ₒ β ⟩)
                                 → is-decreasing-pr₂ l
                                 → is-decreasing (underlying-order (α ×ₒ β)) l
 is-decreasing-if-decreasing-pr₂ [] _ = []-decr
 is-decreasing-if-decreasing-pr₂ (x ∷ []) _ = sing-decr
 is-decreasing-if-decreasing-pr₂ (x ∷ x' ∷ l) (many-decr p δ)
  = many-decr (inl p) (is-decreasing-if-decreasing-pr₂ (x' ∷ l) δ)

 DecrList₂-list-is-decreasing
  : (l : DecrList₂)
  → is-decreasing (underlying-order (α ×ₒ β)) (DecrList₂-list l)
 DecrList₂-list-is-decreasing (l , δ) = is-decreasing-if-decreasing-pr₂ l δ

 DecrList₂-order : DecrList₂ → DecrList₂ → 𝓤 ⊔ 𝓥 ̇
 DecrList₂-order (l , _) (l' , _) = l ≺⟨List (α ×ₒ β) ⟩ l'

 DecrList₂-order-is-prop-valued : is-prop-valued DecrList₂-order
 DecrList₂-order-is-prop-valued (l , _) (l' , _) =
  lex-prop-valued
   (underlying-order (α ×ₒ β))
   (underlying-type-is-set fe (α ×ₒ β))
   (Prop-valuedness (α ×ₒ β))
   (irrefl (α ×ₒ β))
   l
   l'

\end{code}

The order on DecrList₂ α β is transitive and wellfounded.

\begin{code}

 DecrList₂-order-is-transitive : is-transitive DecrList₂-order
 DecrList₂-order-is-transitive (l , _) (l' , _) (l'' , _) p q =
  lex-transitive (underlying-order (α ×ₒ β)) (Transitivity (α ×ₒ β)) l l' l'' p q

 DecrList₂-order-is-wellfounded : is-well-founded DecrList₂-order
 DecrList₂-order-is-wellfounded (l , δ) =
  acc-lex-decr-to-acc-exponential l δ
   (lex-wellfounded (underlying-order (α ×ₒ β))
                    (Transitivity (α ×ₒ β))
                    (Well-foundedness (α ×ₒ β))
                    (DecrList₂-list (l , δ) ,
                     DecrList₂-list-is-decreasing (l , δ)))
  where
   acc-lex-decr-to-acc-exponential
    : (l : List ⟨ α ×ₒ β ⟩)
    → (δ : is-decreasing-pr₂ l)
    → is-accessible (lex-decr (underlying-order (α ×ₒ β)))
                    ((l , DecrList₂-list-is-decreasing (l , δ)))
    → is-accessible DecrList₂-order (l , δ)
   acc-lex-decr-to-acc-exponential l δ (acc h) =
    acc (λ (l' , ε) u → acc-lex-decr-to-acc-exponential l' ε
                         (h (l' ,  DecrList₂-list-is-decreasing (l' , ε)) u))

\end{code}

The order on DecrList₂ α β is extensional.

\begin{code}

 private
  R = underlying-order (α ×ₒ β)
  _≼_ = extensional-po DecrList₂-order

 is-decreasing-pr₂-swap-tails
  : (l l' : List ⟨ α ×ₒ β ⟩) (x : ⟨ α ×ₒ β ⟩)
  → is-decreasing-pr₂ (x ∷ l)
  → is-decreasing-pr₂ l'
  → lex R l' l
  → is-decreasing-pr₂ (x ∷ l')
 is-decreasing-pr₂-swap-tails l l' x δ ε []-lex = sing-decr
 is-decreasing-pr₂-swap-tails ((a , b) ∷ l) ((a' , b') ∷ l') (a₀ , b₀) δ ε
  (head-lex (inl u)) = many-decr (Transitivity β b' b b₀ u
                                   (heads-are-decreasing-pr₂ a₀ a δ))
                                 ε
 is-decreasing-pr₂-swap-tails ((a , b) ∷ l) ((a' , b') ∷ l') (a₀ , b₀) δ ε
  (head-lex (inr (refl , u))) = many-decr (heads-are-decreasing-pr₂ a₀ a δ) ε
 is-decreasing-pr₂-swap-tails ((a , b) ∷ l) ((a' , b') ∷ l') (a₀ , b₀) δ ε
  (tail-lex refl u) = many-decr (heads-are-decreasing-pr₂ a₀ a δ) ε

 private
  no-≼-[] : (x : ⟨ α ×ₒ β ⟩) (l : List ⟨ α ×ₒ β ⟩)
            (δ : is-decreasing-pr₂ (x ∷ l))
          → ¬ (((x ∷ l) , δ) ≼ ([] , []-decr))
  no-≼-[] x l δ h =
   𝟘-elim
    (lex-irreflexive R (Irreflexivity (α ×ₒ β)) [] (h ([] , []-decr) []-lex))

  tails-≼
   : (l l' : List ⟨ α ×ₒ β ⟩) (x : ⟨ α ×ₒ β ⟩)
     (δ : is-decreasing-pr₂ (x ∷ l))
     (ε : is-decreasing-pr₂ (x ∷ l'))
   → ((x ∷ l) , δ) ≼ ((x ∷ l') , ε)
   → (l , tail-is-decreasing-pr₂ x δ) ≼ (l' , tail-is-decreasing-pr₂ x ε)
  tails-≼ l l' x δ ε h (l₀ , δ₀) u = g hₓ
   where
    hₓ : lex R (x ∷ l₀) (x ∷ l')
    hₓ = h ((x ∷ l₀) , is-decreasing-pr₂-swap-tails l l₀ x δ δ₀ u)
           (tail-lex refl u)
    g : lex R (x ∷ l₀) (x ∷ l') → lex R l₀ l'
    g (head-lex   r) = 𝟘-elim (Irreflexivity (α ×ₒ β) x r)
    g (tail-lex _ k) = k

 DecrList₂-order-is-extensional' : (l₁ l₂ : List ⟨ α ×ₒ β ⟩)
                                   (δ₁ : is-decreasing-pr₂ l₁)
                                   (δ₂ : is-decreasing-pr₂ l₂)
                                 → (l₁ , δ₁) ≼ (l₂ , δ₂)
                                 → (l₂ , δ₂) ≼ (l₁ , δ₁)
                                 → l₁ = l₂
 DecrList₂-order-is-extensional' [] [] δ₁ δ₂ u v = refl
 DecrList₂-order-is-extensional' [] (y ∷ l₂) δ₁ δ₂ u h₂ =
  𝟘-elim (no-≼-[] y l₂ δ₂ h₂)
 DecrList₂-order-is-extensional' (x ∷ l₁) [] δ₁ δ₂ h₁ h₂ =
  𝟘-elim (no-≼-[] x l₁ δ₁ h₁)
 DecrList₂-order-is-extensional' (x ∷ []) (y ∷ []) δ₁ δ₂ h₁ h₂ =
  ap [_] (Extensionality (α ×ₒ β) x y I₁ I₂)
   where
    I₁ : x ≼⟨ α ×ₒ β ⟩ y
    I₁ z u = κ c
     where
      c : [ z ] ≺⟨List (α ×ₒ β) ⟩ [ y ]
      c = h₁ ([ z ] , sing-decr) (head-lex u)
      κ : [ z ] ≺⟨List (α ×ₒ β) ⟩ [ y ] → z ≺⟨ α ×ₒ β ⟩ y
      κ (head-lex v) = v
    I₂ : y ≼⟨ α ×ₒ β ⟩ x
    I₂ z u = κ c
     where
      c : [ z ] ≺⟨List (α ×ₒ β) ⟩ [ x ]
      c = h₂ ([ z ] , sing-decr) (head-lex u)
      κ : [ z ] ≺⟨List (α ×ₒ β) ⟩ [ x ] → z ≺⟨ α ×ₒ β ⟩ x
      κ (head-lex v) = v
 DecrList₂-order-is-extensional' (x ∷ []) (y ∷ y' ∷ l₂) δ₁ δ₂ h₁ h₂ =
  𝟘-elim (lex-irreflexive R (Irreflexivity (α ×ₒ β)) (y ∷ y' ∷ l₂) III)
   where
    I : y ≺⟨ α ×ₒ β ⟩ x
    I = κ (h₂ ([ y ] , sing-decr) (tail-lex refl []-lex))
     where
      κ :  [ y ] ≺⟨List (α ×ₒ β) ⟩ [ x ] → y ≺⟨ α ×ₒ β ⟩ x
      κ (head-lex u) = u
    II : (y ∷ y' ∷ l₂) ≺⟨List (α ×ₒ β) ⟩ [ x ]
    II = head-lex I
    III : (y ∷ y' ∷ l₂) ≺⟨List (α ×ₒ β) ⟩ (y ∷ y' ∷ l₂)
    III = h₁ ((y ∷ y' ∷ l₂) , δ₂) II
 DecrList₂-order-is-extensional' (x ∷ x' ∷ l₁) (y ∷ []) δ₁ δ₂ h₁ h₂ =
  𝟘-elim (lex-irreflexive R (Irreflexivity (α ×ₒ β)) (x ∷ x' ∷ l₁) III)
   where
    I : x ≺⟨ α ×ₒ β ⟩ y
    I = κ (h₁ ([ x ] , sing-decr) (tail-lex refl []-lex))
     where
      κ :  [ x ] ≺⟨List (α ×ₒ β) ⟩ [ y ] → x ≺⟨ α ×ₒ β ⟩ y
      κ (head-lex u) = u
    II : (x ∷ x' ∷ l₁) ≺⟨List (α ×ₒ β) ⟩ [ y ]
    II = head-lex I
    III : (x ∷ x' ∷ l₁) ≺⟨List (α ×ₒ β) ⟩ (x ∷ x' ∷ l₁)
    III = h₂ ((x ∷ x' ∷ l₁) , δ₁) II
 DecrList₂-order-is-extensional' (x ∷ x' ∷ l₁) (y ∷ y' ∷ l₂) δ₁ δ₂ h₁ h₂ =
  ap₂ _∷_ I
   (DecrList₂-order-is-extensional'
     (x' ∷ l₁) (y' ∷ l₂)
     (tail-is-decreasing-pr₂ x {x' ∷ l₁} δ₁)
     (tail-is-decreasing-pr₂ y {y' ∷ l₂} δ₂)
     (k₁ I)
     (k₂ I))
  where
   I : x = y
   I = κ (h₁ ([ x ] , sing-decr) (tail-lex refl []-lex))
         (h₂ ([ y ] , sing-decr) (tail-lex refl []-lex))
    where
     κ : [ x ] ≺⟨List (α ×ₒ β) ⟩ (y ∷ y' ∷ l₂)
       → [ y ] ≺⟨List (α ×ₒ β) ⟩ (x ∷ x' ∷ l₁)
       → x = y
     κ (head-lex u) (head-lex v) =
      𝟘-elim (Irreflexivity (α ×ₒ β) x (Transitivity (α ×ₒ β) x y x u v))
     κ (head-lex u) (tail-lex refl v) = refl
     κ (tail-lex refl u) (head-lex v) = refl
     κ (tail-lex refl u) (tail-lex e v) = refl
   k₁ : x = y
     → ((x' ∷ l₁) , tail-is-decreasing-pr₂ x {x' ∷ l₁} δ₁)
       ≼ ((y' ∷ l₂) , tail-is-decreasing-pr₂ y {y' ∷ l₂} δ₂)
   k₁ refl = tails-≼ (x' ∷ l₁) (y' ∷ l₂) x δ₁ δ₂ h₁
   k₂ : x = y
     → ((y' ∷ l₂) , tail-is-decreasing-pr₂ y {y' ∷ l₂} δ₂)
       ≼ ((x' ∷ l₁) , tail-is-decreasing-pr₂ x {x' ∷ l₁} δ₁)
   k₂ refl = tails-≼ (y' ∷ l₂) (x' ∷ l₁) x δ₂ δ₁ h₂

 DecrList₂-order-is-extensional : is-extensional DecrList₂-order
 DecrList₂-order-is-extensional (l₁ , δ₁) (l₂ , δ₂) u v =
  to-DecrList₂-= (DecrList₂-order-is-extensional' l₁ l₂ δ₁ δ₂ u v)

\end{code}

Therefore, DecrList₂ α β is an ordinal. As shown, via different techniques, in
Ordinals.Exponentiation.DecreasingListProperties-Concrete and
Ordinals.Exponentiation.PropertiesViaTransport, this ordinal implements the
exponentiation of 𝟙 + α to β.

\begin{code}

expᴸ[𝟙+_] : Ordinal 𝓤 → Ordinal 𝓥 → Ordinal (𝓤 ⊔ 𝓥)
expᴸ[𝟙+_] α β = DecrList₂ α β
                , DecrList₂-order α β
                , DecrList₂-order-is-prop-valued α β
                , DecrList₂-order-is-wellfounded α β
                , DecrList₂-order-is-extensional α β
                , DecrList₂-order-is-transitive α β

exponentiationᴸ : (α : Ordinal 𝓤)
                → has-trichotomous-least-element α
                → Ordinal 𝓥
                → Ordinal (𝓤 ⊔ 𝓥)
exponentiationᴸ α h = expᴸ[𝟙+ α ⁺[ h ] ]

\end{code}

Some properties of the empty list as an element of expᴸ[𝟙+ α ] β.

\begin{code}

module _
        (α : Ordinal 𝓤)
        (β : Ordinal 𝓥)
       where

 expᴸ-⊥ : ⟨ expᴸ[𝟙+ α ] β ⟩
 expᴸ-⊥ = [] , []-decr

 expᴸ-↓-⊥ : expᴸ[𝟙+ α ] β ↓ expᴸ-⊥ = 𝟘ₒ
 expᴸ-↓-⊥ = ⊲-is-extensional (expᴸ[𝟙+ α ] β ↓ expᴸ-⊥) 𝟘ₒ I II
  where
   I : (expᴸ[𝟙+ α ] β ↓ expᴸ-⊥) ≼OO 𝟘ₒ
   I = to-≼ {_} {expᴸ[𝟙+ α ] β ↓ expᴸ-⊥} {𝟘ₒ} h
    where
     h : (l : ⟨ expᴸ[𝟙+ α ] β ↓ expᴸ-⊥ ⟩)
       → ((expᴸ[𝟙+ α ] β ↓ expᴸ-⊥) ↓ l) ⊲ 𝟘ₒ
     h ()
   II : 𝟘ₒ ≼OO (expᴸ[𝟙+ α ] β ↓ expᴸ-⊥)
   II = 𝟘ₒ-least (expᴸ[𝟙+ α ] β ↓ expᴸ-⊥)

 expᴸ-↓-⊥' : {δ : is-decreasing-pr₂ α β []}
           → expᴸ[𝟙+ α ] β ↓ ([] , δ) = 𝟘ₒ
 expᴸ-↓-⊥' {δ} =
  expᴸ[𝟙+ α ] β ↓ ([] , δ) =⟨ ap (expᴸ[𝟙+ α ] β ↓_) (to-DecrList₂-= α β refl) ⟩
  expᴸ[𝟙+ α ] β ↓ expᴸ-⊥   =⟨ expᴸ-↓-⊥ ⟩
  𝟘ₒ                       ∎

 expᴸ-is-positive : 𝟘ₒ ⊲ expᴸ[𝟙+ α ] β
 expᴸ-is-positive = expᴸ-⊥ , (expᴸ-↓-⊥ ⁻¹)

 expᴸ-has-least : 𝟙ₒ ⊴ expᴸ[𝟙+ α ] β
 expᴸ-has-least =
  to-⊴ 𝟙ₒ (expᴸ[𝟙+ α ] β)
          (λ ⋆ → transport⁻¹ (_⊲ expᴸ[𝟙+ α ] β) 𝟙ₒ-↓ expᴸ-is-positive)

\end{code}

The empty list is the trichotomous least element of expᴸ[𝟙+ α ] β.

\begin{code}

 expᴸ-is-trichotomous-least : is-trichotomous-least (expᴸ[𝟙+ α ] β) expᴸ-⊥
 expᴸ-is-trichotomous-least ([] , []-decr) = inl refl
 expᴸ-is-trichotomous-least ((x ∷ l) , δ) = inr []-lex

 expᴸ-has-trichotomous-least-element
  : has-trichotomous-least-element (expᴸ[𝟙+ α ] β)
 expᴸ-has-trichotomous-least-element = expᴸ-⊥ , expᴸ-is-trichotomous-least

exponentiationᴸ-has-trichotomous-least-element
 : (α : Ordinal 𝓤) (h : has-trichotomous-least-element α) (β : Ordinal 𝓥)
 → has-trichotomous-least-element (exponentiationᴸ α h β)
exponentiationᴸ-has-trichotomous-least-element α h β =
 expᴸ-has-trichotomous-least-element (α ⁺[ h ]) β

\end{code}

An order preserving map f : β → γ induces a map expᴸ[𝟙+ α ] β → expᴸ[𝟙+ α ] γ by
applying f on the second components.

Moreover, the induced map is order reflecting if f is order reflecting and
left-cancellable.

\begin{code}

module _
        (α : Ordinal 𝓤)
        (β : Ordinal 𝓥)
        (γ : Ordinal 𝓦)
        (f : ⟨ β ⟩ → ⟨ γ ⟩)
        (f-is-order-preserving : is-order-preserving β γ f)
       where

 expᴸ-map-on-lists : List ⟨ α ×ₒ β ⟩ → List ⟨ α ×ₒ γ ⟩
 expᴸ-map-on-lists = map (λ (a  , b) → (a , f b))

 expᴸ-map-on-lists-preserves-decreasing-pr₂
  : (l : List ⟨ α ×ₒ β ⟩)
  → is-decreasing-pr₂ α β l
  → is-decreasing-pr₂ α γ (expᴸ-map-on-lists l)
 expᴸ-map-on-lists-preserves-decreasing-pr₂ [] δ = []-decr
 expᴸ-map-on-lists-preserves-decreasing-pr₂ ((a , b) ∷ []) δ = sing-decr
 expᴸ-map-on-lists-preserves-decreasing-pr₂ ((a , b) ∷ (a' , b') ∷ l)
  (many-decr p δ) = many-decr (f-is-order-preserving b' b p)
                              (expᴸ-map-on-lists-preserves-decreasing-pr₂
                                ((a' , b') ∷ l)
                                δ)

 expᴸ-map : ⟨ expᴸ[𝟙+ α ] β ⟩ → ⟨ expᴸ[𝟙+ α ] γ ⟩
 expᴸ-map (l , δ) = expᴸ-map-on-lists l ,
                    expᴸ-map-on-lists-preserves-decreasing-pr₂ l δ

 expᴸ-map-is-order-preserving
  : is-order-preserving (expᴸ[𝟙+ α ] β) (expᴸ[𝟙+ α ] γ) expᴸ-map
 expᴸ-map-is-order-preserving ([] , δ) (l' , δ') []-lex = []-lex
 expᴸ-map-is-order-preserving (((a , b) ∷ l), δ) (((a' , b') ∷ l') , δ')
  (head-lex (inl u)) = head-lex (inl (f-is-order-preserving b b' u))
 expᴸ-map-is-order-preserving (((a , b) ∷ l), δ) (((a' , b') ∷ l') , δ')
  (head-lex (inr (refl , u))) = head-lex (inr (refl , u))
 expᴸ-map-is-order-preserving (((a , b) ∷ l), δ) (((a' , b') ∷ l') , δ')
  (tail-lex refl u) =
   tail-lex refl
    (expᴸ-map-is-order-preserving
     (l  , tail-is-decreasing-pr₂ α β (a  , b)  δ)
     (l' , tail-is-decreasing-pr₂ α β (a' , b') δ')
     u)

 expᴸ-map-is-order-reflecting
  : is-order-reflecting β γ f
  → left-cancellable f
  → is-order-reflecting (expᴸ[𝟙+ α ] β) (expᴸ[𝟙+ α ] γ) expᴸ-map
 expᴸ-map-is-order-reflecting ρ κ ([] , δ) ((_ ∷ l') , δ') u = []-lex
 expᴸ-map-is-order-reflecting ρ κ (((a , b) ∷ l) , δ) (((a' , b') ∷ l') , δ')
  (head-lex (inl v)) = head-lex (inl (ρ b b' v))
 expᴸ-map-is-order-reflecting ρ κ (((a , b) ∷ l) , δ) (((a' , b') ∷ l') , δ')
  (head-lex (inr (e , v))) = head-lex (inr (κ e , v))
 expᴸ-map-is-order-reflecting ρ κ (((a , b) ∷ l) , δ) (((a' , b') ∷ l') , δ')
  (tail-lex e v) =
   tail-lex
    (to-×-= (pr₁ (from-×-=' e)) (κ (pr₂ (from-×-=' e))))
    (expᴸ-map-is-order-reflecting ρ κ
      (l  , tail-is-decreasing-pr₂ α β (a  , b)  δ)
      (l' , tail-is-decreasing-pr₂ α β (a' , b') δ')
      v)

 expᴸ-map-is-decreasing-pr₂-lc
  : is-order-reflecting β γ f
  → (l : List (⟨ α ×ₒ β ⟩))
  → is-decreasing-pr₂ α γ (expᴸ-map-on-lists l)
  → is-decreasing-pr₂ α β l
 expᴸ-map-is-decreasing-pr₂-lc ρ [] δ = []-decr
 expᴸ-map-is-decreasing-pr₂-lc ρ ((a , b) ∷ []) δ = sing-decr
 expᴸ-map-is-decreasing-pr₂-lc ρ ((a , b) ∷ (a' , b') ∷ l) (many-decr u δ) =
  many-decr (ρ b' b u) (expᴸ-map-is-decreasing-pr₂-lc ρ ((a' , b') ∷ l) δ)

\end{code}

The following technical lemma is used to show that if f is simulation, then so
is the induced map on expᴸ.

\begin{code}

 expᴸ-map-is-partially-surjective
  : is-order-reflecting β γ f
  → ((b : ⟨ β ⟩) (c : ⟨ γ ⟩) → c ≺⟨ γ ⟩ f b → Σ b' ꞉ ⟨ β ⟩ , f b' = c)
  → (l₁ : List ⟨ α ×ₒ β ⟩) (l : List ⟨ α ×ₒ γ ⟩)
    (δ₁ : is-decreasing-pr₂ α β l₁) (δ : is-decreasing-pr₂ α γ l)
  → (l , δ) ≺⟨ expᴸ[𝟙+ α ] γ ⟩ expᴸ-map (l₁ , δ₁)
  → Σ l₂ ꞉ ⟨ expᴸ[𝟙+ α ] β ⟩ , expᴸ-map l₂ = (l , δ)
 expᴸ-map-is-partially-surjective ρ h ((a₁ , b) ∷ l₁) [] δ₁ []-decr v =
  ([] , []-decr) , refl
 expᴸ-map-is-partially-surjective ρ h ((a₁ , b) ∷ l₁) ((a , c) ∷ []) δ₁ δ
  (head-lex (inl v)) = (((a , b') ∷ []) , sing-decr) ,
                       to-DecrList₂-= α γ (ap (λ - → (a , -) ∷ []) e)
   where
    b' = pr₁ (h b c v)
    e  = pr₂ (h b c v)
 expᴸ-map-is-partially-surjective ρ h ((a₁ , b) ∷ l₁) ((a , c) ∷ []) δ₁ δ
  (head-lex (inr (refl , v))) = ((a , b ∷ []) , sing-decr) ,
                                to-DecrList₂-= α γ refl
 expᴸ-map-is-partially-surjective ρ h ((a₁ , b) ∷ l₁) ((a , c) ∷ []) δ₁ δ
  (tail-lex refl v) = ((a , b ∷ []) , sing-decr) , (to-DecrList₂-= α γ refl)
 expᴸ-map-is-partially-surjective ρ h ((a₁ , b₁) ∷ l₁) ((a , c) ∷ (a' , c') ∷ l)
  δ₁ (many-decr u δ) (head-lex (inl v)) =
   (((a , b') ∷ l₂) , ε) , to-DecrList₂-= α γ e₃
    where
     IH : Σ l₂ ꞉ ⟨ expᴸ[𝟙+ α ] β ⟩ , expᴸ-map l₂ = ((a' , c' ∷ l) , δ)
     IH = expᴸ-map-is-partially-surjective ρ h
           ((a₁ , b₁) ∷ l₁)
           ((a' , c') ∷ l)
           δ₁
           δ
           (head-lex (inl (Transitivity γ c' c (f b₁) u v)))
     l₂ = pr₁ (pr₁ IH)
     δ₂ = pr₂ (pr₁ IH)
     e₂ = pr₂ IH
     b' = pr₁ (h b₁ c v)
     e₁ = pr₂ (h b₁ c v)
     ε : is-decreasing-pr₂ α β (a , b' ∷ l₂)
     ε = expᴸ-map-is-decreasing-pr₂-lc ρ ((a , b') ∷ l₂)
          (transport₂
            (λ -₁ -₂ → is-decreasing-pr₂ α γ (a , -₁ ∷ -₂))
            (e₁ ⁻¹)
            ((ap (DecrList₂-list α γ) e₂) ⁻¹)
            (many-decr u δ))
     e₃ : (a , f b' ∷ expᴸ-map-on-lists l₂) = (a , c ∷ a' , c' ∷ l)
     e₃ = ap₂ (λ x y → a , x ∷ y) e₁ (ap (DecrList₂-list α γ) e₂)
 expᴸ-map-is-partially-surjective ρ h ((a₁ , b₁) ∷ l₁) ((a , c) ∷ (a' , c') ∷ l)
  δ₁ (many-decr u δ) (head-lex (inr (refl , v))) =
   (((a , b₁) ∷ l₂) , ε) , (to-DecrList₂-= α γ e₃)
    where
     IH : Σ l₂ ꞉ ⟨ expᴸ[𝟙+ α ] β ⟩ , expᴸ-map l₂ = ((a' , c' ∷ l) , δ)
     IH = expᴸ-map-is-partially-surjective ρ h
           ((a₁ , b₁) ∷ l₁)
           ((a' , c') ∷ l)
           δ₁
           δ
           (head-lex (inl u))
     l₂ = pr₁ (pr₁ IH)
     δ₂ = pr₂ (pr₁ IH)
     e₂ = pr₂ IH
     ε : is-decreasing-pr₂ α β (a , b₁ ∷ l₂)
     ε = expᴸ-map-is-decreasing-pr₂-lc ρ ((a , b₁) ∷ l₂)
          (transport⁻¹
            (λ - → is-decreasing-pr₂ α γ (a , f b₁ ∷ -))
            (ap (DecrList₂-list α γ) e₂)
            (many-decr u δ))
     e₃ : ((a , f b₁) ∷ expᴸ-map-on-lists l₂) = ((a , f b₁) ∷ (a' , c') ∷ l)
     e₃ = ap ((a ,  f b₁) ∷_) (ap (DecrList₂-list α γ) e₂)
 expᴸ-map-is-partially-surjective ρ h ((a₁ , b₁) ∷ l₁) ((a , c) ∷ (a' , c') ∷ l)
  δ₁ 𝕕@(many-decr u δ) (tail-lex refl v) =
   (((a₁ , b₁) ∷ l₂) , ε) ,
   to-DecrList₂-= α γ (ap (a₁ , f b₁ ∷_) (ap (DecrList₂-list α γ) e₂))
    where
     IH : Σ l₂ ꞉ ⟨ expᴸ[𝟙+ α ] β ⟩ , expᴸ-map l₂ = ((a' , c' ∷ l) , δ)
     IH = expᴸ-map-is-partially-surjective ρ h l₁ ((a' , c') ∷ l)
           (tail-is-decreasing-pr₂ α β (a₁ , b₁) δ₁)
           δ
           v
     l₂ = pr₁ (pr₁ IH)
     δ₂ = pr₂ (pr₁ IH)
     e₂ = pr₂ IH
     ε : is-decreasing-pr₂ α β (a₁ , b₁ ∷ l₂)
     ε = expᴸ-map-is-decreasing-pr₂-lc ρ (a₁ , b₁ ∷ l₂)
          (transport⁻¹
            (λ - → is-decreasing-pr₂ α γ ((a₁ , f b₁) ∷ -))
            (ap (DecrList₂-list α γ) e₂)
            𝕕)

 expᴸ-map-is-simulation : is-initial-segment β γ f
                        → is-simulation (expᴸ[𝟙+ α ] β) (expᴸ[𝟙+ α ] γ) expᴸ-map
 expᴸ-map-is-simulation f-init-seg =
  order-preserving-and-reflecting-partial-surjections-are-simulations
    (expᴸ[𝟙+ α ] β) (expᴸ[𝟙+ α ] γ) expᴸ-map
    expᴸ-map-is-order-preserving
    (expᴸ-map-is-order-reflecting
      (simulations-are-order-reflecting β γ f f-sim)
      (simulations-are-lc β γ f f-sim))
    (λ (l₁ , δ₁) (l , δ) →
      expᴸ-map-is-partially-surjective
       (simulations-are-order-reflecting β γ f f-sim)
        (λ b c v → (pr₁ (f-init-seg b c v)) , pr₂ (pr₂ (f-init-seg b c v)))
        l₁ l δ₁ δ)
     where
      f-sim : is-simulation β γ f
      f-sim = (f-init-seg , f-is-order-preserving)

\end{code}

The above can be restated as: the operation expᴸ[𝟙+ α] is monotone.

\begin{code}

expᴸ-is-monotone-in-exponent : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (γ : Ordinal 𝓦)
                             → β ⊴ γ
                             → expᴸ[𝟙+ α ] β ⊴ expᴸ[𝟙+ α ] γ
expᴸ-is-monotone-in-exponent α β γ (f , f-sim) =
 expᴸ-map α β γ f (simulations-are-order-preserving β γ f f-sim) ,
 expᴸ-map-is-simulation α β γ f
  (simulations-are-order-preserving β γ f f-sim)
  (simulations-are-initial-segments β γ f f-sim)

\end{code}

We work towards characterizing initial segments of expᴸ α β.

A first basic but fundamental ingredient is the following map:
Given an element l : expᴸ[𝟙+ α ] (β ↓ b₀), we can forget all the inequality
proofs in the second components to obtain an element of expᴸ[𝟙+ α ] β.
This assignment is called expᴸ-segment-inclusion below and is shown to be a
simulation.

\begin{code}

module _
        (α : Ordinal 𝓤)
        (β : Ordinal 𝓥)
        (b₀ : ⟨ β ⟩)
       where

 expᴸ-segment-inclusion : ⟨ expᴸ[𝟙+ α ] (β ↓ b₀) ⟩ → ⟨ expᴸ[𝟙+ α ] β ⟩
 expᴸ-segment-inclusion =
  expᴸ-map α (β ↓ b₀) β
   (segment-inclusion β b₀)
   (simulations-are-order-preserving
     (β ↓ b₀) β
     (segment-inclusion β b₀)
     (segment-inclusion-is-simulation β b₀))

 expᴸ-segment-inclusion-list : List ⟨ α ×ₒ (β ↓ b₀) ⟩ → List ⟨ α ×ₒ β ⟩
 expᴸ-segment-inclusion-list = map (λ (a , b) → (a , segment-inclusion β b₀ b))

 expᴸ-segment-inclusion-list-preserves-decreasing-pr₂ :
    (l : List ⟨ α ×ₒ (β ↓ b₀) ⟩)
  → is-decreasing-pr₂ α (β ↓ b₀) l
  → is-decreasing-pr₂ α β (expᴸ-segment-inclusion-list l)
 expᴸ-segment-inclusion-list-preserves-decreasing-pr₂ l δ =
  DecrList₂-list-is-decreasing-pr₂ α β (expᴸ-segment-inclusion (l , δ))

 extended-expᴸ-segment-inclusion-is-decreasing-pr₂ :
    (l : List ⟨ α ×ₒ (β ↓ b₀) ⟩) (a₀ : ⟨ α ⟩)
  → is-decreasing-pr₂ α (β ↓ b₀) l
  → is-decreasing-pr₂ α β ((a₀ , b₀) ∷ expᴸ-segment-inclusion-list l)
 extended-expᴸ-segment-inclusion-is-decreasing-pr₂ [] a₀ δ = sing-decr
 extended-expᴸ-segment-inclusion-is-decreasing-pr₂ ((a , (b , u)) ∷ l) a₀ δ =
  many-decr
   u
   (expᴸ-segment-inclusion-list-preserves-decreasing-pr₂ (a , b , u ∷ l) δ)

 predecessor-of-expᴸ-segment-inclusion-lemma :
    (a : ⟨ α ⟩) {b : ⟨ β ⟩}
    {l₁ : List ⟨ α ×ₒ β ⟩}
    {l₂ : List ⟨ α ×ₒ (β ↓ b₀) ⟩}
  → ((a , b) ∷ l₁) ≺⟨List (α ×ₒ β) ⟩ expᴸ-segment-inclusion-list l₂
  → b ≺⟨ β ⟩ b₀
 predecessor-of-expᴸ-segment-inclusion-lemma a {b} {l₁} {(a' , (b' , u)) ∷ l₂}
  (head-lex (inl v)) = Transitivity β b b' b₀ v u
 predecessor-of-expᴸ-segment-inclusion-lemma a {b} {l₁} {(a' , (b' , u)) ∷ l₂}
  (head-lex (inr (refl , v))) = u
 predecessor-of-expᴸ-segment-inclusion-lemma a {b} {l₁} {(a' , (b' , u)) ∷ l₂}
  (tail-lex refl v) = u

 expᴸ-segment-inclusion-list-lex :
    {l₁ : List ⟨ α ×ₒ (β ↓ b₀) ⟩}
    {a : ⟨ α ⟩} {l : List ⟨ α ×ₒ β ⟩}
  → expᴸ-segment-inclusion-list l₁ ≺⟨List (α ×ₒ β ) ⟩ ((a , b₀) ∷ l)
 expᴸ-segment-inclusion-list-lex {[]} = []-lex
 expᴸ-segment-inclusion-list-lex {((a' , (b' , u)) ∷ l₁)} = head-lex (inl u)

 extended-expᴸ-segment-inclusion : (l : ⟨ expᴸ[𝟙+ α ] (β ↓ b₀) ⟩) (a₀ : ⟨ α ⟩)
                                 → ⟨ expᴸ[𝟙+ α ] β ⟩
 extended-expᴸ-segment-inclusion (l , δ) a₀ =
  ((a₀ , b₀) ∷ expᴸ-segment-inclusion-list l) ,
  extended-expᴸ-segment-inclusion-is-decreasing-pr₂ l a₀ δ

 expᴸ-segment-inclusion-is-order-preserving :
  is-order-preserving
   (expᴸ[𝟙+ α ] (β ↓ b₀))
   (expᴸ[𝟙+ α ] β)
   expᴸ-segment-inclusion
 expᴸ-segment-inclusion-is-order-preserving =
  expᴸ-map-is-order-preserving α (β ↓ b₀) β (segment-inclusion β b₀)
   (simulations-are-order-preserving (β ↓ b₀) β
     (segment-inclusion β b₀)
     (segment-inclusion-is-simulation β b₀))

 expᴸ-segment-inclusion-is-order-reflecting :
  is-order-reflecting
   (expᴸ[𝟙+ α ] (β ↓ b₀))
   (expᴸ[𝟙+ α ] β)
   expᴸ-segment-inclusion
 expᴸ-segment-inclusion-is-order-reflecting =
  expᴸ-map-is-order-reflecting α (β ↓ b₀) β (segment-inclusion β b₀)
   (simulations-are-order-preserving (β ↓ b₀) β
     (segment-inclusion β b₀)
     (segment-inclusion-is-simulation β b₀))
   (simulations-are-order-reflecting (β ↓ b₀) β
     (segment-inclusion β b₀)
     (segment-inclusion-is-simulation β b₀))
   (simulations-are-lc (β ↓ b₀) β
     (segment-inclusion β b₀)
     (segment-inclusion-is-simulation β b₀))

expᴸ-segment-inclusion-is-simulation :
   (α : Ordinal 𝓤) (β : Ordinal 𝓥) (b₀ : ⟨ β ⟩)
 → is-simulation (expᴸ[𝟙+ α ] (β ↓ b₀)) (expᴸ[𝟙+ α ] β)
    (expᴸ-segment-inclusion α β b₀)
expᴸ-segment-inclusion-is-simulation α β b₀ =
 expᴸ-map-is-simulation α (β ↓ b₀) β
  (segment-inclusion β b₀)
  (simulations-are-order-preserving (β ↓ b₀) β
    (segment-inclusion β b₀) (segment-inclusion-is-simulation β b₀))
  (simulations-are-initial-segments (β ↓ b₀) β
    (segment-inclusion β b₀)
    (segment-inclusion-is-simulation β b₀))

expᴸ-segment-inclusion-⊴ : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (b₀ : ⟨ β ⟩)
                         → expᴸ[𝟙+ α ] (β ↓ b₀) ⊴ expᴸ[𝟙+ α ] β
expᴸ-segment-inclusion-⊴ α β b₀ = expᴸ-segment-inclusion α β b₀ ,
                                  expᴸ-segment-inclusion-is-simulation α β b₀

\end{code}

The following construction goes in the other direction. More precisely, given a
list l with entries in α ×ₒ β such that (a₀ , b₀) ∷ l is decreasing in the
second component, we obtain an element of expᴸ[𝟙+ α ] (β ↓ b₀) by inserting the
required inequality proofs in the second components.

\begin{code}

module _
        (α : Ordinal 𝓤)
        (β : Ordinal 𝓥)
        (a₀ : ⟨ α ⟩)
        (b₀ : ⟨ β ⟩)
       where

 expᴸ-tail-list : (l : List ⟨ α ×ₒ β ⟩)
                → is-decreasing-pr₂ α β ((a₀ , b₀) ∷ l)
                → List ⟨ α ×ₒ (β ↓ b₀) ⟩
 expᴸ-tail-list [] _ = []
 expᴸ-tail-list ((a , b) ∷ l) δ = (a , (b , u)) ∷ (expᴸ-tail-list l ε)
  where
   u : b ≺⟨ β ⟩ b₀
   u = heads-are-decreasing-pr₂ α β a₀ a δ
   ε : is-decreasing-pr₂ α β (a₀ , b₀ ∷ l)
   ε = is-decreasing-pr₂-skip α β (a₀ , b₀) (a , b) δ

 expᴸ-tail-list-preserves-decreasing-pr₂ :
    (l : List ⟨ α ×ₒ β ⟩) (δ : is-decreasing-pr₂ α β ((a₀ , b₀) ∷ l))
  → is-decreasing-pr₂ α (β ↓ b₀) (expᴸ-tail-list l δ)
 expᴸ-tail-list-preserves-decreasing-pr₂ [] _ = []-decr
 expᴸ-tail-list-preserves-decreasing-pr₂ ((a , b) ∷ []) δ = sing-decr
 expᴸ-tail-list-preserves-decreasing-pr₂ ((a , b) ∷ (a' , b') ∷ l) (many-decr u δ) =
  many-decr v (expᴸ-tail-list-preserves-decreasing-pr₂ ((a' , b') ∷ l) ε)
   where
    v : b' ≺⟨ β ⟩ b
    v = heads-are-decreasing-pr₂ α β a a' δ
    ε : is-decreasing-pr₂ α β (a₀ , b₀ ∷ a' , b' ∷ l)
    ε = many-decr
         (Transitivity β b' b b₀ v u)
         (tail-is-decreasing-pr₂ α β (a , b) {a , b' ∷ l} δ)

 expᴸ-tail : (l : List ⟨ α ×ₒ β ⟩)
           → is-decreasing-pr₂ α β ((a₀ , b₀) ∷ l)
           → ⟨ expᴸ[𝟙+ α ] (β ↓ b₀) ⟩
 expᴸ-tail l δ = expᴸ-tail-list l δ ,
                 (expᴸ-tail-list-preserves-decreasing-pr₂ l δ)

 expᴸ-tail-is-order-preserving :
    {l₁ l₂ : List ⟨ α ×ₒ β ⟩}
    (δ₁ : is-decreasing-pr₂ α β ((a₀ , b₀) ∷ l₁))
    (δ₂ : is-decreasing-pr₂ α β ((a₀ , b₀) ∷ l₂))
  → l₁ ≺⟨List (α ×ₒ β) ⟩ l₂
  → expᴸ-tail l₁ δ₁ ≺⟨ expᴸ[𝟙+ α ] (β ↓ b₀) ⟩ expᴸ-tail l₂ δ₂
 expᴸ-tail-is-order-preserving {[]} {(_ ∷ l₂)} δ₁ δ₂ _ = []-lex
 expᴸ-tail-is-order-preserving {((a , b) ∷ l₁)} {((a' , b') ∷ l₂)} δ₁ δ₂
  (head-lex (inl u)) = head-lex (inl u)
 expᴸ-tail-is-order-preserving {((a , b) ∷ l₁)} {((a' , b') ∷ l₂)} δ₁ δ₂
  (head-lex (inr (refl , u))) =
   head-lex (inr ((segment-inclusion-lc β refl) , u))
 expᴸ-tail-is-order-preserving {((a , b) ∷ l₁)} {((a' , b') ∷ l₂)} δ₁ δ₂
  (tail-lex refl u) = tail-lex
                       (ap (a ,_) (segment-inclusion-lc β refl))
                       (expᴸ-tail-is-order-preserving
                         (is-decreasing-pr₂-skip α β (a₀ , b₀) (a , b) δ₁)
                         (is-decreasing-pr₂-skip α β (a₀ , b₀) (a , b) δ₂)
                         u)

\end{code}

The assignments expᴸ-tail and expᴸ-segment-inclusion are inverses to each other.

\begin{code}

 expᴸ-tail-section-of-expᴸ-segment-inclusion' :
    (l : List ⟨ α ×ₒ β ⟩) (δ : is-decreasing-pr₂ α β ((a₀ , b₀) ∷ l))
  → DecrList₂-list α β (expᴸ-segment-inclusion α β b₀ (expᴸ-tail l δ)) = l
 expᴸ-tail-section-of-expᴸ-segment-inclusion' [] _ = refl
 expᴸ-tail-section-of-expᴸ-segment-inclusion' ((a , b) ∷ l) δ =
  ap ((a , b) ∷_)
     (expᴸ-tail-section-of-expᴸ-segment-inclusion' l
       (is-decreasing-pr₂-skip α β (a₀ , b₀) (a , b) δ))

 expᴸ-tail-section-of-expᴸ-segment-inclusion :
    (l : List ⟨ α ×ₒ β ⟩)
    {δ : is-decreasing-pr₂ α β ((a₀ , b₀) ∷ l)}
    {ε : is-decreasing-pr₂ α β l}
  → expᴸ-segment-inclusion α β b₀ (expᴸ-tail l δ) = (l , ε)
 expᴸ-tail-section-of-expᴸ-segment-inclusion l {δ} =
  to-DecrList₂-= α β (expᴸ-tail-section-of-expᴸ-segment-inclusion' l δ)

 expᴸ-segment-inclusion-section-of-expᴸ-tail' :
    (l : List ⟨ α ×ₒ (β ↓ b₀) ⟩)
    (δ : is-decreasing-pr₂ α (β ↓ b₀) l)
    {ε : is-decreasing-pr₂ α β (a₀ , b₀ ∷ expᴸ-segment-inclusion-list α β b₀ l)}
  → DecrList₂-list α (β ↓ b₀) (expᴸ-tail (expᴸ-segment-inclusion-list α β b₀ l) ε)
    = l
 expᴸ-segment-inclusion-section-of-expᴸ-tail' [] _ = refl
 expᴸ-segment-inclusion-section-of-expᴸ-tail' ((a , (b , u)) ∷ l) δ =
  ap₂ _∷_
   (ap (a ,_) (segment-inclusion-lc β refl))
   (expᴸ-segment-inclusion-section-of-expᴸ-tail'
     l
     (tail-is-decreasing-pr₂ α (β ↓ b₀) (a , (b , u)) δ))

 expᴸ-segment-inclusion-section-of-expᴸ-tail :
    (l : List ⟨ α ×ₒ (β ↓ b₀) ⟩)
    (δ : is-decreasing-pr₂ α (β ↓ b₀) l)
    {ε : is-decreasing-pr₂ α β (a₀ , b₀ ∷ expᴸ-segment-inclusion-list α β b₀ l)}
  → expᴸ-tail (expᴸ-segment-inclusion-list α β b₀ l) ε = l , δ
 expᴸ-segment-inclusion-section-of-expᴸ-tail l δ =
  to-DecrList₂-= α (β ↓ b₀) (expᴸ-segment-inclusion-section-of-expᴸ-tail' l δ)

\end{code}

We are now ready to characterize the initial segment
  expᴸ[𝟙+ α ] β ↓ ((a , b) ∷ l)
as the ordinal
  expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a)) +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ expᴸ-tail l).

\begin{code}

expᴸ-↓-cons-≃ₒ
 : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
   (a : ⟨ α ⟩) (b : ⟨ β ⟩) (l : List ⟨ α ×ₒ β ⟩)
   (δ : is-decreasing-pr₂ α β ((a , b) ∷ l))
 → expᴸ[𝟙+ α ] β ↓ (((a , b) ∷ l) , δ)
   ≃ₒ expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a))
      +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ expᴸ-tail α β a b l δ)
expᴸ-↓-cons-≃ₒ {𝓤} {𝓥} α β a b l δ =
 f , f-is-order-preserving ,
     (qinvs-are-equivs f (g , gf-is-id , fg-is-id) ,
      g-is-order-preserving)
 where
  LHS RHS : Ordinal (𝓤 ⊔ 𝓥)
  LHS = expᴸ[𝟙+ α ] β ↓ (((a , b) ∷ l) , δ)
  RHS = expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a))
        +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ expᴸ-tail α β a b l δ)

  f : ⟨ LHS ⟩ → ⟨ RHS ⟩
  f (([]               , _) , u) =
   inl (([] , []-decr) , inl ⋆)
  f ((((a' , b') ∷ l') , ε) , head-lex (inl u)) =
   inl (expᴸ-tail α β a b (a' , b' ∷ l') (many-decr u ε) , inl ⋆)
  f ((((a' , b ) ∷ l') , ε) , head-lex (inr (refl , u))) =
   inl (expᴸ-tail α β a b l' ε , inr (a' , u))
  f ((((a  , b ) ∷ l') , ε) , tail-lex refl u) =
   inr (expᴸ-tail α β a b l' ε , expᴸ-tail-is-order-preserving α β a b ε δ u)

  g : ⟨ RHS ⟩ → ⟨ LHS ⟩
  g (inl (l₁ , inl ⋆)) = expᴸ-segment-inclusion α β b l₁ ,
                         expᴸ-segment-inclusion-list-lex α β b
  g (inl (l₁ , inr (a₁ , s))) = extended-expᴸ-segment-inclusion α β b l₁ a₁ ,
                                head-lex (inr (refl , s))
  g (inr (l₁ , w)) = extended-expᴸ-segment-inclusion α β b l₁ a ,
                     tail-lex refl w'
   where
    ℓ : List ⟨ α ×ₒ (β ↓ b) ⟩
    ℓ = DecrList₂-list α (β ↓ b) l₁
    w' : expᴸ-segment-inclusion-list α β b ℓ ≺⟨List (α ×ₒ β) ⟩ l
    w' = transport
          (λ - → expᴸ-segment-inclusion-list α β b ℓ ≺⟨List (α ×ₒ β) ⟩ -)
          (expᴸ-tail-section-of-expᴸ-segment-inclusion' α β a b l δ)
          (expᴸ-segment-inclusion-is-order-preserving α β b
            l₁
            (expᴸ-tail α β a b l δ)
            w)

  fg-is-id : f ∘ g ∼ id
  fg-is-id (inl (([] , []-decr) , inl ⋆)) = refl
  fg-is-id (inl ((((a' , b') ∷ l') , ε) , inl ⋆)) =
   ap (λ - → (inl (- , inl ⋆)))
      (to-DecrList₂-= α (β ↓ b)
        (ap ((a' , b') ∷_)
            (expᴸ-segment-inclusion-section-of-expᴸ-tail' α β a b l'
              (tail-is-decreasing-pr₂ α (β ↓ b) (a , b') ε))))
  fg-is-id (inl (([] , []-decr) , inr x)) = refl
  fg-is-id (inl ((l'@(_ ∷ l₁) , ε) , inr (a' , s))) =
   ap (λ - → inl (- , inr (a' , s)))
      (expᴸ-segment-inclusion-section-of-expᴸ-tail α β a b l' ε)
  fg-is-id (inr ((l' , ε) , w)) =
   ap inr (segment-inclusion-lc
            (expᴸ[𝟙+ α ] (β ↓ b))
            {expᴸ-tail α β a b l δ}
            (expᴸ-segment-inclusion-section-of-expᴸ-tail α β a b l' ε))

  gf-is-id : g ∘ f ∼ id
  gf-is-id (([] , []-decr) , []-lex) = refl
  gf-is-id ((((a' , b') ∷ l') , ε) , head-lex (inl u)) =
   segment-inclusion-lc
    (expᴸ[𝟙+ α ] β)
    {(a , b ∷ l) , δ}
    (expᴸ-tail-section-of-expᴸ-segment-inclusion α β a b (a' , b' ∷ l'))
  gf-is-id ((((a' , b) ∷ l') , ε) , head-lex (inr (refl , u))) =
   segment-inclusion-lc
    (expᴸ[𝟙+ α ] β)
    {(a , b ∷ l) , δ}
    (to-DecrList₂-= α β
      (ap ((a' , b) ∷_)
          (expᴸ-tail-section-of-expᴸ-segment-inclusion' α β a b l' ε)))
  gf-is-id ((((a , b) ∷ l') , ε) , tail-lex refl u) =
   segment-inclusion-lc
    (expᴸ[𝟙+ α ] β)
    {(a , b ∷ l) , δ}
    (to-DecrList₂-= α β
      (ap ((a , b) ∷_)
          (expᴸ-tail-section-of-expᴸ-segment-inclusion' α β a b l' ε)))

  g-is-order-preserving : is-order-preserving RHS LHS g
  g-is-order-preserving (inl (l , inl ⋆)) (inl (l' , inl ⋆)) (inr (refl , u)) =
   expᴸ-segment-inclusion-is-order-preserving α β b l l' u
  g-is-order-preserving (inl (l , inl ⋆)) (inl (l' , inr (a' , j))) u =
   expᴸ-segment-inclusion-list-lex α β b
  g-is-order-preserving (inl (l , inr (a' , i))) (inl (l' , inl ⋆))
                        (inr (e , u)) = 𝟘-elim (+disjoint (e ⁻¹))
  g-is-order-preserving (inl (l , inr (a' , i))) (inl (l' , inr (a'' , j)))
                        (inl u) = head-lex (inr (refl , u))
  g-is-order-preserving (inl (l , inr (a' , i))) (inl (l' , inr (a'' , j)))
                        (inr (refl , v)) =
   tail-lex refl (expᴸ-segment-inclusion-is-order-preserving α β b l l' v)
  g-is-order-preserving (inl (l , inl ⋆)) (inr (l' , v)) _ =
   expᴸ-segment-inclusion-list-lex α β b
  g-is-order-preserving (inl (l , inr (a' , i))) (inr (l' , v)) _ =
   head-lex (inr (refl , i))
  g-is-order-preserving (inr (l , v)) (inr (l' , v')) u =
   tail-lex refl (expᴸ-segment-inclusion-is-order-preserving α β b l l' u)

  f-is-order-preserving : is-order-preserving LHS RHS f
  f-is-order-preserving (([] , δ₁) , u)
                        (((_ ∷ l') , δ₂) , head-lex (inl v)) w =
   inr (refl , []-lex)
  f-is-order-preserving (([] , δ₁) , u)
                        (((_ ∷ l') , δ₂) , head-lex (inr (refl , v))) w = inl ⋆
  f-is-order-preserving (([] , δ₁) , u)
                        (((_ ∷ l') , δ₂) , tail-lex refl v) w = ⋆

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inl u))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (head-lex (inl w)) = inr (refl , (head-lex (inl w)))
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inl u))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (head-lex (inr (refl , w))) =
   inr (refl , (head-lex (inr ((segment-inclusion-lc β refl) , w))))
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inl u))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (tail-lex refl w) =
   inr (refl , tail-lex
                (ap (a₁ ,_) (segment-inclusion-lc β refl))
                (expᴸ-tail-is-order-preserving α β a b _ _ w))

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inl u))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inr (refl , v))) w =
   inl ⋆
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inl u))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , tail-lex refl v) w = ⋆

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inr (refl , u)))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (head-lex (inl w)) =
   𝟘-elim (irrefl β b₁ (Transitivity β b₁ b₂ b₁ w v))
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inr (refl , u)))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (head-lex (inr (refl , w))) = 𝟘-elim (irrefl β b₁ v)
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inr (refl , u)))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (tail-lex refl w) = 𝟘-elim (irrefl β b₁ v)

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inr (refl , u)))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inr (refl , v)))
                        (head-lex (inl w)) = 𝟘-elim (irrefl β b₁ w)
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inr (refl , u)))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inr (refl , v)))
                        (head-lex (inr (e , w))) = inl w
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inr (refl , u)))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inr (refl , v)))
                        (tail-lex e w) =
   inr (ap inr (segment-inclusion-lc α (ap pr₁ e)) ,
        expᴸ-tail-is-order-preserving α β a b δ₁ δ₂ w)

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , head-lex (inr (refl , u)))
                        (((a₂ , b₂ ∷ l₂) , δ₂) , tail-lex refl v) w = ⋆

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (head-lex (inl w)) =
   𝟘-elim (irrefl β b₁ (Transitivity β b₁ b₂ b₁ w v))
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (head-lex (inr (refl , w))) = 𝟘-elim (irrefl β b₁ v)
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inl v))
                        (tail-lex refl w) = 𝟘-elim (irrefl β b₁ v)

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inr (refl , v)))
                        (head-lex (inl w)) = 𝟘-elim (irrefl β b₁ w)
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inr (refl , v)))
                        (head-lex (inr (e , w))) =
   𝟘-elim (irrefl α a₁ (Transitivity α a₁ a₂ a₁ w v))
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , head-lex (inr (refl , v)))
                        (tail-lex e w) =
   𝟘-elim (irrefl α a₁ (transport⁻¹ (λ - → - ≺⟨ α ⟩ a₁) (ap pr₁ e) v))

  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , tail-lex refl v)
                        (head-lex (inl w)) = 𝟘-elim (irrefl β b₁ w)
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , tail-lex refl v)
                        (head-lex (inr (e , w))) = 𝟘-elim (irrefl α a₁ w)
  f-is-order-preserving (((a₁ , b₁ ∷ l₁) , δ₁) , tail-lex refl u)
                        (((a₂ , b₂ ∷ l₂) , δ₂) , tail-lex refl v)
                        (tail-lex e w) =
   expᴸ-tail-is-order-preserving α β a₁ b₁ δ₁ δ₂ w

\end{code}

The below is a variation of, and follows from, the above where we start with an
element of expᴸ[𝟙+ α ] (β ↓ b) rather than expᴸ[𝟙+ α ] β.

\begin{code}

expᴸ-↓-cons-≃ₒ'
 : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
   (a : ⟨ α ⟩) (b : ⟨ β ⟩) (l : ⟨ expᴸ[𝟙+ α ] (β ↓ b) ⟩)
 → expᴸ[𝟙+ α ] β ↓ extended-expᴸ-segment-inclusion α β b l a
   ≃ₒ expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a)) +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ l)
expᴸ-↓-cons-≃ₒ' α β a b (l , δ) =
 transport
  (λ - → LHS ≃ₒ expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a))
                +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ -))
  I
  II
   where
    LHS = expᴸ[𝟙+ α ] β ↓ extended-expᴸ-segment-inclusion α β b (l , δ) a
    ε : is-decreasing-pr₂ α β (a , b ∷ expᴸ-segment-inclusion-list α β b l)
    ε = extended-expᴸ-segment-inclusion-is-decreasing-pr₂ α β b l a δ
    l' : List ⟨ α ×ₒ β ⟩
    l' = expᴸ-segment-inclusion-list α β b l

    I : expᴸ-tail α β a b l' ε = (l , δ)
    I = expᴸ-segment-inclusion-section-of-expᴸ-tail α β a b l δ

    II : LHS ≃ₒ expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a))
                +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ expᴸ-tail α β a b l' ε)
    II = expᴸ-↓-cons-≃ₒ α β a b (expᴸ-segment-inclusion-list α β b l) ε

\end{code}

Finally, using univalence, we promote the above equivalences to identifications.

\begin{code}

expᴸ-↓-cons
 : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
   (a : ⟨ α ⟩) (b : ⟨ β ⟩) (l : List ⟨ α ×ₒ β ⟩)
   (δ : is-decreasing-pr₂ α β ((a , b) ∷ l))
 → expᴸ[𝟙+ α ] β ↓ (((a , b) ∷ l) , δ)
   = expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a))
      +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ expᴸ-tail α β a b l δ)
expᴸ-↓-cons α β a b l δ = eqtoidₒ (ua _) fe' _ _ (expᴸ-↓-cons-≃ₒ α β a b l δ)

expᴸ-↓-cons'
 : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
   (a : ⟨ α ⟩) (b : ⟨ β ⟩) (l : ⟨ expᴸ[𝟙+ α ] (β ↓ b) ⟩)
 → expᴸ[𝟙+ α ] β ↓ extended-expᴸ-segment-inclusion α β b l a
   = expᴸ[𝟙+ α ] (β ↓ b) ×ₒ (𝟙ₒ +ₒ (α ↓ a)) +ₒ (expᴸ[𝟙+ α ] (β ↓ b) ↓ l)
expᴸ-↓-cons' α β a b l = eqtoidₒ (ua _) fe' _ _ (expᴸ-↓-cons-≃ₒ' α β a b l)

\end{code}