We prove several properties of ordinal multiplication, including that it
preserves suprema of ordinals and that it enjoys a left-cancellation property.

\begin{code}

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

open import UF.Univalence

module Ordinals.MultiplicationProperties
       (ua : Univalence)
       where

open import UF.Base
open import UF.Equiv
open import UF.FunExt
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.UA-FunExt
open import UF.ClassicalLogic

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

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

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

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.AdditionProperties ua

×ₒ-𝟘ₒ-right : (α : Ordinal 𝓤)  α ×ₒ 𝟘ₒ {𝓥}  𝟘ₒ
×ₒ-𝟘ₒ-right α = ⊴-antisym _ _
                 (to-⊴ (α ×ₒ 𝟘ₒ) 𝟘ₒ  (a , b)  𝟘-elim b))
                 (𝟘ₒ-least-⊴ (α ×ₒ 𝟘ₒ))

×ₒ-𝟘ₒ-left : (α : Ordinal 𝓤)  𝟘ₒ {𝓥} ×ₒ α  𝟘ₒ
×ₒ-𝟘ₒ-left α = ⊴-antisym _ _
                (to-⊴ (𝟘ₒ ×ₒ α) 𝟘ₒ  (b , a)  𝟘-elim b))
                (𝟘ₒ-least-⊴ (𝟘ₒ ×ₒ α))

𝟙ₒ-left-neutral-×ₒ : (α : Ordinal 𝓤)  𝟙ₒ {𝓤} ×ₒ α  α
𝟙ₒ-left-neutral-×ₒ {𝓤} α = eqtoidₒ (ua _) fe' _ _
                            (f , f-order-preserving ,
                             f-is-equiv , g-order-preserving)
 where
  f : 𝟙 ×  α    α 
  f = pr₂

  g :  α   𝟙 ×  α 
  g = (  ,_)

  f-order-preserving : is-order-preserving (𝟙ₒ {𝓤} ×ₒ α) α f
  f-order-preserving x y (inl p) = p

  f-is-equiv : is-equiv f
  f-is-equiv = qinvs-are-equivs f (g ,  _  refl) ,  _  refl))

  g-order-preserving : is-order-preserving α (𝟙ₒ {𝓤} ×ₒ α) g
  g-order-preserving x y p = inl p

𝟙ₒ-right-neutral-×ₒ : (α : Ordinal 𝓤)  α ×ₒ 𝟙ₒ {𝓤}  α
𝟙ₒ-right-neutral-×ₒ {𝓤} α = eqtoidₒ (ua _) fe' _ _
                             (f , f-order-preserving ,
                              f-is-equiv , g-order-preserving)
 where
  f :  α  × 𝟙   α 
  f = pr₁

  g :  α    α  × 𝟙
  g = (_,  )

  f-order-preserving : is-order-preserving (α ×ₒ 𝟙ₒ {𝓤}) α f
  f-order-preserving x y (inr (refl , p)) = p

  f-is-equiv : is-equiv f
  f-is-equiv = qinvs-are-equivs f (g ,  _  refl) ,  _  refl))

  g-order-preserving : is-order-preserving α (α ×ₒ 𝟙ₒ {𝓤}) g
  g-order-preserving x y p = inr (refl , p)

\end{code}

Because we use --lossy-unification to speed up typechecking we have to
explicitly mention the universes in the lemma below; using them as variables (as
usual) results in a unification error.

\begin{code}

×ₒ-assoc : {𝓤 𝓥 𝓦 : Universe}
           (α : Ordinal 𝓤) (β : Ordinal 𝓥) (γ : Ordinal 𝓦)
          (α ×ₒ β) ×ₒ γ  α ×ₒ (β ×ₒ γ)
×ₒ-assoc α β γ =
 eqtoidₒ (ua _) fe' ((α  ×ₒ β) ×ₒ γ) (α  ×ₒ (β ×ₒ γ))
  (f , order-preserving-reflecting-equivs-are-order-equivs
   ((α  ×ₒ β) ×ₒ γ) (α  ×ₒ (β ×ₒ γ))
   f f-equiv f-preserves-order f-reflects-order)
  where
   f :  (α ×ₒ β) ×ₒ γ    α ×ₒ (β ×ₒ γ) 
   f ((a , b) , c) = (a , (b , c))

   g :  α ×ₒ (β ×ₒ γ)    (α ×ₒ β) ×ₒ γ 
   g (a , (b , c)) = ((a , b) , c)

   f-equiv : is-equiv f
   f-equiv = qinvs-are-equivs f (g ,  x  refl) ,  x  refl))

   f-preserves-order : is-order-preserving  ((α  ×ₒ β) ×ₒ γ) (α  ×ₒ (β ×ₒ γ)) f
   f-preserves-order _ _ (inl p) = inl (inl p)
   f-preserves-order _ _ (inr (r , inl p)) = inl (inr (r , p))
   f-preserves-order _ _ (inr (r , inr (u , q))) = inr (to-×-= u r , q)

   f-reflects-order : is-order-reflecting ((α  ×ₒ β) ×ₒ γ) (α  ×ₒ (β ×ₒ γ)) f
   f-reflects-order _ _ (inl (inl p)) = inl p
   f-reflects-order _ _ (inl (inr (r , q))) = inr (r , (inl q))
   f-reflects-order _ _ (inr (refl , q)) = inr (refl , (inr (refl , q)))

\end{code}

The lemma below is as general as possible in terms of universe parameters
because addition requires its arguments to come from the same universe, at least
at present.

\begin{code}

×ₒ-distributes-+ₒ-right : (α : Ordinal 𝓤) (β γ : Ordinal 𝓥)
                         α ×ₒ (β +ₒ γ)  (α ×ₒ β) +ₒ (α ×ₒ γ)
×ₒ-distributes-+ₒ-right α β γ = eqtoidₒ (ua _) fe' _ _
                                 (f , f-order-preserving ,
                                  f-is-equiv , g-order-preserving)
 where
  f :  α ×ₒ (β +ₒ γ)    (α ×ₒ β) +ₒ (α ×ₒ γ) 
  f (a , inl b) = inl (a , b)
  f (a , inr c) = inr (a , c)

  g :  (α ×ₒ β) +ₒ (α ×ₒ γ)    α ×ₒ (β +ₒ γ) 
  g (inl (a , b)) = a , inl b
  g (inr (a , c)) = a , inr c

  f-order-preserving : is-order-preserving _ _ f
  f-order-preserving (a , inl b) (a' , inl b') (inl p) = inl p
  f-order-preserving (a , inl b) (a' , inr c') (inl p) = 
  f-order-preserving (a , inr c) (a' , inr c') (inl p) = inl p
  f-order-preserving (a , inl b) (a' , inl .b) (inr (refl , q)) = inr (refl , q)
  f-order-preserving (a , inr c) (a' , inr .c) (inr (refl , q)) = inr (refl , q)

  f-is-equiv : is-equiv f
  f-is-equiv = qinvs-are-equivs f (g , η , ε)
   where
    η : g  f  id
    η (a , inl b) = refl
    η (a , inr c) = refl

    ε : f  g  id
    ε (inl (a , b)) = refl
    ε (inr (a , c)) = refl

  g-order-preserving : is-order-preserving _ _ g
  g-order-preserving (inl (a , b)) (inl (a' , b')) (inl p) = inl p
  g-order-preserving (inl (a , b)) (inl (a' , .b)) (inr (refl , q)) =
   inr (refl , q)
  g-order-preserving (inl (a , b)) (inr (a' , c')) p = inl 
  g-order-preserving (inr (a , c)) (inr (a' , c')) (inl p) = inl p
  g-order-preserving (inr (a , c)) (inr (a' , c')) (inr (refl , q)) =
   inr (refl , q)

\end{code}

The following characterizes the initial segments of a product and is rather
useful when working with simulations between products.

\begin{code}

×ₒ-↓ : (α β : Ordinal 𝓤)
      {a :  α } {b :  β }
      (α ×ₒ β)  (a , b)  (α ×ₒ (β  b)) +ₒ (α  a)
×ₒ-↓ α β {a} {b} = eqtoidₒ (ua _) fe' _ _ (f , f-order-preserving ,
                                           f-is-equiv , g-order-preserving)
 where
  f :  (α ×ₒ β)  (a , b)    (α ×ₒ (β  b)) +ₒ (α  a) 
  f ((x , y) , inl p) = inl (x , (y , p))
  f ((x , y) , inr (r , q)) = inr (x , q)

  g :  (α ×ₒ (β  b)) +ₒ (α  a)    (α ×ₒ β)  (a , b) 
  g (inl (x , y , p)) = (x , y) , inl p
  g (inr (x , q)) = (x , b) , inr (refl , q)

  f-order-preserving : is-order-preserving _ _ f
  f-order-preserving ((x , y) , inl p) ((x' , y') , inl p') (inl l) = inl l
  f-order-preserving ((x , y) , inl p) ((x' , _)  , inl p') (inr (refl , l)) =
   inr ((ap (y ,_) (Prop-valuedness β _ _ p p')) , l)
  f-order-preserving ((x , y) , inl p) ((x' , y') , inr (r' , q')) l = 
  f-order-preserving ((x , y) , inr (refl , q)) ((x' , y') , inl p') (inl l) =
   𝟘-elim (irrefl β y (Transitivity β _ _ _ l p'))
  f-order-preserving ((x , y) , inr (refl , q))
                     ((x' , _)  , inl p') (inr (refl , l)) = 𝟘-elim
                                                              (irrefl β y p')
  f-order-preserving ((x , y) , inr (refl , q))
                     ((x' , _)  , inr (refl , q')) (inl l) = 𝟘-elim
                                                              (irrefl β y l)
  f-order-preserving ((x , y) , inr (refl , q))
                     ((x' , _)  , inr (refl , q')) (inr (_ , l)) = l

  f-is-equiv : is-equiv f
  f-is-equiv = qinvs-are-equivs f (g , η , ε)
   where
    η : g  f  id
    η ((x , y) , inl p) = refl
    η ((x , y) , inr (refl , q)) = refl

    ε : f  g  id
    ε (inl (x , y)) = refl
    ε (inr x) = refl

  g-order-preserving : is-order-preserving _ _ g
  g-order-preserving (inl (x , y , p)) (inl (x' , y' , p')) (inl l) = inl l
  g-order-preserving (inl (x , y , p)) (inl (x' , y' , p')) (inr (refl , l)) =
   inr (refl , l)
  g-order-preserving (inl (x , y , p)) (inr (x' , q')) _ = inl p
  g-order-preserving (inr (x , q))     (inr (x' , q')) l = inr (refl , l)

\end{code}

We now prove several useful facts about (bounded) simulations between products.

\begin{code}

×ₒ-increasing-on-right : (α β γ : Ordinal 𝓤)
                        𝟘ₒ  α
                        β  γ
                        (α ×ₒ β)  (α ×ₒ γ)
×ₒ-increasing-on-right α β γ (a , p) (c , q) = (a , c) , I
 where
  I = α ×ₒ β                    =⟨ 𝟘ₒ-right-neutral (α ×ₒ β) ⁻¹ 
      (α ×ₒ β) +ₒ 𝟘ₒ            =⟨ ap₂  -₁ -₂  (α ×ₒ -₁) +ₒ -₂) q p 
      (α ×ₒ (γ  c)) +ₒ (α  a) =⟨ ×ₒ-↓ α γ ⁻¹ 
      (α ×ₒ γ)  (a , c)        

×ₒ-right-monotone-⊴ : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (γ : Ordinal 𝓦)
                     β  γ
                     (α ×ₒ β)  (α ×ₒ γ)
×ₒ-right-monotone-⊴ α β γ (g , sim-g) = f , f-initial-segment ,
                                            f-order-preserving
 where
   f :  α ×ₒ β    α ×ₒ γ 
   f (a , b) = a , g b

   f-initial-segment : is-initial-segment (α ×ₒ β) (α ×ₒ γ) f
   f-initial-segment (a , b) (a' , c') (inl l) = (a' , b') , inl k , ap (a' ,_) q
    where
     I : Σ b'   β  , b' ≺⟨ β  b × (g b'  c')
     I = simulations-are-initial-segments β γ g sim-g b c' l
     b' = pr₁ I
     k = pr₁ (pr₂ I)
     q = pr₂ (pr₂ I)
   f-initial-segment (a , b) (a' , c') (inr (refl , q)) =
    (a' , b) , inr (refl , q) , refl

   f-order-preserving : is-order-preserving (α ×ₒ β) (α ×ₒ γ) f
   f-order-preserving (a , b) (a' , b') (inl p) =
    inl (simulations-are-order-preserving β γ g sim-g b b' p)
   f-order-preserving (a , b) (a' , b') (inr (refl , q)) = inr (refl , q)

×ₒ-≼-left : (α : Ordinal 𝓤) (β : Ordinal 𝓥)
            {a a' :  α } {b :  β }
           a ≼⟨ α  a'
           (a , b) ≼⟨ α ×ₒ β  (a' , b)
×ₒ-≼-left α β p (a₀ , b₀) (inl r) = inl r
×ₒ-≼-left α β p (a₀ , b₀) (inr (eq , r)) = inr (eq , p a₀ r)

\end{code}

Multiplication satisfies the expected recursive equations (which
classically define ordinal multiplication): zero is fixed by multiplication
(this is ×ₒ-𝟘ₒ-right above), multiplication for successors is repeated addition
and multiplication preserves suprema.

\begin{code}

×ₒ-successor : (α β : Ordinal 𝓤)  α ×ₒ (β +ₒ 𝟙ₒ)  (α ×ₒ β) +ₒ α
×ₒ-successor α β =
  α ×ₒ (β +ₒ 𝟙ₒ)          =⟨ ×ₒ-distributes-+ₒ-right α β 𝟙ₒ 
  ((α ×ₒ β) +ₒ (α ×ₒ 𝟙ₒ)) =⟨ ap ((α ×ₒ β) +ₒ_) (𝟙ₒ-right-neutral-×ₒ α)  
  (α ×ₒ β) +ₒ α           

open import UF.PropTrunc
open import UF.Size

module _ (pt : propositional-truncations-exist)
         (sr : Set-Replacement pt)
       where

 open import Ordinals.OrdinalOfOrdinalsSuprema ua
 open suprema pt sr
 open PropositionalTruncation pt

 ×ₒ-preserves-suprema : (α : Ordinal 𝓤) {I : 𝓤 ̇ } (β : I  Ordinal 𝓤)
                       α ×ₒ sup β  sup  i  α ×ₒ β i)
 ×ₒ-preserves-suprema {𝓤} α {I} β = ⊴-antisym (α ×ₒ sup β) (sup  i  α ×ₒ β i)) ⦅1⦆ ⦅2⦆
  where
   ⦅2⦆ : sup  i  α ×ₒ β i)  (α ×ₒ sup β)
   ⦅2⦆ = sup-is-lower-bound-of-upper-bounds  i  α ×ₒ β i) (α ×ₒ sup β)
           i  ×ₒ-right-monotone-⊴ α (β i) (sup β) (sup-is-upper-bound β i))

   ⦅1⦆ : (α ×ₒ sup β)  sup  i  α ×ₒ β i)
   ⦅1⦆ = ≼-gives-⊴ (α ×ₒ sup β) (sup  i  α ×ₒ β i)) ⦅1⦆-I
    where
     ⦅1⦆-I : (γ : Ordinal 𝓤)  γ  (α ×ₒ sup β)  γ  sup  i  α ×ₒ β i)
     ⦅1⦆-I _ ((a , y) , refl) = ⦅1⦆-III
      where
       ⦅1⦆-II : (Σ i  I , Σ b   β i  , sup β  y  (β i)  b)
               ((α ×ₒ sup β)  (a , y))  sup  j  α ×ₒ β j)
       ⦅1⦆-II (i , b , e) = σ (a , b) , eq
        where
         σ :  α ×ₒ β i    sup  j  α ×ₒ β j) 
         σ = [ α ×ₒ β i , sup  j  α ×ₒ β j) ]⟨ sup-is-upper-bound _ i 

         eq = (α ×ₒ sup β)  (a , y)           =⟨ ×ₒ-↓ α (sup β) 
              (α ×ₒ (sup β  y)) +ₒ (α  a)    =⟨ eq₁ 
              (α ×ₒ (β i  b)) +ₒ (α  a)      =⟨ ×ₒ-↓ α (β i) ⁻¹ 
              (α ×ₒ β i)  (a , b)             =⟨ eq₂ 
              sup  j  α ×ₒ β j)  σ (a , b) 
          where
           eq₁ = ap  -  ((α ×ₒ -) +ₒ (α  a))) e
           eq₂ = (initial-segment-of-sup-at-component
                   j  α ×ₒ β j) i (a , b)) ⁻¹

       ⦅1⦆-III : ((α ×ₒ sup β)  (a , y))  sup  i  α ×ₒ β i)
       ⦅1⦆-III = ∥∥-rec (⊲-is-prop-valued _ _) ⦅1⦆-II
                  (initial-segment-of-sup-is-initial-segment-of-some-component
                    β y)

\end{code}

The equations for successor and suprema uniquely specify the multiplication
operation even though they are not constructively sufficient to define it.

\begin{code}

 private
  successor-equation : (Ordinal 𝓤  Ordinal 𝓤  Ordinal 𝓤)  𝓤  ̇
  successor-equation {𝓤} _⊗_ =
   (α β : Ordinal 𝓤)  α  (β +ₒ 𝟙ₒ)  (α  β) +ₒ α

  suprema-equation : (Ordinal 𝓤  Ordinal 𝓤  Ordinal 𝓤)  𝓤  ̇
  suprema-equation {𝓤} _⊗_ =
   (α : Ordinal 𝓤) (I : 𝓤 ̇  ) (β : I  Ordinal 𝓤)
     α  (sup β)  sup  i  α  β i)

  recursive-equation : (Ordinal 𝓤  Ordinal 𝓤  Ordinal 𝓤)  𝓤  ̇
  recursive-equation {𝓤} _⊗_ =
   (α β : Ordinal 𝓤)  α  β  sup  b  (α  (β  b)) +ₒ α)

  successor-and-suprema-equations-give-recursive-equation
   : (_⊗_ : Ordinal 𝓤  Ordinal 𝓤  Ordinal 𝓤)
    successor-equation _⊗_
    suprema-equation _⊗_
    recursive-equation _⊗_
  successor-and-suprema-equations-give-recursive-equation
   _⊗_ ⊗-succ ⊗-sup α β = α  β                           =⟨ I   
                          (α  sup  b  (β  b) +ₒ 𝟙ₒ)) =⟨ II  
                          sup  b  α  ((β  b) +ₒ 𝟙ₒ)) =⟨ III 
                          sup  b  (α  (β  b)) +ₒ α)  
    where
     I   = ap (α ⊗_) (supremum-of-successors-of-initial-segments pt sr β)
     II  = ⊗-sup α  β   b  (β  b) +ₒ 𝟙ₒ)
     III = ap sup (dfunext fe'  b  ⊗-succ α (β  b)))

 ×ₒ-recursive-equation : recursive-equation {𝓤} _×ₒ_
 ×ₒ-recursive-equation =
  successor-and-suprema-equations-give-recursive-equation
    _×ₒ_ ×ₒ-successor  α _ β  ×ₒ-preserves-suprema α β)

 ×ₒ-is-uniquely-specified'
  : (_⊗_ : Ordinal 𝓤  Ordinal 𝓤  Ordinal 𝓤)
   recursive-equation _⊗_
   (α β : Ordinal 𝓤)  α  β  α ×ₒ β
 ×ₒ-is-uniquely-specified' {𝓤} _⊗_ ⊗-rec α =
  transfinite-induction-on-OO  -  (α  -)  (α ×ₒ -)) I
   where
    I : (β : Ordinal 𝓤)
       ((b :  β )  (α  (β  b))  (α ×ₒ (β  b)))
       (α  β)  (α ×ₒ β)
    I β IH = α  β                            =⟨ II  
             sup  b  (α  (β  b)) +ₒ α)   =⟨ III 
             sup  b  (α ×ₒ (β  b)) +ₒ α)  =⟨ IV  
             α ×ₒ β                           
     where
      II  = ⊗-rec α β
      III = ap sup (dfunext fe'  b  ap (_+ₒ α) (IH b)))
      IV  = ×ₒ-recursive-equation α β ⁻¹

 ×ₒ-is-uniquely-specified
  : ∃! _⊗_  (Ordinal 𝓤  Ordinal 𝓤  Ordinal 𝓤) ,
     (successor-equation _⊗_) × (suprema-equation _⊗_)
 ×ₒ-is-uniquely-specified {𝓤} =
  (_×ₒ_ , (×ₒ-successor ,  α _ β  ×ₒ-preserves-suprema α β))) ,
   (_⊗_ , ⊗-succ , ⊗-sup) 
   to-subtype-=
     F  ×-is-prop (Π₂-is-prop fe'
                        _ _  underlying-type-is-set fe (OO 𝓤)))
                     (Π₃-is-prop fe'
                        _ _ _  underlying-type-is-set fe (OO 𝓤))))
    (dfunext fe'
       α  dfunext fe'
        β 
        (×ₒ-is-uniquely-specified' _⊗_
          (successor-and-suprema-equations-give-recursive-equation
            _⊗_ ⊗-succ ⊗-sup)
        α β) ⁻¹))))

\end{code}

The above should be contrasted to the situation for addition where we do not
know how to prove such a result since only *inhabited* suprema are preserved by
addition.

Multiplication being monotone in the left argument is a constructive taboo.

Addition 22 November 2024: monotonicity in the left argument is
equivalent to Excluded Middle.

\begin{code}

×ₒ-minimal : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (a₀ :  α ) (b₀ :  β )
            is-least α a₀  is-least β b₀  is-minimal (α ×ₒ β) (a₀ , b₀)
×ₒ-minimal α β a₀ b₀ a₀-least b₀-least (a , b) (inl l)
 = irrefl β b (b₀-least b b l)
×ₒ-minimal α β a₀ b₀ a₀-least b₀-least (a , b) (inr (refl , l))
 = irrefl α a (a₀-least a a l)

×ₒ-least : (α : Ordinal 𝓤) (β : Ordinal 𝓥) (a₀ :  α ) (b₀ :  β )
          is-least α a₀  is-least β b₀  is-least (α ×ₒ β) (a₀ , b₀)
×ₒ-least α β  a₀ b₀ a₀-least b₀-least =
 minimal-is-least (α ×ₒ β) (a₀ , b₀) (×ₒ-minimal α β a₀ b₀ a₀-least b₀-least)

×ₒ-left-monotonicity-implies-EM
  : ((α β : Ordinal 𝓤) (γ : Ordinal 𝓥)  α  β  α ×ₒ γ  β ×ₒ γ)
   EM 𝓤
×ₒ-left-monotonicity-implies-EM hyp P isprop-P = III (f ( , inr )) refl
 where
  α = 𝟙ₒ
  Pₒ = prop-ordinal P isprop-P
  β = 𝟙ₒ +ₒ Pₒ
  γ = 𝟚ₒ

  I : α  β
  I = ≼-gives-⊴ α β
       (transport
         (_≼ β)
         (𝟘ₒ-right-neutral 𝟙ₒ)
         (+ₒ-right-monotone 𝟙ₒ 𝟘ₒ Pₒ
         (𝟘ₒ-least Pₒ)))

  II : (α ×ₒ γ)  (β ×ₒ γ)
  II = hyp α β γ I

  f = pr₁ II
  f-sim = pr₂ II

  f-preserves-least : f ( , inl )  (inl  , inl )
  f-preserves-least = simulations-preserve-least (α ×ₒ γ) (β ×ₒ γ)
                        ( , inl )
                        (inl  , inl )
                        f f-sim
                        (×ₒ-least α γ  (inl )
                          ⋆-least
                          (left-preserves-least 𝟙ₒ 𝟙ₒ  ⋆-least))
                        (×ₒ-least β γ (inl ) (inl )
                         (left-preserves-least 𝟙ₒ Pₒ  ⋆-least)
                         (left-preserves-least 𝟙ₒ 𝟙ₒ  ⋆-least))
   where
    ⋆-least : is-least (𝟙ₒ {𝓤}) 
    ⋆-least   = 𝟘-elim

  III : (x :  β ×ₒ γ )  f ( , inr )  x  P + ¬ P
  III (inl  , inl ) r = 𝟘-elim (+disjoint' III₂)
   where
    III₁ = f ( , inr )   =⟨ r 
           (inl  , inl ) =⟨ f-preserves-least ⁻¹ 
           f ( , inl )   
    III₂ : inr   inl 
    III₂ = ap pr₂ (simulations-are-lc _ _ f f-sim III₁)

  III (inl  , inr ) r = inr  p  𝟘-elim (+disjoint (III₆ p)))
   where
    III₃ : (p : P)
          Σ x   𝟙ₒ ×ₒ 𝟚ₒ  ,
             (x ≺⟨ 𝟙ₒ ×ₒ 𝟚ₒ  ( , inr )) × (f x  (inr p , inl ))
    III₃ p = simulations-are-initial-segments (α ×ₒ γ) (β ×ₒ γ) f f-sim
               ( , inr ) (inr p , inl )
               (transport⁻¹  -  (inr p , inl ) ≺⟨ β ×ₒ γ  - ) r (inl ))
    III₄ : (p : P)
          Σ x   𝟙ₒ ×ₒ 𝟚ₒ  ,
             (x ≺⟨ 𝟙ₒ ×ₒ 𝟚ₒ  ( , inr )) × (f x  (inr p , inl ))
          f ( , inl )  (inr p , inl )
    III₄ p (( , inl ) , l , q) = q
    III₄ p (( , inr ) , l , q) = 𝟘-elim (irrefl (𝟙ₒ ×ₒ 𝟚ₒ) ( , inr ) l)

    III₅ : (p : P)  (inl  , inl )  (inr p , inl )
    III₅ p = (inl  , inl ) =⟨ f-preserves-least ⁻¹ 
             f ( , inl )   =⟨ III₄ p (III₃ p) 
             (inr p , inl ) 

    III₆ : (p : P)  inl   inr p
    III₆ p = ap pr₁ (III₅ p)

  III (inr p , c) r = inl p

EM-implies-×ₒ-left-monotonicity
 : EM (𝓤  𝓥)
  (α β : Ordinal 𝓤) (γ : Ordinal 𝓥)  α  β  (α ×ₒ γ)  (β ×ₒ γ)
EM-implies-×ₒ-left-monotonicity em α β γ (g , g-sim)
 = ≼-gives-⊴ (α ×ₒ γ) (β ×ₒ γ)
             (EM-implies-order-preserving-gives-≼ em (α ×ₒ γ)
                                                     (β ×ₒ γ)
                                                     (f , f-order-preserving))
  where
   f :   α ×ₒ γ    β ×ₒ γ 
   f (a , c) = (g a , c)

   f-order-preserving : is-order-preserving (α ×ₒ γ) (β ×ₒ γ) f
   f-order-preserving (a , c) (a' , c') (inl l) = inl l
   f-order-preserving (a , c) (a' , c) (inr (refl , l))
    = inr (refl , simulations-are-order-preserving α β g g-sim a a' l)

EM-implies-induced-⊴-on-×ₒ : EM 𝓤
                            (α β γ δ : Ordinal 𝓤)
                            α  γ  β  δ  (α ×ₒ β)  (γ ×ₒ δ)
EM-implies-induced-⊴-on-×ₒ em α β γ δ 𝕗 𝕘 =
 ⊴-trans (α ×ₒ β) (α ×ₒ δ) (γ ×ₒ δ)
         (×ₒ-right-monotone-⊴ α β δ 𝕘)
         (EM-implies-×ₒ-left-monotonicity em α γ δ 𝕗)

\end{code}

To prove that multiplication is left cancellable, we require the following
technical lemma: if α > 𝟘, then every simulation from α ×ₒ β to α ×ₒ γ + α ↓ a₁
firstly never hits the second summand, and secondly, in the first component, it
decomposes as the identity on the first component and a function β → γ on the
second component, viz. one that is independent of the first component. The
inspiration for this lemma is the lemma simulation-product-decomposition below,
which only deals with simulations f : α ×ₒ β ⊴ α ×ₒ γ (ie, with α ↓ a₁ = 𝟘ₒ in
the context of the current lemma). However the more general statement seems to
be necessary for proving left cancellability with respect to ⊴, rather than
just with respect to =.

TODO. Give better names and respect the 80 char. limit in the proof below.

\begin{code}

simulation-product-decomposition-generalised
 : (α β γ : Ordinal 𝓤)
  𝟘ₒ  α
  (a₁ :  α )
   ((f , _) : α ×ₒ β  α ×ₒ γ +ₒ (α  a₁))
  Σ g  ( β    γ ) , ((a :  α ) (b :  β )  f (a , b)  inl (a , g b))
simulation-product-decomposition-generalised {𝓤 = 𝓤} α β γ (a₀ , a₀-least) a₁ 𝕗 =
 (g , g-satisfies-equation)
  where
   f = [ α ×ₒ β , α ×ₒ γ +ₒ (α  a₁) ]⟨ 𝕗 

   P : Ordinal 𝓤   (𝓤 ) ̇
   P β = (a₁ :  α ) (γ : Ordinal 𝓤)
          ((f , _) : (α ×ₒ β)  ((α ×ₒ γ) +ₒ (α  a₁)))
           (b :  β )  Σ c   γ  , ((a :  α )  f (a , b)  inl (a , c))

   P₀ : Ordinal 𝓤   (𝓤 ) ̇
   P₀ β = (a₁ :  α ) (γ : Ordinal 𝓤)
           ((f , _) : (α ×ₒ β)  ((α ×ₒ γ) +ₒ (α  a₁)))
           (b :  β ) (x :  (α ×ₒ γ) +ₒ (α  a₁) )  f (a₀ , b)  x
             Σ c   γ  , f (a₀ , b)  inl (a₀ , c)

   g' : (β : Ordinal 𝓤) (ih : (b :  β )  P (β  b))  P₀ β
   g' β ih a₁ γ 𝕗@(f , _) b (inl (a' , c)) e = c , (e  ap  -  inl (- , c)) I)
    where
     I : a'  a₀
     I = Extensionality α a' a₀  x l  𝟘-elim (II x l))
                                 x l  𝟘-elim (transport⁻¹ ⟨_⟩ a₀-least (x , l)))
      where
       II : (x :  α )  ¬ (x ≺⟨ α  a')
       II x l = +disjoint V
        where
         III = α ×ₒ (β  b)                      =⟨ III₁ 
               α ×ₒ (β  b) +ₒ (α  a₀)          =⟨ ×ₒ-↓ α β ⁻¹ 
               α ×ₒ β  (a₀ , b)                 =⟨ III₂ 
               α ×ₒ γ +ₒ (α  a₁)  f (a₀ , b)   =⟨ III₃  
               α ×ₒ γ +ₒ (α  a₁)  inl (a' , c) =⟨ +ₒ-↓-left (a' , c) ⁻¹ 
               α ×ₒ γ  (a' , c)                 =⟨ ×ₒ-↓ α γ 
               α ×ₒ (γ  c) +ₒ (α  a')          
          where
           III₁ = 𝟘ₒ-right-neutral (α ×ₒ (β  b)) ⁻¹  ap (α ×ₒ (β  b) +ₒ_) a₀-least
           III₂ = simulations-preserve-↓ _ _ 𝕗 (a₀ , b)
           III₃ = ap (((α ×ₒ γ) +ₒ (α  a₁)) ↓_) e

         𝕗' : α ×ₒ (β  b)  α ×ₒ (γ  c) +ₒ (α  a')
         𝕗' = ≃ₒ-to-⊴ _ _ (idtoeqₒ _ _ III)
         f' = [ α ×ₒ (β  b) , α ×ₒ (γ  c) +ₒ (α  a') ]⟨ 𝕗' 

         𝕗'⁻¹ : α ×ₒ (γ  c) +ₒ (α  a')  α ×ₒ (β  b)
         𝕗'⁻¹ = ≃ₒ-to-⊴ _ _ (idtoeqₒ _ _ (III ⁻¹))
         f'⁻¹ = [ α ×ₒ (γ  c) +ₒ (α  a') , α ×ₒ (β  b) ]⟨ 𝕗'⁻¹ 

         IV : (α β : Ordinal 𝓤)  (eq : α  β) (x :  β )
                [ α , β ]⟨ ≃ₒ-to-⊴ α β (idtoeqₒ α β eq) 
                  ([ β , α ]⟨ ≃ₒ-to-⊴ β α (idtoeqₒ β α (eq ⁻¹))  x)  x
         IV α β refl x = refl

         x' :  α ×ₒ (β  b) 
         x' = f'⁻¹ (inr (x , l))

         xₐ = pr₁ x'
         x₂ = pr₂ x'

         x'' = pr₁ (ih b a' (γ  c) 𝕗' x₂)

         V = inl (xₐ , x'')          =⟨ pr₂ (ih b a' (γ  c) 𝕗' x₂) xₐ ⁻¹ 
             f' (f'⁻¹ (inr (x , l))) =⟨ IV _ _ III (inr (x , l)) 
             inr (x , l)             

   g' β _ a₁ γ 𝕗@(f , f-sim) b (inr (x , p)) e = 𝟘-elim V
    where
     I = α ×ₒ (β  b)                     =⟨ I₁ 
         α ×ₒ (β  b) +ₒ (α  a₀)         =⟨ ×ₒ-↓ α β ⁻¹ 
         α ×ₒ β  (a₀ , b)                =⟨ I₂ 
         α ×ₒ γ +ₒ (α  a₁)  f (a₀ , b)  =⟨ ap (((α ×ₒ γ) +ₒ (α  a₁)) ↓_) e 
         α ×ₒ γ +ₒ (α  a₁)  inr (x , p) =⟨ +ₒ-↓-right (x , p) ⁻¹ 
         α ×ₒ γ +ₒ (α  a₁  (x , p))     =⟨ I₃ 
         α ×ₒ γ  +ₒ (α  x)                 
          where
           I₁ = 𝟘ₒ-right-neutral (α ×ₒ (β  b)) ⁻¹  ap (α ×ₒ (β  b) +ₒ_) a₀-least
           I₂ = simulations-preserve-↓ _ _ 𝕗 (a₀ , b)
           I₃ = ap ((α ×ₒ γ) +ₒ_) (iterated-↓  α a₁ x p)

     II = α ×ₒ γ +ₒ ((α  x) +ₒ α) =⟨ +ₒ-assoc (α ×ₒ γ) (α  x) α ⁻¹ 
          α ×ₒ γ +ₒ (α  x) +ₒ α   =⟨ ap (_+ₒ α) I ⁻¹ 
          α ×ₒ (β  b) +ₒ α        =⟨ ×ₒ-successor α (β  b) ⁻¹ 
          α ×ₒ ((β  b) +ₒ 𝟙ₒ)      

     III : α ×ₒ γ +ₒ ((α  x) +ₒ α)  α ×ₒ γ +ₒ (α  a₁)
     III = transport⁻¹  -  -  α ×ₒ γ +ₒ (α  a₁)) II
                      (⊴-trans (α ×ₒ ((β  b) +ₒ 𝟙ₒ)) (α ×ₒ β) (α ×ₒ γ +ₒ (α  a₁))
                               (×ₒ-right-monotone-⊴ α ((β  b) +ₒ 𝟙ₒ) β
                                 (upper-bound-of-successors-of-initial-segments β b))
                               𝕗)
     IV : (α  x) +ₒ α  α  a₁
     IV = ≼-gives-⊴ _ _
           (+ₒ-left-reflects-≼ (α ×ₒ γ) ((α  x) +ₒ α) (α  a₁) (⊴-gives-≼ _ _ III))

     h :  α    α  a₁ 
     h a = [ (α  x) +ₒ α ,  α  a₁ ]⟨ IV  (inr a)

     h-order-preserving : is-order-preserving α (α  a₁) h
     h-order-preserving a a' l =
      simulations-are-order-preserving
       ((α  x) +ₒ α)
       (α  a₁)
       [ (α  x) +ₒ α ,  α  a₁ ]⟨ IV 
       ([ (α  x) +ₒ α ,  α  a₁ ]⟨ IV ⟩-is-simulation)
       (inr a) (inr a') l

     V : 𝟘
     V = order-preserving-gives-not-⊲ α (α  a₁) (h , h-order-preserving) (a₁ , refl)

   g'' : (β : Ordinal 𝓤) (ih : (b :  β )  P (β  b))   P β
   g'' β ih a₁ γ 𝕗@(f , f-sim) b = c , c-satisfies-equation
    where
     c = pr₁ (g' β ih a₁ γ 𝕗 b (f (a₀ , b)) refl)

     c-spec : f (a₀ , b)  inl (a₀ , c)
     c-spec = pr₂ (g' β ih a₁ γ 𝕗 b (f (a₀ , b)) refl)

     c-satisfies-equation : (a :  α )  f (a , b)  inl (a , c)
     c-satisfies-equation a = ↓-lc (α ×ₒ γ +ₒ (α  a₁)) (f (a , b)) (inl (a , c)) II
      where
       I = α ×ₒ (β  b)                      =⟨ I₁ 
           α ×ₒ (β  b) +ₒ (α  a₀)          =⟨ ×ₒ-↓ α β ⁻¹ 
           α ×ₒ β  (a₀ , b)                 =⟨ I₂ 
           α ×ₒ γ +ₒ (α  a₁)  f (a₀ , b)   =⟨ I₃ 
           α ×ₒ γ +ₒ (α  a₁)  inl (a₀ , c) =⟨ +ₒ-↓-left (a₀ , c) ⁻¹ 
           α ×ₒ γ  (a₀ , c)                 =⟨ ×ₒ-↓ α γ 
           α ×ₒ (γ  c) +ₒ (α  a₀)          =⟨ I₄ 
           α ×ₒ (γ  c) 
            where
             I₁ = 𝟘ₒ-right-neutral (α ×ₒ (β  b)) ⁻¹  ap ((α ×ₒ (β  b)) +ₒ_) a₀-least
             I₂ = simulations-preserve-↓ _ _ 𝕗 (a₀ , b)
             I₃ = ap (((α ×ₒ γ) +ₒ (α  a₁)) ↓_) c-spec
             I₄ = ap ((α ×ₒ (γ  c)) +ₒ_) a₀-least ⁻¹  𝟘ₒ-right-neutral (α ×ₒ (γ  c))

       II = α ×ₒ γ +ₒ (α  a₁)  f (a , b)   =⟨ II₁ 
            α ×ₒ β  (a , b)                 =⟨ ×ₒ-↓ α β 
            α ×ₒ (β  b) +ₒ (α  a)          =⟨ ap (_+ₒ (α  a)) I 
            α ×ₒ (γ  c) +ₒ (α  a)          =⟨ ×ₒ-↓ α γ ⁻¹ 
            α ×ₒ γ  (a , c)                 =⟨ +ₒ-↓-left (a , c) 
            α ×ₒ γ +ₒ (α  a₁)  inl (a , c) 
             where
              II₁ = simulations-preserve-↓ _ _ 𝕗 (a , b) ⁻¹

   g''' : (b :  β )  Σ c   γ  , ((a :  α )  f (a , b)  inl (a , c))
   g''' b = transfinite-induction-on-OO P g'' β a₁ γ 𝕗 b

   g :  β    γ 
   g b = pr₁ (g''' b)
   g-satisfies-equation : (a :  α ) (b :  β )  f (a , b)  inl (a , g b)
   g-satisfies-equation a b = pr₂ (g''' b) a

×ₒ-left-cancellable-⊴-generalised
 : (α β γ : Ordinal 𝓤) (a₁ :  α )
  𝟘ₒ  α
  α ×ₒ β  (α ×ₒ γ) +ₒ (α  a₁)
  β  γ
×ₒ-left-cancellable-⊴-generalised α β γ a₁ p@(a₀ , a₀-least) 𝕗 =
 (g , g-is-initial-segment , g-is-order-preserving)
 where
  f = [ α ×ₒ β , (α ×ₒ γ) +ₒ (α  a₁) ]⟨ 𝕗 
  f-sim = [ α ×ₒ β , (α ×ₒ γ) +ₒ (α  a₁) ]⟨ 𝕗 ⟩-is-simulation

  g :  β    γ 
  g = pr₁ (simulation-product-decomposition-generalised α β γ p a₁ 𝕗)

  g-property :  (a :  α )(b :  β )  f (a , b)  inl (a , g b)
  g-property = pr₂ (simulation-product-decomposition-generalised α β γ p a₁ 𝕗)

  g-is-initial-segment : is-initial-segment β γ g
  g-is-initial-segment b c l = b' , k' k , e'
   where
    l' : inl (a₀ , c) ≺⟨ ((α ×ₒ γ) +ₒ (α  a₁))  inl (a₀ , g b)
    l' = inl l

    l'' : inl (a₀ , c) ≺⟨ ((α ×ₒ γ) +ₒ (α  a₁))  f (a₀ , b)
    l'' = transport⁻¹  -  inl (a₀ , c) ≺⟨ ((α ×ₒ γ) +ₒ (α  a₁)) -)
                      (g-property a₀ b)
                      l'

    x : Σ y   α ×ₒ β  , (y ≺⟨ α ×ₒ β  (a₀ , b)) × (f y  (inl (a₀ , c)))
    x = simulations-are-initial-segments _ _ f f-sim (a₀ , b) (inl (a₀ , c)) l''
    a' = pr₁ (pr₁ x)
    b' = pr₂ (pr₁ x)
    k = pr₁ (pr₂ x)
    e = pr₂ (pr₂ x)

    k' : (a' , b') ≺⟨ α ×ₒ β  (a₀ , b)  b' ≺⟨ β  b
    k' (inl p) = p
    k' (inr (r , q)) = 𝟘-elim (transport⁻¹ ⟨_⟩ a₀-least (a' , q))

    e' : g b'  c
    e' = ap pr₂ (inl-lc (g-property a' b' ⁻¹  e))

  g-is-order-preserving : is-order-preserving β γ g
  g-is-order-preserving b b' l = III II
   where
    I : f (a₀ , b) ≺⟨ ((α ×ₒ γ) +ₒ (α  a₁))  f (a₀ , b')
    I = simulations-are-order-preserving _ _ f f-sim (a₀ , b) (a₀ , b') (inl l)

    II : inl (a₀ , g b) ≺⟨ ((α ×ₒ γ) +ₒ (α  a₁))  inl (a₀ , g b')
    II = transport₂  x y  x ≺⟨ ((α ×ₒ γ) +ₒ (α  a₁)) y)
                     (g-property a₀ b)
                     (g-property a₀ b')
                     I

    III : (a₀ , g b) ≺⟨ (α ×ₒ γ)  (a₀ , g b')  g b ≺⟨ γ  g b'
    III (inl p) = p
    III (inr (r , q)) = 𝟘-elim (irrefl α a₀ q)

×ₒ-left-cancellable-⊴ : (α β γ : Ordinal 𝓤)
                       𝟘ₒ  α
                       (α ×ₒ β)  (α ×ₒ γ)
                       β  γ
×ₒ-left-cancellable-⊴ α β γ p@(a₀ , a₀-least) 𝕗 =
  ×ₒ-left-cancellable-⊴-generalised α β γ a₀ p
   (transport  -  (α ×ₒ β)  -)
              (𝟘ₒ-right-neutral (α ×ₒ γ) ⁻¹  ap ((α ×ₒ γ) +ₒ_) a₀-least) 𝕗)

simulation-product-decomposition
 : (α : Ordinal 𝓤) (β γ : Ordinal 𝓥)
   ((a₀ , a₀-least) : 𝟘ₒ  α)
   ((f , _) : (α ×ₒ β)  (α ×ₒ γ))
  (a :  α ) (b :  β )  f (a , b)  (a , pr₂ (f (a₀ , b)))
simulation-product-decomposition {𝓤} {𝓥} α β γ (a₀ , a₀-least)
                                 (f , sim@(init-seg , order-pres)) a b = I
 where
  f' :  α ×ₒ β    α ×ₒ γ 
  f' (a , b) = (a , pr₂ (f (a₀ , b)))

  P :  α ×ₒ β   𝓤  𝓥 ̇
  P (a , b) = (f (a , b))  f' (a , b)

  I : P (a , b)
  I = Transfinite-induction (α ×ₒ β) P II (a , b)
   where
    II : (x :  α ×ₒ β )
        ((y :  α ×ₒ β )  y ≺⟨ α ×ₒ β  x  P y)
        P x
    II (a , b) IH = Extensionality (α ×ₒ γ) (f (a , b)) (f' (a , b)) III IV
     where
      III : (u :  α ×ₒ γ )  u ≺⟨ α ×ₒ γ  f (a , b)  u ≺⟨ α ×ₒ γ  f' (a , b)
      III (a' , c') p = transport  -  - ≺⟨ α ×ₒ γ  f' (a , b)) III₂ (III₃ p')
       where
        III₁ : Σ (a'' , b')   α ×ₒ β  , (a'' , b') ≺⟨ α ×ₒ β  (a , b)
                                         × (f (a'' , b')  a' , c')
        III₁ = init-seg (a , b) (a' , c') p
        a'' = pr₁ (pr₁ III₁)
        b' = pr₂ (pr₁ III₁)
        p' = pr₁ (pr₂ III₁)
        eq : f (a'' , b')  (a' , c')
        eq = pr₂ (pr₂ III₁)

        III₂ : f' (a'' , b')  (a' , c')
        III₂ = IH (a'' , b') p' ⁻¹  eq

        III₃ : (a'' , b') ≺⟨ α ×ₒ β  (a , b)
              f' (a'' , b') ≺⟨ α ×ₒ γ  f' (a , b)
        III₃ (inl q) = h (order-pres (a₀' , b') (a₀ , b) (inl q))
         where
          a₀' :  α 
          a₀' = pr₁ (f (a₀ , b))

          ih : (f (a₀' , b'))  f' (a₀' , b')
          ih = IH (a₀' , b') (inl q)

          h : f  (a₀' , b') ≺⟨ α ×ₒ γ  f  (a₀ , b)
             f' (a'' , b') ≺⟨ α ×ₒ γ  f' (a , b)
          h (inl r) = inl (transport  -  - ≺⟨ γ  pr₂ (f (a₀ , b)))
                                     (ap pr₂ ih) r)
          h (inr (_ , r)) = 𝟘-elim (irrefl α a₀' (transport  -  - ≺⟨ α  a₀')
                                                            (ap pr₁ ih) r))
        III₃ (inr (e , q)) = inr (ap  -  pr₂ (f (a₀ , -))) e , q)

      IV : (u :  α ×ₒ γ )  u ≺⟨ α ×ₒ γ  f' (a , b)  u ≺⟨ α ×ₒ γ  f  (a , b)
      IV (a' , c') (inl p) = l₂ (a' , c') (inl p)
       where
        l₁ : a₀ ≼⟨ α  a
        l₁ x p = 𝟘-elim (transport ⟨_⟩ (a₀-least ⁻¹) (x , p))
        l₂ : f (a₀ , b) ≼⟨ α ×ₒ γ  f (a , b)
        l₂ = simulations-are-monotone _ _
              f sim (a₀ , b) (a , b) (×ₒ-≼-left α β l₁)
      IV (a' , c') (inr (r , q)) =
       transport  -  - ≺⟨ α ×ₒ γ  f  (a , b)) eq
                 (order-pres (a' , b) (a , b) (inr (refl , q)))
        where
         eq = f  (a' , b)             =⟨ IH (a' , b) (inr (refl , q)) 
              f' (a' , b)             =⟨ refl 
              (a' , pr₂ (f (a₀ , b))) =⟨ ap (a' ,_) (r ⁻¹) 
              (a' , c')               
\end{code}

The following result states that multiplication for ordinals can be cancelled on
the left. Interestingly, Andrew Swan [Swa18] proved that the corresponding
result for sets is not provable constructively already for α = 𝟚: there are
toposes where the statement

  𝟚 × X ≃ 𝟚 × Y → X ≃ Y

is not true for certain objects X and Y in the topos.

[Swa18] Andrew Swan
        On Dividing by Two in Constructive Mathematics
        2018
        https://arxiv.org/abs/1804.04490

\begin{code}

×ₒ-left-cancellable : (α β γ : Ordinal 𝓤)
                     𝟘ₒ  α
                     (α ×ₒ β)  (α ×ₒ γ)
                     β  γ
×ₒ-left-cancellable {𝓤 = 𝓤} α β γ p e = ⊴-antisym β γ (f β γ e) (f γ β (e ⁻¹))
 where
  f : (β γ : Ordinal 𝓤)  (α ×ₒ β)  (α ×ₒ γ)  β  γ
  f β γ e = ×ₒ-left-cancellable-⊴ α β γ p (≃ₒ-to-⊴ (α ×ₒ β) (α ×ₒ γ)
                                                   (idtoeqₒ (α ×ₒ β) (α ×ₒ γ) e))

\end{code}

Using similar techniques, we can also prove that multiplication is
left cancellable with respect to ⊲.

\begin{code}

simulation-product-decomposition-leftover-empty
 : (α β γ : Ordinal 𝓤)
  𝟘ₒ  α
  (a :  α )
  (α ×ₒ β)  (α ×ₒ γ +ₒ (α  a))
  (α ×ₒ β)  (α ×ₒ γ)
simulation-product-decomposition-leftover-empty α β γ (a₀ , p) a e = eq
 where
  a-least : (x :  α )  ¬ (x ≺⟨ α  a)
  a-least x l = +disjoint (inr-is-inl ⁻¹)
   where
    𝕗 : α ×ₒ β  α ×ₒ γ +ₒ (α  a)
    𝕗 = ≃ₒ-to-⊴ _ _ (idtoeqₒ _ _ e)
    f = [ (α ×ₒ β) , ((α ×ₒ γ) +ₒ (α  a)) ]⟨ 𝕗 

    𝕗⁻¹ : α ×ₒ γ +ₒ (α  a)  α ×ₒ β
    𝕗⁻¹ = ≃ₒ-to-⊴ _ _ (idtoeqₒ _ _ (e ⁻¹))
    f⁻¹ = [ α ×ₒ γ +ₒ (α  a) , α ×ₒ β ]⟨ 𝕗⁻¹ 

    f-decomposition : Σ g  ( β    γ ) ,
                        ((a :  α ) (b :  β )  f (a , b)  inl (a , g b) )
    f-decomposition =
      simulation-product-decomposition-generalised α β γ (a₀ , p) a 𝕗
    g = pr₁ f-decomposition

    inr-is-inl = (inr (x , l))         =⟨ equiv _ _ e (inr (x , l)) 
                 f (f⁻¹ (inr (x , l))) =⟨ pr₂ f-decomposition x' y' 
                 inl (x' , g y')       
     where
      x' = pr₁ (f⁻¹ (inr (x , l)))
      y' = pr₂ (f⁻¹ (inr (x , l)))
      equiv : (α β : Ordinal 𝓤)  (eq : α  β) (x :  β )
             x  [ α , β ]⟨ ≃ₒ-to-⊴ α β (idtoeqₒ α β eq) 
                     ([ β , α ]⟨ ≃ₒ-to-⊴ β α (idtoeqₒ β α (eq ⁻¹))  x)
      equiv α β refl x = refl


  a-is-a₀ : a  a₀
  a-is-a₀ = Extensionality α a a₀  x l  𝟘-elim (a-least x l))
                                   x l  𝟘-elim (transport⁻¹ ⟨_⟩ p (x , l)))

  eq = α ×ₒ β            =⟨ e 
       α ×ₒ γ +ₒ (α  a) =⟨ ap ((α ×ₒ γ) +ₒ_) (ap (α ↓_) a-is-a₀  p ⁻¹) 
       α ×ₒ γ +ₒ 𝟘ₒ      =⟨ 𝟘ₒ-right-neutral (α ×ₒ γ) 
       α ×ₒ γ            

×ₒ-left-cancellable-⊲ : (α β γ : Ordinal 𝓤)
                       𝟘ₒ  α
                       α ×ₒ β  α ×ₒ γ
                       β  γ
×ₒ-left-cancellable-⊲ α β γ α-positive ((a , c) , p) = c , III
 where
  I : α ×ₒ β  α ×ₒ (γ  c) +ₒ (α  a)
  I = p  ×ₒ-↓ α γ

  II : α ×ₒ β  α ×ₒ (γ  c)
  II = simulation-product-decomposition-leftover-empty α β (γ  c) α-positive a I

  III : β  (γ  c)
  III = ×ₒ-left-cancellable α β (γ  c) α-positive II

\end{code}