Skip to content

Ordinals.IdentifyingEquivalentOrdinals

Written 26 March 2023 by Tom de Jong, following a discussion with Nicolai Kraus
on 24 March 2023, but not completed and merged into TypeTopology master then.
Revisited and updated on 17 February 2026.

--- Summary ---
We show that having an identification of the ordinals (𝟚 , ₀ ≺ ₁) and
(𝟚 , ₁ ≺ ₀) contradicts the K-axiom. It follows that preunivalence, while
sufficient to show that the type of ordinals is a set
(cf. Ordinal-is-set-under-preunivalence in Ordinals.Equivalence), is not enough
to show that the simulation ordering on the type of ordinals is
antisymmetric. Indeed, the ordinals (𝟚 , ₀ ≺ ₁) and (𝟚 , ₁ ≺ ₀) are equivalent,
while preunivalence is derivable from the K-axiom.

--- Proof sketch ---
For any two ordinals α and β, we let α ≃ₒ β denote the type of order
equivalences from α to β. By path induction, the following diagram

                ap ⟨_⟩
   α = β ------------------> ⟨ α ⟩ = ⟨ β ⟩
     |                              |
     | idtoeq                       | idtoeq
     v                              v
   α ≃ₒ β ------------------> ⟨ α ⟩ ≃ ⟨ β ⟩
              ≃ₒ-gives-≃

always commutes.

Taking α = 𝟚ₒ = (𝟚 , ₀ ≺ ₁) and β = 𝟚ₒ' = (𝟚 , ₁ ≺ ₀), we first observe that
(α ≃ₒ β) has a single inhabitant e₀, namely the order equivalence that swaps the
booleans. Therefore, applying ≃ₒ-gives-≃ to *any* element of (α ≃₀ β) always
yields the swapping equivalence (called complement in TypeTopology).

Assuming the K-axiom, all loops are refl, so that any element p : ⟨ α ⟩ = ⟨ β ⟩
must be equal to refl as ⟨ α ⟩ and ⟨ β ⟩ are both just 𝟚. Hence, under the
K-axiom, applying idtoeq to any such element always yields the identity map.

Hence, the commutativity of the diagram then tells us that identifying α and β
must contradict the K-axiom.


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

module Ordinals.IdentifyingEquivalentOrdinals where

open import MLTT.Spartan
open import MLTT.Two-Properties
open import UF.Equiv
open import UF.PreUnivalence
open import UF.Sets
open import UF.Subsingletons

open import Ordinals.Equivalence
open import Ordinals.Maps
open import Ordinals.Notions
open import Ordinals.Type
open import Ordinals.Underlying

idtoeqₒ-naturality
 : (α β : Ordinal 𝓤) (p : α  β)
  idtoeq  α   β  (ap ⟨_⟩ p)  ≃ₒ-gives-≃ α β (idtoeqₒ α β p)
idtoeqₒ-naturality α β refl = refl


We now construct the ordinal 𝟚₀ = (𝟚 , ₀ ≺ ₁).
Note that it is equivalent to 𝟙ₒ +ₒ 𝟙ₒ, but we prefer to work directly with booleans here.


private

 𝟚ₒ : Ordinal 𝓤₀
 𝟚ₒ = 𝟚 , (_≺_ , p , w , e , t)
  where
   _≺_ : 𝟚  𝟚  𝓤₀ ̇
      = 𝟘
      = 𝟙
      = 𝟘
      = 𝟘
   p : is-prop-valued _≺_
   p   = 𝟘-is-prop
   p   = 𝟙-is-prop
   p   = 𝟘-is-prop
   p   = 𝟘-is-prop
   w : is-well-founded _≺_
   w  = acc a
    where
     a : (y : 𝟚)  y    is-accessible _≺_ y
     a  l = 𝟘-elim l
     a  l = 𝟘-elim l
   w  = acc a
    where
     a : (y : 𝟚)  y    is-accessible _≺_ y
     a  l = w 
     a  l = 𝟘-elim l
   e : is-extensional _≺_
   e   u v = refl
   e   u v = 𝟘-elim (v  )
   e   u v = 𝟘-elim (u  )
   e   u v = refl
   t : is-transitive _≺_
   t    k l = l
   t    k l = l
   t    k l = l
   t    k l = l
   t    k l = l
   t    k l = k
   t    k l = k
   t    k l = l


We now construct the ordinal 𝟚₀' = (𝟚 , ₁ ≺ ₀).
There is some repetition of code which we could avoid by using
transport-well-order (on the complement map) from Ordinals.WellOrderTransport,
but that module requires function extensionality which we prefer not to assume
here for foundational minimalism.


 𝟚ₒ' : Ordinal 𝓤₀
 𝟚ₒ' = 𝟚 , (_≺_ , p , w , e , t)
  where
   _≺_ : 𝟚  𝟚  𝓤₀ ̇
      = 𝟘
      = 𝟘
      = 𝟙
      = 𝟘
   p : is-prop-valued _≺_
   p   = 𝟘-is-prop
   p   = 𝟘-is-prop
   p   = 𝟙-is-prop
   p   = 𝟘-is-prop
   w : is-well-founded _≺_
   w  = acc a
    where
     a : (y : 𝟚)  y    is-accessible _≺_ y
     a  l = 𝟘-elim l
     a  l = w 
   w  = acc a
    where
     a : (y : 𝟚)  y    is-accessible _≺_ y
     a  l = 𝟘-elim l
     a  l = 𝟘-elim l
   e : is-extensional _≺_
   e   u v = refl
   e   u v = 𝟘-elim (u  )
   e   u v = 𝟘-elim (v  )
   e   u v = refl
   t : is-transitive _≺_
   t    k l = l
   t    k l = k
   t    k l = 
   t    k l = l
   t    k l = l
   t    k l = l
   t    k l = l
   t    k l = l


The two ordinals are equivalent via the complement map and of course this is the
only order equivalence between the two ordinals.


 𝟚ₒ-≃ₒ-𝟚ₒ' : 𝟚ₒ ≃ₒ 𝟚ₒ'
 𝟚ₒ-≃ₒ-𝟚ₒ' = f , f-preserves-order , f-is-equiv , f-preserves-order'
  where
   f : 𝟚  𝟚
   f = complement
   f-preserves-order : is-order-preserving 𝟚ₒ 𝟚ₒ' f
   f-preserves-order   l = l
   f-preserves-order   l = 𝟘-elim l
   f-preserves-order   l = 𝟘-elim l
   f-preserves-order   l = 𝟘-elim l
   f-is-equiv : is-equiv f
   f-is-equiv = qinvs-are-equivs f (f , complement-involutive , complement-involutive)
   f-preserves-order' : is-order-preserving 𝟚ₒ' 𝟚ₒ f
   f-preserves-order'   l = 𝟘-elim l
   f-preserves-order'   l = 𝟘-elim l
   f-preserves-order'   l = l
   f-preserves-order'   l = 𝟘-elim l

 complement-is-the-only-ordinal-equivalence-of-𝟚
  : (e : 𝟚ₒ ≃ₒ 𝟚ₒ')  ≃ₒ-to-fun 𝟚ₒ 𝟚ₒ' e  complement
 complement-is-the-only-ordinal-equivalence-of-𝟚 e  = II
   where
    f : 𝟚  𝟚
    f = ≃ₒ-to-fun 𝟚ₒ 𝟚ₒ' e
    I : ≃ₒ-to-fun 𝟚ₒ 𝟚ₒ' e   
    I p = l' (f ) (order-equivs-are-order-preserving 𝟚ₒ 𝟚ₒ'
                     (≃ₒ-to-fun-is-order-equiv 𝟚ₒ 𝟚ₒ' e)
                       )
     where
      l : (b : 𝟚)  ¬ ( ≺⟨ 𝟚ₒ'  b)
      l  l = 𝟘-elim l
      l  l = 𝟘-elim l
      l' : (b : 𝟚)  ¬ (f  ≺⟨ 𝟚ₒ'  b)
      l' b = idtofun _ _ (ap  -  ¬ (- ≺⟨ 𝟚ₒ'  b)) (p ⁻¹)) (l b)
    II : f   
    II = different-from-₀-equal-₁ I
 complement-is-the-only-ordinal-equivalence-of-𝟚 e  = II
  where
   f : 𝟚  𝟚
   f = ≃ₒ-to-fun 𝟚ₒ 𝟚ₒ' e
   I : ≃ₒ-to-fun 𝟚ₒ 𝟚ₒ' e   
   I p = l' (f ) (order-equivs-are-order-preserving 𝟚ₒ 𝟚ₒ'
                    (≃ₒ-to-fun-is-order-equiv 𝟚ₒ 𝟚ₒ' e)
                      )
    where
     l : (b : 𝟚)  ¬ (b ≺⟨ 𝟚ₒ'  )
     l  l = 𝟘-elim l
     l  l = 𝟘-elim l
     l' : (b : 𝟚)  ¬ (b ≺⟨ 𝟚ₒ'  f )
     l' b = idtofun _ _ (ap  -  ¬ (b ≺⟨ 𝟚ₒ'  -)) (p ⁻¹)) (l b)
   II : f   
   II = different-from-₁-equal-₀ I


As announced, identifying the ordinals 𝟚₀ and 𝟚ₒ' contradicts the K-axiom.


 identification-of-𝟚ₒ-and-𝟚ₒ'-contradicts-K : 𝟚ₒ  𝟚ₒ'  ¬ K-axiom 𝓤₁
 identification-of-𝟚ₒ-and-𝟚ₒ'-contradicts-K pₒ K =
  p-is-not-refl (K (𝓤₀ ̇  ) p refl)
   where
    p : 𝟚  𝟚
    p = ap ⟨_⟩ pₒ

    f : 𝟚  𝟚
    f =  idtoeq 𝟚 𝟚 p 
    f' : 𝟚  𝟚
    f' =  ≃ₒ-gives-≃ 𝟚ₒ 𝟚ₒ' (idtoeqₒ 𝟚ₒ 𝟚ₒ' pₒ) 

    I : f  f'
    I b = ap  -   -  b) (idtoeqₒ-naturality 𝟚ₒ 𝟚ₒ' pₒ)

    II : f'  complement
    II = complement-is-the-only-ordinal-equivalence-of-𝟚 (idtoeqₒ 𝟚ₒ 𝟚ₒ' pₒ)

    p-is-not-refl : ¬ (p  refl)
    p-is-not-refl e = zero-is-not-one
     (                     =⟨ refl 
       idtoeq 𝟚 𝟚 refl   =⟨ ap  -   idtoeq 𝟚 𝟚 -  ) (e ⁻¹) 
      f                    =⟨ I  
      f'                   =⟨ II  
                           )


In particular, antisymmetry of the simulation preorder contradicts the K-axiom.
Note that we copied the definition of the simulation preorder ⊴ here from
Ordinals.OrdinalOfOrdinals since that module assumes univalence which we wish to
avoid here.


 _⊴_ : Ordinal 𝓤  Ordinal 𝓥  𝓤  𝓥 ̇
 α  β = Σ f  ( α    β ) , is-simulation α β f

 antisymmetry-of-⊴ : (𝓤 : Universe)  𝓤  ̇
 antisymmetry-of-⊴ 𝓤 = (α β : Ordinal 𝓤)  α  β  β  α  α  β

antisymmetry-of-⊴-contradicts-K : antisymmetry-of-⊴ 𝓤₀  ¬ K-axiom 𝓤₁
antisymmetry-of-⊴-contradicts-K ⊴-antisym =
 identification-of-𝟚ₒ-and-𝟚ₒ'-contradicts-K I
  where
   I : 𝟚ₒ  𝟚ₒ'
   I = ⊴-antisym 𝟚ₒ 𝟚ₒ' I₁ I₂
    where
     I₁ : 𝟚ₒ  𝟚ₒ'
     I₁ = (complement ,
            order-equivs-are-simulations 𝟚ₒ 𝟚ₒ' complement (pr₂ 𝟚ₒ-≃ₒ-𝟚ₒ'))
     I₂ : 𝟚ₒ'  𝟚ₒ
     I₂ = (complement , order-equivs-are-simulations 𝟚ₒ' 𝟚ₒ complement
                          (pr₂ (≃ₒ-sym 𝟚ₒ 𝟚ₒ' (𝟚ₒ-≃ₒ-𝟚ₒ'))))

Finally, we show that preunivalence cannot prove that ⊴ is antisymmetric.
The argument uses that the K-axiom is not false (in the absence of univalence),
but of course it is not provable either, so we add ¬¬ K-axiom as a hypothesis.

We also need a small technical lemma, K-axiom-lower, that is perhaps better
placed in UF.Sets-Properties which it can't right now because of cyclic module
dependencies (which we could avoid by replacing ≃-Lift with an inline
construction).


K-axiom-lower : K-axiom (𝓤 )  K-axiom 𝓤
K-axiom-lower {𝓤} K X = I
 where
  open import UF.Sets-Properties
  open import UF.UniverseEmbedding
  I : is-set X
  I = equiv-to-set (≃-Lift (𝓤 ) X) (K (Lift (𝓤 ) X))

preunivalence-cannot-show-antisymmetry-of-⊴
 : ¬¬ K-axiom 𝓤₁
  ¬ (is-preunivalent 𝓤₀  antisymmetry-of-⊴ 𝓤₀)
preunivalence-cannot-show-antisymmetry-of-⊴ K-consistent hyp = V
 where
  I : K-axiom 𝓤₁  is-preunivalent 𝓤₀
  I K = K-gives-preunivalence (K-axiom-lower K) K

  II : is-preunivalent 𝓤₀  antisymmetry-of-⊴ 𝓤₀
  II = hyp

  III : antisymmetry-of-⊴ 𝓤₀  ¬ K-axiom 𝓤₁
  III = antisymmetry-of-⊴-contradicts-K

  IV : K-axiom 𝓤₁  ¬ K-axiom 𝓤₁
  IV = III  II  I

  V : 𝟘
  V = K-consistent  K  IV K K)