In Ordinals.Exponentiation.PropertiesViaTransport we derive various properties of our concrete ordinal exponentiation (using decreasing lists) via transport and the equivalence with the abstract construction (using suprema) in Ordinals.Exponentiation.RelatingConstructions. For comparison, and with an eye on to their combinatorial meaning, we offer direct proofs of some of these properties here. \begin{code} {-# OPTIONS --safe --without-K --exact-split #-} open import UF.Univalence open import UF.PropTrunc open import UF.Size module Ordinals.Exponentiation.DecreasingListProperties-Concrete (ua : Univalence) (pt : propositional-truncations-exist) (sr : Set-Replacement pt) where open import UF.Base open import UF.Equiv open import UF.FunExt open import UF.UA-FunExt open import UF.ImageAndSurjection pt 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 Ordinals.Arithmetic fe open import Ordinals.Equivalence open import Ordinals.Maps open import Ordinals.OrdinalOfOrdinals ua open import Ordinals.Type open import Ordinals.Underlying open import Ordinals.OrdinalOfOrdinalsSuprema ua open import Ordinals.Exponentiation.DecreasingList ua open import Ordinals.Exponentiation.Specification ua pt sr open PropositionalTruncation pt open suprema pt sr \end{code} The fact that the concrete exponentiation satisfies the zero specification is easily shown, as is the fact that exponentiating by 𝟙ₒ is the identity. \begin{code} expᴸ-satisfies-zero-specification-≃ₒ : (α : Ordinal 𝓤) → expᴸ[𝟙+ α ] (𝟘ₒ {𝓥}) ≃ₒ 𝟙ₒ {𝓤 ⊔ 𝓥} expᴸ-satisfies-zero-specification-≃ₒ α = f , f-order-preserving , qinvs-are-equivs f f-qinv , g-order-preserving where f : ⟨ expᴸ[𝟙+ α ] 𝟘ₒ ⟩ → 𝟙 f _ = ⋆ f-order-preserving : is-order-preserving (expᴸ[𝟙+ α ] 𝟘ₒ) 𝟙ₒ f f-order-preserving ([] , δ) ([] , ε) u = 𝟘-elim (Irreflexivity (expᴸ[𝟙+ α ] 𝟘ₒ) ([] , δ) u) g : 𝟙 → ⟨ expᴸ[𝟙+ α ] 𝟘ₒ ⟩ g _ = [] , []-decr g-order-preserving : is-order-preserving 𝟙ₒ (expᴸ[𝟙+ α ] 𝟘ₒ) g g-order-preserving ⋆ ⋆ = 𝟘-elim f-qinv : qinv f f-qinv = g , p , q where p : g ∘ f ∼ id p ([] , []-decr) = refl q : f ∘ g ∼ id q ⋆ = refl expᴸ-satisfies-zero-specification : (α : Ordinal 𝓤) → exp-specification-zero {𝓤} {𝓥} (𝟙ₒ +ₒ α) (expᴸ[𝟙+ α ]) expᴸ-satisfies-zero-specification {𝓤} {𝓥} α = eqtoidₒ (ua (𝓤 ⊔ 𝓥)) fe' (expᴸ[𝟙+ α ] 𝟘ₒ) 𝟙ₒ (expᴸ-satisfies-zero-specification-≃ₒ α) 𝟙ₒ-neutral-expᴸ-≃ₒ : (α : Ordinal 𝓤) → expᴸ[𝟙+ α ] (𝟙ₒ {𝓥}) ≃ₒ 𝟙ₒ +ₒ α 𝟙ₒ-neutral-expᴸ-≃ₒ α = f , f-order-preserving , qinvs-are-equivs f f-qinv , g-order-preserving where f : ⟨ expᴸ[𝟙+ α ] (𝟙ₒ {𝓤}) ⟩ → ⟨ 𝟙ₒ +ₒ α ⟩ f ([] , δ) = inl ⋆ f (((a , ⋆) ∷ []) , δ) = inr a f (((a , ⋆) ∷ (a' , ⋆) ∷ l) , many-decr p δ) = 𝟘-elim (irrefl 𝟙ₒ ⋆ p) f-order-preserving : is-order-preserving (expᴸ[𝟙+ α ] (𝟙ₒ {𝓤})) (𝟙ₒ +ₒ α) f f-order-preserving ([] , δ) ([] , ε) q = 𝟘-elim (irrefl (expᴸ[𝟙+ α ] 𝟙ₒ) ([] , δ) q) f-order-preserving ([] , δ) ((y ∷ []) , ε) q = ⋆ f-order-preserving ([] , δ) (((a , ⋆) ∷ (a' , ⋆) ∷ l) , many-decr p ε) q = 𝟘-elim (irrefl 𝟙ₒ ⋆ p) f-order-preserving (((a , ⋆) ∷ []) , δ) (((a' , ⋆) ∷ []) , ε) (head-lex (inr (r , q))) = q f-order-preserving (((a , ⋆) ∷ []) , δ) (((a' , ⋆) ∷ (a'' , ⋆) ∷ l) , many-decr p ε) q = 𝟘-elim (irrefl 𝟙ₒ ⋆ p) f-order-preserving (((a , ⋆) ∷ (a' , ⋆) ∷ l) , many-decr p δ) (l' , ε) q = 𝟘-elim (irrefl 𝟙ₒ ⋆ p) g : ⟨ 𝟙ₒ +ₒ α ⟩ → ⟨ expᴸ[𝟙+ α ] (𝟙ₒ {𝓤}) ⟩ g (inl ⋆) = ([] , []-decr) g (inr a) = ([ a , ⋆ ] , sing-decr) g-order-preserving : is-order-preserving (𝟙ₒ +ₒ α) (expᴸ[𝟙+ α ] (𝟙ₒ {𝓤})) g g-order-preserving (inl ⋆) (inr a) ⋆ = []-lex g-order-preserving (inr a) (inr a') p = head-lex (inr (refl , p)) f-qinv : qinv f f-qinv = g , p , q where p : g ∘ f ∼ id p ([] , []-decr) = refl p (((a , ⋆) ∷ []) , δ) = to-DecrList₂-= α 𝟙ₒ refl p (((a , ⋆) ∷ (a' , ⋆) ∷ l) , many-decr p δ) = 𝟘-elim (irrefl 𝟙ₒ ⋆ p) q : f ∘ g ∼ id q (inl ⋆) = refl q (inr a) = refl 𝟙ₒ-neutral-expᴸ : (α : Ordinal 𝓤) → (expᴸ[𝟙+ α ] 𝟙ₒ) = 𝟙ₒ +ₒ α 𝟙ₒ-neutral-expᴸ {𝓤} α = eqtoidₒ (ua 𝓤) fe' (expᴸ[𝟙+ α ] (𝟙ₒ {𝓤})) (𝟙ₒ +ₒ α) (𝟙ₒ-neutral-expᴸ-≃ₒ α) \end{code} We next prove the equivalence expᴸ[𝟙+ α ] (β +ₒ γ) ≃ₒ (expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] γ) in several steps. \begin{code} module _ (α : Ordinal 𝓤) (β γ : Ordinal 𝓥) where private forward-left-on-lists : List ⟨ α ×ₒ (β +ₒ γ) ⟩ → List ⟨ α ×ₒ β ⟩ forward-left-on-lists [] = [] forward-left-on-lists ((a , inl b) ∷ l) = (a , b) ∷ forward-left-on-lists l forward-left-on-lists ((a , inr c) ∷ l) = forward-left-on-lists l forward-left-on-lists-preserves-decreasing-pr₂ : (l : List ⟨ α ×ₒ (β +ₒ γ) ⟩) → is-decreasing-pr₂ α (β +ₒ γ) l → is-decreasing-pr₂ α β (forward-left-on-lists l) forward-left-on-lists-preserves-decreasing-pr₂ [] δ = []-decr forward-left-on-lists-preserves-decreasing-pr₂ ((a , inr c) ∷ l) δ = forward-left-on-lists-preserves-decreasing-pr₂ l (tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inr c) δ) forward-left-on-lists-preserves-decreasing-pr₂ ((a , inl b) ∷ []) δ = sing-decr forward-left-on-lists-preserves-decreasing-pr₂ ((a , inl b) ∷ (a' , inl b') ∷ l) (many-decr p δ) = many-decr p (forward-left-on-lists-preserves-decreasing-pr₂ ((a' , inl b') ∷ l) δ) forward-left-on-lists-preserves-decreasing-pr₂ ((a , inl b) ∷ (a' , inr c) ∷ l) (many-decr p δ) = 𝟘-elim p forward-left : ⟨ expᴸ[𝟙+ α ] (β +ₒ γ) ⟩ → ⟨ expᴸ[𝟙+ α ] β ⟩ forward-left (l , δ) = forward-left-on-lists l , forward-left-on-lists-preserves-decreasing-pr₂ l δ forward-right-on-lists : List ⟨ α ×ₒ (β +ₒ γ) ⟩ → List ⟨ α ×ₒ γ ⟩ forward-right-on-lists [] = [] forward-right-on-lists ((a , inl b) ∷ l) = forward-right-on-lists l forward-right-on-lists ((a , inr c) ∷ l) = (a , c) ∷ forward-right-on-lists l \end{code} Proving that forward-right-on-lists preserves the decreasing-pr₂ property requires the following lemma which says that a decreasing-pr₂ list with a "left-entry" (a , inl b) continues to have only left-entries and can't be followed by an element (a' , inr c) (because that would not be decreasing in the second component). \begin{code} stay-left-list : (l : List ⟨ α ×ₒ (β +ₒ γ) ⟩) (a : ⟨ α ⟩) (b : ⟨ β ⟩) (δ : is-decreasing-pr₂ α (β +ₒ γ) ((a , inl b) ∷ l)) → forward-right-on-lists ((a , inl b) ∷ l) = [] stay-left-list [] a b δ = refl stay-left-list ((a' , inl b') ∷ l) a b (many-decr p δ) = stay-left-list l a b' δ stay-left-list ((a' , inr c) ∷ l) a b (many-decr p δ) = 𝟘-elim p forward-right-on-lists-preserves-decreasing-pr₂ : (l : List ⟨ α ×ₒ (β +ₒ γ) ⟩) → is-decreasing-pr₂ α (β +ₒ γ) l → is-decreasing-pr₂ α γ (forward-right-on-lists l) forward-right-on-lists-preserves-decreasing-pr₂ [] δ = []-decr forward-right-on-lists-preserves-decreasing-pr₂ ((a , inl b) ∷ l) δ = forward-right-on-lists-preserves-decreasing-pr₂ l (tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inl b) δ) forward-right-on-lists-preserves-decreasing-pr₂ ((a , inr c) ∷ []) δ = sing-decr forward-right-on-lists-preserves-decreasing-pr₂ ((a , inr c) ∷ (a' , inr c') ∷ l) (many-decr p δ) = many-decr p (forward-right-on-lists-preserves-decreasing-pr₂ ((a' , inr c') ∷ l) δ) forward-right-on-lists-preserves-decreasing-pr₂ ((a , inr c) ∷ (a' , inl b) ∷ l) (many-decr p δ) = transport⁻¹ (is-decreasing-pr₂ α γ) (ap ((a , c) ∷_) (stay-left-list l a' b δ)) sing-decr forward-right : ⟨ expᴸ[𝟙+ α ] (β +ₒ γ) ⟩ → ⟨ expᴸ[𝟙+ α ] γ ⟩ forward-right (l , δ) = forward-right-on-lists l , forward-right-on-lists-preserves-decreasing-pr₂ l δ stay-left : (l : List ⟨ α ×ₒ (β +ₒ γ) ⟩) (a : ⟨ α ⟩) (b : ⟨ β ⟩) (δ : is-decreasing-pr₂ α (β +ₒ γ) ((a , inl b) ∷ l)) → forward-right (((a , inl b) ∷ l) , δ) = [] , []-decr stay-left l a b δ = to-DecrList₂-= α γ (stay-left-list l a b δ) forward-right-constant-on-inl : (l₁ l₂ : List ⟨ α ×ₒ (β +ₒ γ) ⟩) (a₁ a₂ : ⟨ α ⟩) (b₁ b₂ : ⟨ β ⟩) (δ₁ : is-decreasing-pr₂ α (β +ₒ γ) ((a₁ , inl b₁) ∷ l₁)) (δ₂ : is-decreasing-pr₂ α (β +ₒ γ) ((a₂ , inl b₂) ∷ l₂)) → forward-right (((a₁ , inl b₁) ∷ l₁) , δ₁) = forward-right (((a₂ , inl b₂) ∷ l₂) , δ₂) forward-right-constant-on-inl l₁ l₂ a₁ a₂ b₁ b₂ δ₁ δ₂ = stay-left l₁ a₁ b₁ δ₁ ∙ (stay-left l₂ a₂ b₂ δ₂) ⁻¹ \end{code} The maps forward-left and forward-right are now combined into a single order preserving forward map. \begin{code} forward : ⟨ expᴸ[𝟙+ α ] (β +ₒ γ) ⟩ → ⟨ expᴸ[𝟙+ α ] β ×ₒ expᴸ[𝟙+ α ] γ ⟩ forward l = forward-left l , forward-right l forward-is-order-preserving : is-order-preserving (expᴸ[𝟙+ α ] (β +ₒ γ)) (expᴸ[𝟙+ α ] β ×ₒ expᴸ[𝟙+ α ] γ) forward forward-is-order-preserving ([] , δ₁) (((a , inl b) ∷ l₂) , δ₂) []-lex = inr ((stay-left l₂ a b δ₂ ⁻¹) , []-lex) forward-is-order-preserving ([] , δ₁) (((a , inr c) ∷ l₂) , δ₂) []-lex = inl []-lex forward-is-order-preserving (((a , inl b) ∷ l₁) , δ₁) (((a' , inl b') ∷ l₂) , δ₂) (head-lex (inr (refl , p))) = inr (forward-right-constant-on-inl l₁ l₂ a a' b b' δ₁ δ₂ , head-lex (inr (refl , p))) forward-is-order-preserving (((a , inl b) ∷ l₁) , δ₁) (((a' , inr c) ∷ l₂) , δ₂) (head-lex (inr (e , p))) = 𝟘-elim (+disjoint e) forward-is-order-preserving (((a , inr c) ∷ l₁) , δ₁) (((a' , inl b) ∷ l₂) , δ₂) (head-lex (inr (e , p))) = 𝟘-elim (+disjoint' e) forward-is-order-preserving (((a , inr c) ∷ l₁) , δ₁) (((a' , inr c') ∷ l₂) , δ₂) (head-lex (inr (refl , p))) = inl (head-lex (inr (refl , p))) forward-is-order-preserving (((a , inl b) ∷ l₁) , δ₁) (((a' , inl b') ∷ l₂) , δ₂) (head-lex (inl p)) = inr (forward-right-constant-on-inl l₁ l₂ a a' b b' δ₁ δ₂ , head-lex (inl p)) forward-is-order-preserving (((a , inl b) ∷ l₁) , δ₁) (((a' , inr c) ∷ l₂) , δ₂) (head-lex (inl p)) = inl (transport⁻¹ (λ - → - ≺⟨ expᴸ[𝟙+ α ] γ ⟩ forward-right (((a' , inr c) ∷ l₂) , δ₂)) (stay-left l₁ a b δ₁) []-lex) forward-is-order-preserving (((a , inr c) ∷ l₁) , δ₁) (((a' , inl b) ∷ l₂) , δ₂) (head-lex (inl p)) = 𝟘-elim p forward-is-order-preserving (((a , inr c) ∷ l₁) , δ₁) (((a' , inr c') ∷ l₂) , δ₂) (head-lex (inl p)) = inl (head-lex (inl p)) forward-is-order-preserving (((a , inl b) ∷ l₁) , δ₁) (((a , inl b) ∷ l₂) , δ₂) (tail-lex refl p) = h (forward-is-order-preserving (l₁ , ε₁) (l₂ , ε₂) p) where ε₁ = tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inl b) δ₁ ε₂ = tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inl b) δ₂ h : forward (l₁ , ε₁) ≺⟨ (expᴸ[𝟙+ α ] β ×ₒ expᴸ[𝟙+ α ] γ) ⟩ forward (l₂ , ε₂) → forward (((a , inl b) ∷ l₁) , δ₁) ≺⟨ (expᴸ[𝟙+ α ] β ×ₒ expᴸ[𝟙+ α ] γ) ⟩ forward (((a , inl b) ∷ l₂) , δ₂) h (inl q) = inl q h (inr (e , q)) = inr (forward-right-constant-on-inl l₁ l₂ a a b b δ₁ δ₂ , tail-lex refl q) forward-is-order-preserving (((a , inr c) ∷ l₁) , δ₁) (((a , inr c) ∷ l₂) , δ₂) (tail-lex refl p) = h (forward-is-order-preserving (l₁ , ε₁) (l₂ , ε₂) p) where ε₁ = tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inr c) δ₁ ε₂ = tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inr c) δ₂ h : forward (l₁ , ε₁) ≺⟨ (expᴸ[𝟙+ α ] β ×ₒ expᴸ[𝟙+ α ] γ) ⟩ forward (l₂ , ε₂) → forward (((a , inr c) ∷ l₁) , δ₁) ≺⟨ (expᴸ[𝟙+ α ] β ×ₒ expᴸ[𝟙+ α ] γ) ⟩ forward (((a , inr c) ∷ l₂) , δ₂) h (inl q) = inl (tail-lex refl q) h (inr (e , q)) = inr (to-DecrList₂-= α γ (ap ((a , c) ∷_) (ap pr₁ e)) , q) \end{code} We now construct an order preserving map in the other direction. \begin{code} backward-on-lists : List ⟨ α ×ₒ β ⟩ → List ⟨ α ×ₒ γ ⟩ → List ⟨ α ×ₒ (β +ₒ γ) ⟩ backward-on-lists l ((a , c) ∷ l') = (a , inr c) ∷ backward-on-lists l l' backward-on-lists ((a , b) ∷ l) [] = (a , inl b) ∷ backward-on-lists l [] backward-on-lists [] [] = [] backward-on-lists-preserves-decreasing-pr₂ : (l₁ : List ⟨ α ×ₒ β ⟩) (l₂ : List ⟨ α ×ₒ γ ⟩) → is-decreasing-pr₂ α β l₁ → is-decreasing-pr₂ α γ l₂ → is-decreasing-pr₂ α (β +ₒ γ) (backward-on-lists l₁ l₂) backward-on-lists-preserves-decreasing-pr₂ l₁ ((a , c) ∷ (a' , c') ∷ l₂) δ₁ (many-decr p δ) = many-decr p (backward-on-lists-preserves-decreasing-pr₂ l₁ ((a' , c') ∷ l₂) δ₁ δ) backward-on-lists-preserves-decreasing-pr₂ [] ((a , c) ∷ []) δ₁ δ₂ = sing-decr backward-on-lists-preserves-decreasing-pr₂ ((a' , b') ∷ l₁) ((a , c) ∷ []) δ₁ δ₂ = many-decr ⋆ (backward-on-lists-preserves-decreasing-pr₂ ((a' , b') ∷ l₁) [] δ₁ []-decr) backward-on-lists-preserves-decreasing-pr₂ ((a , b) ∷ []) [] δ₁ δ₂ = sing-decr backward-on-lists-preserves-decreasing-pr₂ ((a , b) ∷ (a' , b') ∷ l₁) [] (many-decr p δ) δ₂ = many-decr p (backward-on-lists-preserves-decreasing-pr₂ ((a' , b') ∷ l₁) [] δ []-decr) backward-on-lists-preserves-decreasing-pr₂ [] [] δ₁ δ₂ = []-decr backward : ⟨ (expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] γ) ⟩ → ⟨ expᴸ[𝟙+ α ] (β +ₒ γ) ⟩ backward ((l₁ , δ₁) , (l₂ , δ₂)) = backward-on-lists l₁ l₂ , backward-on-lists-preserves-decreasing-pr₂ l₁ l₂ δ₁ δ₂ backward-is-order-preserving' : (l₁ l₁' : List ⟨ α ×ₒ β ⟩) (l₂ l₂' : List ⟨ α ×ₒ γ ⟩) (δ₁ : is-decreasing-pr₂ α β l₁) (δ₁' : is-decreasing-pr₂ α β l₁') (δ₂ : is-decreasing-pr₂ α γ l₂) (δ₂' : is-decreasing-pr₂ α γ l₂') → ((l₁ , δ₁) , (l₂ , δ₂)) ≺⟨ (expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] γ) ⟩ ((l₁' , δ₁') , (l₂' , δ₂')) → backward ((l₁ , δ₁) , (l₂ , δ₂)) ≺⟨ expᴸ[𝟙+ α ] (β +ₒ γ) ⟩ backward ((l₁' , δ₁') , (l₂' , δ₂')) backward-is-order-preserving' [] [] [] [] δ₁ δ₁' δ₂ δ₂' (inl ()) backward-is-order-preserving' [] [] [] [] δ₁ δ₁' δ₂ δ₂' (inr (refl , ())) backward-is-order-preserving' [] [] [] (_ ∷ l₂') δ₁ δ₁' δ₂ δ₂' p = []-lex backward-is-order-preserving' [] [] (_ ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inl ()) backward-is-order-preserving' [] [] (_ ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inr (e , p)) = 𝟘-elim ([]-is-not-cons _ l₂ (ap pr₁ (e ⁻¹))) backward-is-order-preserving' [] [] (_ ∷ l₂) (_ ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inl p))) = head-lex (inl p) backward-is-order-preserving' [] [] (_ ∷ l₂) (_ ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inr (refl , p)))) = head-lex (inr (refl , p)) backward-is-order-preserving' [] [] ((a , c) ∷ l₂) ((a , c) ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (tail-lex refl p)) = tail-lex refl (backward-is-order-preserving' [] [] l₂ l₂' []-decr []-decr (tail-is-decreasing-pr₂ α γ (a , c) δ₂) (tail-is-decreasing-pr₂ α γ (a , c) δ₂') (inl p)) backward-is-order-preserving' [] (_ ∷ l₁') [] [] δ₁ δ₁' δ₂ δ₂' p = []-lex backward-is-order-preserving' [] (_ ∷ l₁') [] (_ ∷ l₂') δ₁ δ₁' δ₂ δ₂' p = []-lex backward-is-order-preserving' [] (_ ∷ l₁') (_ ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inl ()) backward-is-order-preserving' [] (_ ∷ l₁') (_ ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inr (e , p)) = 𝟘-elim ([]-is-not-cons _ l₂ (ap pr₁ (e ⁻¹))) backward-is-order-preserving' [] (_ ∷ l₁') (_ ∷ l₂) (_ ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inl p))) = head-lex (inl p) backward-is-order-preserving' [] (_ ∷ l₁') (_ ∷ l₂) (_ ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inr (refl , p)))) = head-lex (inr (refl , p)) backward-is-order-preserving' [] (x ∷ l₁') (y ∷ l₂) (z ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (tail-lex refl p)) = tail-lex refl (backward-is-order-preserving' [] (x ∷ l₁') l₂ l₂' []-decr δ₁' (tail-is-decreasing-pr₂ α γ y δ₂) (tail-is-decreasing-pr₂ α γ z δ₂') (inl p)) backward-is-order-preserving' [] (x ∷ l₁') (y ∷ l₂) (z ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inr (refl , p)) = tail-lex refl (backward-is-order-preserving' [] (x ∷ l₁') l₂ l₂ []-decr δ₁' (tail-is-decreasing-pr₂ α γ y δ₂') (tail-is-decreasing-pr₂ α γ z δ₂) (inr (refl , []-lex))) backward-is-order-preserving' (x ∷ l₁) [] [] [] δ₁ δ₁' δ₂ δ₂' (inl ()) backward-is-order-preserving' (x ∷ l₁) [] [] [] δ₁ δ₁' δ₂ δ₂' (inr (refl , ())) backward-is-order-preserving' (x ∷ l₁) [] [] (x₁ ∷ l₂') δ₁ δ₁' δ₂ δ₂' p = head-lex (inl ⋆) backward-is-order-preserving' (x ∷ l₁) [] (y ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inl ()) backward-is-order-preserving' (x ∷ l₁) [] (y ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inr (e , p)) = 𝟘-elim ([]-is-not-cons y l₂ (ap pr₁ (e ⁻¹))) backward-is-order-preserving' (x ∷ l₁) [] (y ∷ l₂) (z ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inl p))) = head-lex (inl p) backward-is-order-preserving' (x ∷ l₁) [] (y ∷ l₂) (z ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inr (refl , p)))) = head-lex (inr (refl , p)) backward-is-order-preserving' (x ∷ l₁) [] (y ∷ l₂) (z ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (tail-lex refl p)) = tail-lex refl (backward-is-order-preserving' (x ∷ l₁) [] l₂ l₂' δ₁ []-decr (tail-is-decreasing-pr₂ α γ y δ₂) (tail-is-decreasing-pr₂ α γ z δ₂') (inl p)) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') [] [] δ₁ δ₁' δ₂ δ₂' (inr (refl , head-lex (inl p))) = head-lex (inl p) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') [] [] δ₁ δ₁' δ₂ δ₂' (inr (refl , head-lex (inr (refl , p)))) = head-lex (inr (refl , p)) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') [] [] δ₁ δ₁' δ₂ δ₂' (inr (refl , tail-lex refl p)) = tail-lex refl (backward-is-order-preserving' l₁ l₁' [] [] (tail-is-decreasing-pr₂ α β y δ₁) (tail-is-decreasing-pr₂ α β x δ₁') []-decr []-decr (inr (refl , p))) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') [] (z ∷ l₂') δ₁ δ₁' δ₂ δ₂' p = head-lex (inl ⋆) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') (z ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inl ()) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') (z ∷ l₂) [] δ₁ δ₁' δ₂ δ₂' (inr (e , p)) = 𝟘-elim ([]-is-not-cons z l₂ (ap pr₁ (e ⁻¹))) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') (z ∷ l₂) (w ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inl p))) = head-lex (inl p) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') (z ∷ l₂) (w ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (head-lex (inr (refl , p)))) = head-lex (inr (refl , p)) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') (z ∷ l₂) (w ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inl (tail-lex refl p)) = tail-lex refl (backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') l₂ l₂' δ₁ δ₁' (tail-is-decreasing-pr₂ α γ z δ₂) (tail-is-decreasing-pr₂ α γ z δ₂') (inl p)) backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') (z ∷ l₂) (w ∷ l₂') δ₁ δ₁' δ₂ δ₂' (inr (refl , p)) = tail-lex refl (backward-is-order-preserving' (x ∷ l₁) (y ∷ l₁') l₂ l₂ δ₁ δ₁' (tail-is-decreasing-pr₂ α γ z δ₂') (tail-is-decreasing-pr₂ α γ z δ₂) (inr (refl , p))) backward-is-order-preserving : is-order-preserving ((expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] γ)) (expᴸ[𝟙+ α ] (β +ₒ γ)) backward backward-is-order-preserving ((l₁ , δ₁) , (l₂ , δ₂)) ((l₁' , δ₁') , (l₂' , δ₂')) = backward-is-order-preserving' l₁ l₁' l₂ l₂' δ₁ δ₁' δ₂ δ₂' \end{code} The two maps are inverse to each other. \begin{code} backward-forward-is-id : backward ∘ forward ∼ id backward-forward-is-id (l , δ) = to-DecrList₂-= α (β +ₒ γ) (I l δ) where I : (l : List ⟨ α ×ₒ (β +ₒ γ) ⟩) → is-decreasing-pr₂ α (β +ₒ γ) l → backward-on-lists (forward-left-on-lists l) (forward-right-on-lists l) = l I [] δ = refl I ((a , inr c) ∷ l) δ = ap ((a , inr c) ∷_) (I l (tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inr c) δ)) I ((a , inl b) ∷ l) δ = backward-on-lists (fₗ ((a , inl b) ∷ l)) (fᵣ ((a , inl b) ∷ l)) =⟨ II ⟩ backward-on-lists (fₗ (a , inl b ∷ l)) [] =⟨ refl ⟩ backward-on-lists ((a , b) ∷ fₗ l) [] =⟨ refl ⟩ (a , inl b) ∷ backward-on-lists (fₗ l) [] =⟨ III ⟩ (a , inl b) ∷ backward-on-lists (fₗ l) (fᵣ l) =⟨ IV ⟩ ((a , inl b) ∷ l) ∎ where fₗ = forward-left-on-lists fᵣ = forward-right-on-lists II = ap (backward-on-lists (fₗ ((a , inl b) ∷ l))) (stay-left-list l a b δ) III = ap (λ - → (a , inl b) ∷ backward-on-lists (fₗ l) -) ((stay-left-list l a b δ) ⁻¹) IV = ap ((a , inl b) ∷_) (I l (tail-is-decreasing-pr₂ α (β +ₒ γ) (a , inl b) δ)) forward-backward-is-id : forward ∘ backward ∼ id forward-backward-is-id ((l₁ , δ₁) , (l₂ , δ₂)) = to-×-= I II where I : forward-left (backward ((l₁ , δ₁) , l₂ , δ₂)) = l₁ , δ₁ I = to-DecrList₂-= α β (I' l₁ l₂ δ₁ δ₂) where I' : (l₁ : List ⟨ α ×ₒ β ⟩) (l₂ : List ⟨ α ×ₒ γ ⟩) → is-decreasing-pr₂ α β l₁ → is-decreasing-pr₂ α γ l₂ → forward-left-on-lists (backward-on-lists l₁ l₂) = l₁ I' l₁ (y ∷ l₂) δ₁ δ₂ = I' l₁ l₂ δ₁ (tail-is-decreasing-pr₂ α γ y δ₂) I' [] [] δ₁ δ₂ = refl I' (x ∷ l₁) [] δ₁ δ₂ = ap (x ∷_) (I' l₁ [] (tail-is-decreasing-pr₂ α β x δ₁) []-decr) II : forward-right (backward ((l₁ , δ₁) , l₂ , δ₂)) = l₂ , δ₂ II = to-DecrList₂-= α γ (I' l₁ l₂ δ₁ δ₂) where I' : (l₁ : List ⟨ α ×ₒ β ⟩) (l₂ : List ⟨ α ×ₒ γ ⟩) → is-decreasing-pr₂ α β l₁ → is-decreasing-pr₂ α γ l₂ → forward-right-on-lists (backward-on-lists l₁ l₂) = l₂ I' l₁ (y ∷ l₂) δ₁ δ₂ = ap (y ∷_) (I' l₁ l₂ δ₁ (tail-is-decreasing-pr₂ α γ y δ₂)) I' [] [] δ₁ δ₂ = refl I' (x ∷ l₁) [] δ₁ δ₂ = I' l₁ [] (tail-is-decreasing-pr₂ α β x δ₁) []-decr \end{code} Finally, we put the piece togethere to obtain the desired equivalence. \begin{code} expᴸ-by-+ₒ-≃ₒ : expᴸ[𝟙+ α ] (β +ₒ γ) ≃ₒ (expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] γ) expᴸ-by-+ₒ-≃ₒ = forward , forward-is-order-preserving , qinvs-are-equivs forward (backward , backward-forward-is-id , forward-backward-is-id) , backward-is-order-preserving expᴸ-by-+ₒ : expᴸ[𝟙+ α ] (β +ₒ γ) = (expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] γ) expᴸ-by-+ₒ = eqtoidₒ (ua (𝓤 ⊔ 𝓥)) fe' (expᴸ[𝟙+ α ] (β +ₒ γ)) ((expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] γ)) expᴸ-by-+ₒ-≃ₒ \end{code} As a corollary, we can now derive that expᴸ satisfies the successor specification. \begin{code} expᴸ-satisfies-succ-specification : (α : Ordinal 𝓤) → exp-specification-succ (𝟙ₒ +ₒ α) (expᴸ[𝟙+ α ]) expᴸ-satisfies-succ-specification α β = expᴸ[𝟙+ α ] (β +ₒ 𝟙ₒ) =⟨ expᴸ-by-+ₒ α β 𝟙ₒ ⟩ (expᴸ[𝟙+ α ] β) ×ₒ (expᴸ[𝟙+ α ] 𝟙ₒ) =⟨ I ⟩ (expᴸ[𝟙+ α ] β) ×ₒ (𝟙ₒ +ₒ α) ∎ where I = ap ((expᴸ[𝟙+ α ] β) ×ₒ_) (𝟙ₒ-neutral-expᴸ α) \end{code} Finally, we give a direct proof that expᴸ satisfies the supremum specification. It will be convenient to introduce some abbreviations first. \begin{code} module _ {I : 𝓤 ̇ } (β : I → Ordinal 𝓤) (α : Ordinal 𝓤) where private ι : {i : I} → ⟨ β i ⟩ → ⟨ sup β ⟩ ι {i} = [ β i , sup β ]⟨ sup-is-upper-bound β i ⟩ ι-is-simulation : {i : I} → is-simulation (β i) (sup β ) ι ι-is-simulation {i} = [ β i , sup β ]⟨ sup-is-upper-bound β i ⟩-is-simulation ι-is-order-preserving : {i : I} → is-order-preserving (β i) (sup β) ι ι-is-order-preserving {i} = simulations-are-order-preserving (β i) (sup β) ι ι-is-simulation ι-is-order-reflecting : {i : I} → is-order-reflecting (β i) (sup β) ι ι-is-order-reflecting {i} = simulations-are-order-reflecting (β i) (sup β) ι ι-is-simulation ι-is-lc : {i : I} → left-cancellable ι ι-is-lc {i} = simulations-are-lc (β i) (sup β) ι ι-is-simulation ι-is-initial-segment : {i : I} → is-initial-segment (β i) (sup β ) ι ι-is-initial-segment {i} = simulations-are-initial-segments (β i) (sup β) ι ι-is-simulation ι-is-surjection : (s : ⟨ sup β ⟩) → ∃ i ꞉ I , Σ x ꞉ ⟨ β i ⟩ , ι x = s ι-is-surjection = sup-is-upper-bound-jointly-surjective β ι-is-surjection' : (s : ⟨ sup β ⟩) {i : I} (x : ⟨ β i ⟩) → s ≺⟨ sup β ⟩ ι x → Σ y ꞉ ⟨ β i ⟩ , ι y = s ι-is-surjection' s {i} x p = h (ι-is-initial-segment x s p) where h : Σ y ꞉ ⟨ β i ⟩ , y ≺⟨ β i ⟩ x × (ι y = s) → Σ y ꞉ ⟨ β i ⟩ , ι y = s h (y , (_ , q)) = y , q \end{code} For each i : I, we construct an order preserving and reflecting map to-expᴸ-sup : expᴸ[𝟙+ α ] (β i) → expᴸ[𝟙+ α ] (sup β) that is surjective and hence we get an equality of ordinals. \begin{code} to-expᴸ-sup : {i : I} → ⟨ expᴸ[𝟙+ α ] (β i) ⟩ → ⟨ expᴸ[𝟙+ α ] (sup β) ⟩ to-expᴸ-sup {i} = expᴸ-map α (β i) (sup β) ι ι-is-order-preserving to-expᴸ-sup-list : {i : I} → ⟨ expᴸ[𝟙+ α ] (β i) ⟩ → List ⟨ α ×ₒ (sup β) ⟩ to-expᴸ-sup-list = DecrList₂-list α (sup β) ∘ to-expᴸ-sup to-expᴸ-sup-is-order-preserving : {i : I} → is-order-preserving (expᴸ[𝟙+ α ] (β i)) (expᴸ[𝟙+ α ] (sup β)) to-expᴸ-sup to-expᴸ-sup-is-order-preserving {i} = expᴸ-map-is-order-preserving α (β i) (sup β) ι ι-is-order-preserving to-expᴸ-sup-is-order-reflecting : {i : I} → is-order-reflecting (expᴸ[𝟙+ α ] (β i)) (expᴸ[𝟙+ α ] (sup β)) to-expᴸ-sup to-expᴸ-sup-is-order-reflecting {i} = expᴸ-map-is-order-reflecting α (β i) (sup β) ι ι-is-order-preserving ι-is-order-reflecting ι-is-lc to-expᴸ-sup-is-simulation : {i : I} → is-simulation (expᴸ[𝟙+ α ] (β i)) (expᴸ[𝟙+ α ] (sup β)) to-expᴸ-sup to-expᴸ-sup-is-simulation {i} = expᴸ-map-is-simulation α (β i) (sup β) ι ι-is-order-preserving ι-is-initial-segment expᴸ-sup-is-upper-bound : (i : I) → expᴸ[𝟙+ α ] (β i) ⊴ expᴸ[𝟙+ α ] (sup β) expᴸ-sup-is-upper-bound i = to-expᴸ-sup , to-expᴸ-sup-is-simulation expᴸ-sup-⊴ : sup (expᴸ[𝟙+ α ] ∘ β) ⊴ expᴸ[𝟙+ α ] (sup β) expᴸ-sup-⊴ = sup-is-lower-bound-of-upper-bounds (λ i → (expᴸ[𝟙+ α ] (β i))) (expᴸ[𝟙+ α ] (sup β)) expᴸ-sup-is-upper-bound expᴸ-sup-map : ⟨ sup (expᴸ[𝟙+ α ] ∘ β) ⟩ → ⟨ expᴸ[𝟙+ α ] (sup β) ⟩ expᴸ-sup-map = [ sup (expᴸ[𝟙+ α ] ∘ β) , expᴸ[𝟙+ α ] (sup β) ]⟨ expᴸ-sup-⊴ ⟩ expᴸ-sup-surjectivity-lemma : (a : ⟨ α ⟩) {i : I} (b : ⟨ β i ⟩) (l : List (⟨ α ×ₒ sup β ⟩)) → is-decreasing-pr₂ α (sup β) ((a , ι b) ∷ l) → Σ l' ꞉ List (⟨ α ×ₒ β i ⟩) , Σ δ ꞉ is-decreasing-pr₂ α (β i) ((a , b) ∷ l') , (a , ι b ∷ l) = to-expᴸ-sup-list (((a , b) ∷ l') , δ) expᴸ-sup-surjectivity-lemma a b [] δ = [] , sing-decr , refl expᴸ-sup-surjectivity-lemma a {i} b ((a' , s) ∷ l) δ = ((a' , b') ∷ l') , many-decr ⦅4⦆ δ' , ap (a , ι b ∷_) (ap (λ - → a' , - ∷ l) (⦅2⦆ ⁻¹) ∙ ⦅5⦆) where ⦅1⦆ : s ≺⟨ sup β ⟩ ι b ⦅1⦆ = heads-are-decreasing (underlying-order (sup β)) δ b' : ⟨ β i ⟩ b' = pr₁ (ι-is-surjection' s b ⦅1⦆) ⦅2⦆ : ι b' = s ⦅2⦆ = pr₂ (ι-is-surjection' s b ⦅1⦆) ⦅3⦆ : ι b' ≺⟨ sup β ⟩ ι b ⦅3⦆ = transport⁻¹ (λ - → underlying-order (sup β) - (ι b)) ⦅2⦆ ⦅1⦆ ⦅4⦆ : b' ≺⟨ β i ⟩ b ⦅4⦆ = ι-is-order-reflecting b' b ⦅3⦆ IH : Σ l' ꞉ List (⟨ α ×ₒ β i ⟩) , Σ δ' ꞉ is-decreasing-pr₂ α (β i) ((a' , b') ∷ l') , (a' , ι b' ∷ l) = to-expᴸ-sup-list (((a' , b') ∷ l') , δ') IH = expᴸ-sup-surjectivity-lemma a' b' l (transport⁻¹ (λ - → is-decreasing-pr₂ α (sup β) (a' , - ∷ l)) ⦅2⦆ (tail-is-decreasing (underlying-order (sup β)) δ)) l' : List (⟨ α ×ₒ β i ⟩) l' = pr₁ IH δ' : is-decreasing-pr₂ α (β i) (a' , b' ∷ l') δ' = pr₁ (pr₂ IH) ⦅5⦆ : (a' , ι b' ∷ l) = to-expᴸ-sup-list (((a' , b') ∷ l') , δ') ⦅5⦆ = pr₂ (pr₂ IH) expᴸ-sup-map-is-surjection : ∥ I ∥ → is-surjection expᴸ-sup-map expᴸ-sup-map-is-surjection I-inh = induced-simulation-from-sup-is-surjection (expᴸ[𝟙+ α ] ∘ β) (expᴸ[𝟙+ α ] (sup β)) expᴸ-sup-is-upper-bound σ where σ : (y : ⟨ expᴸ[𝟙+ α ] (sup β) ⟩) → ∃ i ꞉ I , Σ b ꞉ ⟨ expᴸ[𝟙+ α ] (β i) ⟩ , to-expᴸ-sup b = y σ ([] , []-decr) = ∥∥-functor (λ i → i , ([] , []-decr) , refl) I-inh σ (((a , s) ∷ l) , δ) = ∥∥-rec ∃-is-prop h (ι-is-surjection s) where h : Σ i ꞉ I , Σ b ꞉ ⟨ β i ⟩ , ι b = s → ∃ i ꞉ I , Σ b ꞉ ⟨ expᴸ[𝟙+ α ] (β i) ⟩ , to-expᴸ-sup b = (((a , s) ∷ l) , δ) h (i , b , refl) = ∣ i , (((a , b) ∷ l') , δ') , to-DecrList₂-= α (sup β) (e ⁻¹) ∣ where lemma : Σ l' ꞉ List ⟨ α ×ₒ β i ⟩ , Σ δ' ꞉ is-decreasing-pr₂ α (β i) ((a , b) ∷ l') , ((a , ι b) ∷ l = to-expᴸ-sup-list ((a , b ∷ l') , δ')) lemma = expᴸ-sup-surjectivity-lemma a b l δ l' = pr₁ lemma δ' = pr₁ (pr₂ lemma) e = pr₂ (pr₂ lemma) expᴸ-sup-= : ∥ I ∥ → sup (expᴸ[𝟙+ α ] ∘ β) = expᴸ[𝟙+ α ] (sup β) expᴸ-sup-= I-inh = surjective-simulation-gives-= pt fe' (ua 𝓤) (sup (expᴸ[𝟙+ α ] ∘ β)) (expᴸ[𝟙+ α ] (sup β)) expᴸ-sup-map [ sup (expᴸ[𝟙+ α ] ∘ β) , expᴸ[𝟙+ α ] (sup β) ]⟨ expᴸ-sup-⊴ ⟩-is-simulation (expᴸ-sup-map-is-surjection I-inh) \end{code} Finally, we obtain the desired result. \begin{code} expᴸ-satisfies-sup-specification : (α : Ordinal 𝓤) → exp-specification-sup (𝟙ₒ +ₒ α) (expᴸ[𝟙+ α ]) expᴸ-satisfies-sup-specification α α-nonzero I-inh β = (expᴸ-sup-= β α I-inh) ⁻¹ \end{code}