Tom de Jong, 16 October 2026.

We introduce a general scheme (cf. the BoundedOperations file) that captures
addition, multiplication and exponentiation by a fixed ordinal α.
This scheme used to be part of ArithmeticReflection, but was factored out to be
hosted in this separate file.

We consider an operation F : Ordinal š“¤ → Ordinal š“¤ together with
  - an ordinal Z : Ordinal š“¤ (for the zero case)
  - an operation S : Ordinal š“¤ → Ordinal š“¤ (for the successor case)
such that
  - F (β +ā‚’ šŸ™ā‚’) ļ¼ S (F β)         for all β : Ordinal š“¤,
  - F (sup L)   ļ¼ Z ∨ sup (F ∘ L) for all L : I → Ordinal š“¤ with I : š“¤.

Note that if we take L to be the empty family, then we get
F šŸ˜ā‚’ ļ¼ Z ∨ šŸ˜ā‚’ ļ¼ Z, which is why Z is the zero case.

Such an operation F is unique, because it must satisfy the recursive equation
  F β = Z ∨ sup (Ī» b → S (F (β ↓ b))),
since every ordinal is the supremum of the successors of its initial segments.

As mentioned, examples are addition, multiplication and exponentiation
by a fixed ordinal α. Specifically,
- for F := (-) +ā‚’ α, we take Z = α  and S β := β +ā‚’ šŸ™ā‚’;
- for F := (-) Ć—ā‚’ α, we take Z = šŸ˜ā‚’ and S β := β +ā‚’ α;
- for F := α ^ā‚’ (-), we take Z = šŸ™ā‚’ and S β := β Ć—ā‚’ α (given šŸ™ā‚’ ⊓ α).

In particular, these operations are uniquely specified.

\begin{code}

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

open import UF.Univalence
open import UF.PropTrunc
open import UF.Size

module Ordinals.OperationsByCases
       (ua : Univalence)
       (pt : propositional-truncations-exist)
       (sr : Set-Replacement pt)
       where

open import MLTT.Spartan hiding (J)
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.UA-FunExt

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

 fe' : Fun-Ext
 fe' {š“¤} {š“„} = fe š“¤ š“„

open import Ordinals.AdditionProperties ua
open import Ordinals.Arithmetic fe
open import Ordinals.Equivalence
open import Ordinals.OrdinalOfOrdinals ua
open import Ordinals.OrdinalOfOrdinalsSuprema ua
open import Ordinals.SupremaPreservation ua pt sr
open import Ordinals.Type
open import Ordinals.Underlying

open PropositionalTruncation pt
open suprema pt sr

\end{code}

We find it convenient to present Z ∨ sup (F ∘ L) via a single supremum.

\begin{code}

extended-sup : {I : š“¤ ̇ } (L : I → Ordinal š“¤) (Z : Ordinal š“¤) → Ordinal š“¤
extended-sup {š“¤} {I} L Z = sup {I = šŸ™ + I} (cases (Ī» (_ : šŸ™{š“¤}) → Z) L)

\end{code}

As shown below, Z and S determine F uniquely, because any F which
satisfies the above equations will be equal to the function G defined
by transfinite recursion as
  G β := Z ∨ sup (Ī» (b : ⟨ β ⟩) → S (G (β ↓ b))).
This map G is called canonical-spec-by-cases below.

\begin{code}

canonical-spec-by-cases : (S : Ordinal š“¤ → Ordinal š“¤) (Z : Ordinal š“¤)
                        → Ordinal š“¤ → Ordinal š“¤
canonical-spec-by-cases {š“¤} S Z =
 transfinite-recursion-on-OO (Ordinal š“¤)
                             (Ī» β ih → extended-sup (Ī» b → S (ih b)) Z)

module operation-by-cases-framework
        (F : Ordinal š“¤ → Ordinal š“¤)
        (S : Ordinal š“¤ → Ordinal š“¤)
        (Z : Ordinal š“¤)
        (F-succ : (β : Ordinal š“¤) → F (β +ā‚’ šŸ™ā‚’) ļ¼ S (F β))
        (F-sup : preserves-suprema-up-to-join F Z)
       where

 recursive-equation : (β : Ordinal š“¤)
                    → F β ļ¼ extended-sup (Ī» (b : ⟨ β ⟩) → S (F (β ↓ b))) Z
 recursive-equation β = F β                                        ļ¼āŸØ I ⟩
                        F (sup Ī» b → (β ↓ b) +ā‚’ šŸ™ā‚’)                ļ¼āŸØ II ⟩
                        extended-sup (F ∘ (Ī» b → (β ↓ b) +ā‚’ šŸ™ā‚’)) Z ļ¼āŸØ III ⟩
                        extended-sup (Ī» b → S (F (β ↓ b))) Z       āˆŽ
  where
   I   = ap F (supremum-of-successors-of-initial-segments pt sr β)
   II  = F-sup {⟨ β ⟩} (Ī» b → (β ↓ b) +ā‚’ šŸ™ā‚’)
   III = ap (Ī» - → extended-sup - Z) (dfunext fe' (Ī» b → F-succ (β ↓ b)))

 presentation-by-transfinite-recursion
  : (β : Ordinal š“¤) → F β ļ¼ canonical-spec-by-cases S Z β
 presentation-by-transfinite-recursion =
  transfinite-induction-on-OO (Ī» β → F β ļ¼ G β) I
   where
    G = canonical-spec-by-cases S Z

    I : (β : Ordinal š“¤) → ((b : ⟨ β ⟩) → F (β ↓ b) ļ¼ G (β ↓ b)) → F β ļ¼ G β
    I β ih = F β                                            ļ¼āŸØ I₁ ⟩
             extended-sup (Ī» (b : ⟨ β ⟩) → S (F (β ↓ b))) Z ļ¼āŸØ Iā‚‚ ⟩
             extended-sup (Ī» (b : ⟨ β ⟩) → S (G (β ↓ b))) Z ļ¼āŸØ Iā‚ƒ ⟩
             G β                                            āˆŽ
     where
      I₁ = recursive-equation β
      Iā‚‚ = ap (Ī» - → extended-sup - Z) (dfunext fe' (Ī» b → ap S (ih b)))
      Iā‚ƒ = (transfinite-recursion-on-OO-behaviour
             (Ordinal š“¤)
             (Ī» β ih → extended-sup (Ī» b → S (ih b)) Z) β) ⁻¹

uniquely-specified
 : (S : Ordinal š“¤ → Ordinal š“¤) (Z : Ordinal š“¤)
 → is-prop
    (Ī£ G źž‰ (Ordinal š“¤ → Ordinal š“¤) , ((β : Ordinal š“¤) → G (β +ā‚’ šŸ™ā‚’) ļ¼ S (G β))
                                   Ɨ preserves-suprema-up-to-join G Z)
uniquely-specified {š“¤} S Z (F , F-succ , F-sup) (G , G-succ , G-sup) =
 to-subtype-ļ¼
  (Ī» H → Ɨ-is-prop
          (Ī -is-prop fe' (Ī» β → the-type-of-ordinals-is-a-set (ua š“¤) fe'))
          (preserves-suprema-up-to-join-is-prop H Z))
  (dfunext fe' I)
   where
    I : F ∼ G
    I β = F β                           ļ¼āŸØ I₁  ⟩
          canonical-spec-by-cases S Z β ļ¼āŸØ Iā‚‚ ⁻¹ ⟩
          G β                           āˆŽ
     where
      open operation-by-cases-framework
      I₁ = presentation-by-transfinite-recursion F S Z F-succ F-sup β
      Iā‚‚ = presentation-by-transfinite-recursion G S Z G-succ G-sup β

\end{code}

In case we have a continuous function, we need not consider binary joins with
some ordinal Z since we can take Z ļ¼ šŸ˜ā‚’. The following code handles that
special case.

\begin{code}

module operation-by-cases-framework-continuous
        (F : Ordinal š“¤ → Ordinal š“¤)
        (S : Ordinal š“¤ → Ordinal š“¤)
        (F-succ : (β : Ordinal š“¤) → F (β +ā‚’ šŸ™ā‚’) ļ¼ S (F β))
        (F-cont : is-continuous F)
       where

 recursive-equation : (β : Ordinal š“¤)
                    → F β ļ¼ sup (Ī» (b : ⟨ β ⟩) → S (F (β ↓ b)))
 recursive-equation β = F β                             ļ¼āŸØ I ⟩
                        F (sup Ī» b → (β ↓ b) +ā‚’ šŸ™ā‚’)     ļ¼āŸØ II ⟩
                        sup (F ∘ (Ī» b → (β ↓ b) +ā‚’ šŸ™ā‚’)) ļ¼āŸØ III ⟩
                        sup (Ī» b → S (F (β ↓ b)))       āˆŽ
  where
   I   = ap F (supremum-of-successors-of-initial-segments pt sr β)
   II  = F-cont {⟨ β ⟩} (Ī» b → (β ↓ b) +ā‚’ šŸ™ā‚’)
   III = ap sup (dfunext fe' (Ī» b → F-succ (β ↓ b)))

uniquely-specified'
 : (S : Ordinal š“¤ → Ordinal š“¤)
 → is-prop
    (Ī£ G źž‰ (Ordinal š“¤ → Ordinal š“¤) , ((β : Ordinal š“¤) → G (β +ā‚’ šŸ™ā‚’) ļ¼ S (G β))
                                   Ɨ is-continuous G)
uniquely-specified' {š“¤} S =
 equiv-to-prop (Ī£-cong (Ī» G → Ɨ-cong (ā‰ƒ-refl _) (I G))) (uniquely-specified S šŸ˜ā‚’)
  where
   I : (G : Ordinal š“¤ → Ordinal š“¤)
     → is-continuous G ā‰ƒ preserves-suprema-up-to-join G šŸ˜ā‚’
   I G = logically-equivalent-props-are-equivalent
          (being-continuous-is-prop G)
          (preserves-suprema-up-to-join-is-prop G šŸ˜ā‚’)
          (rl-implication (preservation-of-suprema-continuity-equivalence G))
          (lr-implication (preservation-of-suprema-continuity-equivalence G))

\end{code}

We now instantiate the above with addition.
This used to be part of AdditionProperties (since 22 July 2025).

\begin{code}

module addition-by-fixed-ordinal
        (α : Ordinal š“¤)
       where

 succ-equation : (Ordinal š“¤ → Ordinal š“¤) → š“¤ ⁺ ̇
 succ-equation Ī±āŠ•_ =
  (β : Ordinal š“¤) → Ī±āŠ• (β +ā‚’ šŸ™ā‚’) ļ¼ (Ī±āŠ• β) +ā‚’ šŸ™ā‚’

 +ā‚’-preserves-suprema-up-to-join : preserves-suprema-up-to-join (α +ā‚’_) α
 +ā‚’-preserves-suprema-up-to-join =
  preserves-suprema-up-to-join-criterion (α +ā‚’_) α
   (+ā‚’-preserves-inhabited-suprema pt sr α , šŸ˜ā‚’-right-neutral α)

 +ā‚’-is-uniquely-specified'
  : ∃! Ī±āŠ•_ źž‰ (Ordinal š“¤ → Ordinal š“¤) ,
     (succ-equation Ī±āŠ•_) Ɨ (preserves-suprema-up-to-join Ī±āŠ•_ α)
 +ā‚’-is-uniquely-specified' =
  pointed-props-are-singletons
   (α +ā‚’_ ,
    +ā‚’-commutes-with-successor α ,
    (Ī» {I} → +ā‚’-preserves-suprema-up-to-join))
   (uniquely-specified (_+ā‚’ šŸ™ā‚’) α)

module addition where
 private

  successor-equation : (Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤) → š“¤ ⁺ ̇
  successor-equation {š“¤} _āŠ•_ =
   (α : Ordinal š“¤) → succ-equation α (α āŠ•_)
    where
     open addition-by-fixed-ordinal

  suprema-equation : (Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤) → š“¤ ⁺ ̇
  suprema-equation {š“¤} _āŠ•_ =
   (α : Ordinal š“¤) → preserves-suprema-up-to-join (α āŠ•_) α

 +ā‚’-is-uniquely-specified
  : ∃! _āŠ•_ źž‰ (Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤) ,
     (successor-equation _āŠ•_) Ɨ (suprema-equation _āŠ•_)
 +ā‚’-is-uniquely-specified {š“¤} =
  equiv-to-singleton e (Ī -is-singleton fe' +ā‚’-is-uniquely-specified')
   where
    open addition-by-fixed-ordinal
    bin-op = Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤
    un-op = Ordinal š“¤ → Ordinal š“¤
    e =
     (Ī£ F źž‰ bin-op , (successor-equation F) Ɨ (suprema-equation F)) ā‰ƒāŸØ I ⟩
     (Ī£ F źž‰ bin-op ,
       ((α : Ordinal š“¤) → succ-equation α (F α)
                        Ɨ preserves-suprema-up-to-join (F α) α))    ā‰ƒāŸØ II ⟩
     (Ī  α źž‰ Ordinal š“¤ ,
       Ī£ G źž‰ un-op , succ-equation α G
                        Ɨ preserves-suprema-up-to-join G α)         ā– 
       where
        I  = Ī£-cong (Ī» F → ā‰ƒ-sym Ī Ć—-distr)
        II = ā‰ƒ-sym ΠΣ-distr-ā‰ƒ

 +ā‚’-recursive-equation : (α β : Ordinal š“¤)
                       → α +ā‚’ β ļ¼ extended-sup (Ī» b → α +ā‚’ (β ↓ b) +ā‚’ šŸ™ā‚’) α
 +ā‚’-recursive-equation α = recursive-equation
  where
   open addition-by-fixed-ordinal
   open operation-by-cases-framework (α +ā‚’_) (_+ā‚’ šŸ™ā‚’) α
         (+ā‚’-commutes-with-successor α)
         (+ā‚’-preserves-suprema-up-to-join α)

\end{code}

We now instantiate the above with multiplication.
This used to be part of MultiplicationProperties (since 11 September 2024,
following a question by Martin Escardo).

\begin{code}

open import Ordinals.MultiplicationProperties ua

module multiplication-by-fixed-ordinal
        (α : Ordinal š“¤)
       where

 succ-equation : (Ordinal š“¤ → Ordinal š“¤) → š“¤ ⁺ ̇
 succ-equation Ī±āŠ—_ =
  (β : Ordinal š“¤) → Ī±āŠ— (β +ā‚’ šŸ™ā‚’) ļ¼ (Ī±āŠ— β) +ā‚’ α

 Ć—ā‚’-is-uniquely-specified'
  : ∃! Ī±āŠ—_ źž‰ (Ordinal š“¤ → Ordinal š“¤) , (succ-equation Ī±āŠ—_) Ɨ (is-continuous Ī±āŠ—_)
 Ć—ā‚’-is-uniquely-specified' =
  pointed-props-are-singletons
   (α Ć—ā‚’_ , Ć—ā‚’-successor α , (Ī» {I} → Ć—ā‚’-is-continuous pt sr α))
   (uniquely-specified' (_+ā‚’ α))

module multiplication where
 private

  successor-equation : (Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤) → š“¤ ⁺ ̇
  successor-equation {š“¤} _āŠ—_ =
   (α : Ordinal š“¤) → succ-equation α (α āŠ—_)
    where
     open multiplication-by-fixed-ordinal

  suprema-equation : (Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤) → š“¤ ⁺ ̇
  suprema-equation {š“¤} _āŠ—_ = (α : Ordinal š“¤) → is-continuous (α āŠ—_)

 Ć—ā‚’-is-uniquely-specified
  : ∃! _āŠ—_ źž‰ (Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤) ,
     (successor-equation _āŠ—_) Ɨ (suprema-equation _āŠ—_)
 Ć—ā‚’-is-uniquely-specified {š“¤} =
  equiv-to-singleton e (Ī -is-singleton fe' Ć—ā‚’-is-uniquely-specified')
   where
    open multiplication-by-fixed-ordinal
    bin-op = Ordinal š“¤ → Ordinal š“¤ → Ordinal š“¤
    un-op = Ordinal š“¤ → Ordinal š“¤
    e =
     (Ī£ F źž‰ bin-op , successor-equation F Ɨ suprema-equation F)         ā‰ƒāŸØ I ⟩
     (Ī£ F źž‰ bin-op ,
       ((α : Ordinal š“¤) → succ-equation α (F α) Ɨ is-continuous (F α))) ā‰ƒāŸØ II ⟩
     (Ī  α źž‰ Ordinal š“¤ , Ī£ G źž‰ un-op , succ-equation α G
                                    Ɨ is-continuous G)                  ā– 
       where
        I  = Ī£-cong Ī» F → ā‰ƒ-sym Ī Ć—-distr
        II = ā‰ƒ-sym ΠΣ-distr-ā‰ƒ

 Ć—ā‚’-recursive-equation : (α β : Ordinal š“¤)
                       → α Ć—ā‚’ β ļ¼ sup (Ī» b → α Ć—ā‚’ (β ↓ b) +ā‚’ α)
 Ć—ā‚’-recursive-equation α = recursive-equation
  where
   open operation-by-cases-framework-continuous (α Ć—ā‚’_) (_+ā‚’ α)
         (Ć—ā‚’-successor α)
         (Ć—ā‚’-is-continuous pt sr α)

\end{code}

Finally, we apply the above to exponentiation by a fixed (positive) ordinal.
This replaces a previous development as part of the file
Exponentiation.Specification.

\begin{code}

open import Ordinals.Exponentiation.Specification ua pt sr
open import Ordinals.Exponentiation.Supremum ua pt sr

exponentiation-is-uniquely-specified
 : (α : Ordinal š“¤)
 → is-prop
    (Ī£ exp źž‰ (Ordinal š“¤ → Ordinal š“¤) ,
        (exp-specification-succ α exp)
      Ɨ (exp-specification-zero-sup-combined α exp))
exponentiation-is-uniquely-specified α =
 uniquely-specified (_Ć—ā‚’ α) šŸ™ā‚’

^ā‚’-is-uniquely-specified
 : (α : Ordinal š“¤) → šŸ™ā‚’ ⊓ α
 → ∃! exp źž‰ (Ordinal š“¤ → Ordinal š“¤) ,
      (exp-specification-succ α exp)
    Ɨ (exp-specification-zero-sup-combined α exp)
^ā‚’-is-uniquely-specified α α-nonzero =
 pointed-props-are-singletons
  (α ^ā‚’_ ,
   ^ā‚’-satisfies-succ-specification α α-nonzero ,
   (Ī» {I} → ^ā‚’-satisfies-zero-sup-combined-specification α))
  (exponentiation-is-uniquely-specified α)

\end{code}