Martin Escardo, 23 December 2020. We discuss how to transport well-orders along equivalences. This cannot be done with univalence when the types live in different universes. \begin{code} {-# OPTIONS --without-K --exact-split --safe --auto-inline #-} open import MLTT.Spartan open import UF.FunExt module Ordinals.WellOrderTransport (fe : FunExt) where open import Ordinals.Notions open import Ordinals.Type open import Ordinals.Underlying open import Ordinals.WellOrderArithmetic open import UF.Base open import UF.Subsingletons open import UF.Retracts open import UF.Equiv open import UF.Univalence \end{code} Univalence makes the following trivial: \begin{code} transport-ordinal-structure : is-univalent 𝓤 → (X Y : 𝓤 ̇ ) → X ≃ Y → OrdinalStructure X ≃ OrdinalStructure Y transport-ordinal-structure ua X Y = γ where δ : X = Y → OrdinalStructure X = OrdinalStructure Y δ = ap OrdinalStructure γ : X ≃ Y → OrdinalStructure X ≃ OrdinalStructure Y γ e = idtoeq (OrdinalStructure X) (OrdinalStructure Y) (δ (eqtoid ua X Y e)) \end{code} The above can be done without univance. We could hope to get, more generally, (X : 𝓤 ̇ ) (Y : 𝓥 ̇ ) → X ≃ Y → OrdinalStructure X ≃ OrdinalStructure Y. But this not possible, not even assuming univalence. The reason is that it is not possible to transport an order _<_ : X → X → 𝓤 to an order _≺_ : Y → Y → 𝓥 along a given equivalence X ≃ Y without propositional resizing, which we prefer not to assume. However, if a particular order is resizable we can perform the transport, although univalence won't help, which is what we do in this file. \begin{code} module order-transfer-lemma₁ (X : 𝓤 ̇ ) (Y : 𝓥 ̇ ) (𝕗 : X ≃ Y) where private f : X → Y f = ⌜ 𝕗 ⌝ g : Y → X g = inverse f (⌜⌝-is-equiv 𝕗) η : g ∘ f ∼ id η = inverses-are-retractions f (⌜⌝-is-equiv 𝕗) ε : f ∘ g ∼ id ε = inverses-are-sections f (⌜⌝-is-equiv 𝕗) \end{code} The point is that the derived relation has values in the universe 𝓤, but we would need it to have values in the universe 𝓥. If the relation is proposition-valued and propositional resizing holds, then this is not a problem, but we prefer not to assume propositional resizing. So we assume that the order relation on X already has values in 𝓥, and, as it turns out, this will be enough for our intended application of this file. So we make one further assumption and a definition: \begin{code} module _ (_<_ : X → X → 𝓥 ̇ ) where private _≺_ : Y → Y → 𝓥 ̇ y ≺ y' = g y < g y' order = _≺_ order-preservation→ : (x x' : X) → x < x' → f x ≺ f x' order-preservation→ x x' = transport₂ _<_ ((η x)⁻¹) ((η x')⁻¹) order-preservation← : (y y' : Y) → y ≺ y' → g y < g y' order-preservation← y y' = id \end{code} Then our objective will be to prove the following: \begin{code} transport-well-order : is-well-order _<_ ⇔ is-well-order _≺_ \end{code} This is easy but painful, and will need a number of routine steps. But notice that \begin{code} private NB-< : type-of (is-well-order _<_) = 𝓤 ⊔ 𝓥 ̇ NB-< = refl NB-≺ : type-of (is-well-order _≺_) = 𝓥 ̇ NB-≺ = refl \end{code} So we can't assert that the types (is-well-order _<_) and (is-well-order _≺_) are equal. However, we can easily establish their equivalence: \begin{code} transport-well-order-≃ : (is-well-order _<_) ≃ (is-well-order _≺_) transport-well-order-≃ = logically-equivalent-props-are-equivalent (being-well-order-is-prop (_<_) fe) (being-well-order-is-prop (_≺_) fe) (lr-implication transport-well-order) (rl-implication transport-well-order) \end{code} And now we provide all steps needed to establish transport-well-order. \begin{code} is-prop-valued→ : is-prop-valued _<_ → is-prop-valued _≺_ is-prop-valued→ j y y' = j (g y) (g y') is-prop-valued← : is-prop-valued _≺_ → is-prop-valued _<_ is-prop-valued← i x x' = γ where δ : is-prop (g (f x) < g (f x')) δ = i (f x) (f x') γ : is-prop (x < x') γ = transport₂ (λ x x' → is-prop (x < x')) (η x) (η x') δ is-well-founded→ : is-well-founded _<_ → is-well-founded _≺_ is-well-founded→ = retract-well-founded _<_ _≺_ f g ε γ where γ : (x : X) (y : Y) → y ≺ f x → g y < x γ x y = transport ( g y <_) (η x) is-well-founded← : is-well-founded _≺_ → is-well-founded _<_ is-well-founded← = retract-well-founded _≺_ _<_ g f η γ where γ : (y : Y) (x : X) → x < g y → f x ≺ y γ y x = transport (_< g y) ((η x)⁻¹) is-extensional→ : is-extensional _<_ → is-extensional _≺_ is-extensional→ e y y' ϕ γ = p where α : (x : X) → x < g y → x < g y' α x l = transport (_< g y') (η x) a where a : g (f x) < g y' a = ϕ (f x) (transport (_< g y) ((η x)⁻¹) l) β : (x : X) → x < g y' → x < g y β x l = transport (_< g y) (η x) b where b : g (f x) < g y b = γ (f x) (transport (_< g y') ((η x)⁻¹) l) q : g y = g y' q = e (g y) (g y') α β p : y = y' p = sections-are-lc g (f , ε) q is-extensional← : is-extensional _≺_ → is-extensional _<_ is-extensional← e x x' ϕ γ = p where α : (y : Y) → g y < g (f x) → g y < g (f x') α y l = transport (g y <_) ((η x')⁻¹) a where a : g y < x' a = ϕ (g y) (transport (g y <_) (η x) l) β : (y : Y) → g y < g (f x') → g y < g (f x) β y l = transport (g y <_) ((η x)⁻¹) b where b : g y < x b = γ (g y) (transport (g y <_) (η x') l) q : f x = f x' q = e (f x) (f x') α β p : x = x' p = sections-are-lc f (g , η) q is-transitive→ : is-transitive _<_ → is-transitive _≺_ is-transitive→ t x y z = t (g x) (g y) (g z) is-transitive← : is-transitive _≺_ → is-transitive _<_ is-transitive← t x y z = γ where δ : g (f x) < g (f y) → g (f y) < g (f z) → g (f x) < g (f z) δ = t (f x) (f y) (f z) γ : x < y → y < z → x < z γ = transport₃ (λ a b c → a < b → b < c → a < c) (η x) (η y) (η z) δ \end{code} Putting all this together, we get the desired result: \begin{code} well-order→ : is-well-order _<_ → is-well-order _≺_ well-order→ (p , w , e , t) = is-prop-valued→ p , is-well-founded→ w , is-extensional→ e , is-transitive→ t well-order← : is-well-order _≺_ → is-well-order _<_ well-order← (p , w , e , t) = is-prop-valued← p , is-well-founded← w , is-extensional← e , is-transitive← t transport-well-order = well-order→ , well-order← \end{code} So we see how much work univalence is performing behind the scenes, when it is available, as in the construction transport-ordinal-structure. \begin{code} module order-transfer-lemma₂ (X : 𝓤 ̇ ) (_<_ : X → X → 𝓥 ̇ ) (_≺_ : X → X → 𝓦 ̇ ) (𝕗 : (x y : X) → (x < y) ≃ (x ≺ y)) where private f : {x y : X} → x < y → x ≺ y f {x} {y} = ⌜ 𝕗 x y ⌝ g : {x y : X} → x ≺ y → x < y g {x} {y} = inverse (f {x} {y}) (⌜⌝-is-equiv (𝕗 x y)) is-prop-valued→ : is-prop-valued _<_ → is-prop-valued _≺_ is-prop-valued→ i x y = equiv-to-prop (≃-sym (𝕗 x y)) (i x y) is-well-founded→ : is-well-founded _<_ → is-well-founded _≺_ is-well-founded→ = retract-well-founded _<_ _≺_ id id (λ x → refl) (λ x y → g {y} {x}) is-extensional→ : is-extensional _<_ → is-extensional _≺_ is-extensional→ e x y ϕ γ = p where α : (u : X) → u < x → u < y α u l = g (ϕ u (f l)) β : (u : X) → u < y → u < x β u l = g (γ u (f l)) p : x = y p = e x y α β is-transitive→ : is-transitive _<_ → is-transitive _≺_ is-transitive→ t x y z l m = f (t x y z (g l) (g m)) module order-transfer-lemma₃ (X : 𝓤 ̇ ) (_<_ : X → X → 𝓤 ̇ ) (_≺_ : X → X → 𝓥 ̇ ) (𝕗 : (x y : X) → (x < y) ≃ (x ≺ y)) where well-order→ : is-well-order _<_ → is-well-order _≺_ well-order→ (p , w , e , t) = is-prop-valued→ p , is-well-founded→ w , is-extensional→ e , is-transitive→ t where open order-transfer-lemma₂ X _<_ _≺_ 𝕗 well-order← : is-well-order _≺_ → is-well-order _<_ well-order← (p , w , e , t) = is-prop-valued→ p , is-well-founded→ w , is-extensional→ e , is-transitive→ t where open order-transfer-lemma₂ X _≺_ _<_ (λ x y → ≃-sym (𝕗 x y)) transport-well-order : is-well-order _<_ ⇔ is-well-order _≺_ transport-well-order = well-order→ , well-order← transport-well-order-≃ : (is-well-order _<_) ≃ (is-well-order _≺_) transport-well-order-≃ = logically-equivalent-props-are-equivalent (being-well-order-is-prop (_<_) fe) (being-well-order-is-prop (_≺_) fe) (lr-implication transport-well-order) (rl-implication transport-well-order) \end{code} We can transport structures of ordinals with resizable order: \begin{code} resizable-order : Ordinal 𝓤 → (𝓥 : Universe) → 𝓤 ⊔ (𝓥 ⁺) ̇ resizable-order α 𝓥 = Σ _<_ ꞉ (⟨ α ⟩ → ⟨ α ⟩ → 𝓥 ̇ ) , ((x y : ⟨ α ⟩) → (x ≺⟨ α ⟩ y) ≃ (x < y)) transfer-structure : (X : 𝓤 ̇ ) (α : Ordinal 𝓥) → X ≃ ⟨ α ⟩ → resizable-order α 𝓤 → Σ s ꞉ OrdinalStructure X , (X , s) ≃ₒ α transfer-structure {𝓤} {𝓥} X α 𝕗 (_<_ , <-is-equivalent-to-≺) = γ where f : X → ⟨ α ⟩ f = ⌜ 𝕗 ⌝ g : ⟨ α ⟩ → X g = inverse f (⌜⌝-is-equiv 𝕗) ε : f ∘ g ∼ id ε = inverses-are-sections f (⌜⌝-is-equiv 𝕗) w⁻ : is-well-order _<_ w⁻ = order-transfer-lemma₃.well-order→ ⟨ α ⟩ (underlying-order α) _<_ <-is-equivalent-to-≺ (is-well-ordered α) _≺_ : X → X → 𝓤 ̇ x ≺ y = f x < f y w : is-well-order _≺_ w = order-transfer-lemma₁.well-order→ ⟨ α ⟩ X (≃-sym 𝕗) _<_ w⁻ g-preserves-order : (a b : ⟨ α ⟩) → a ≺⟨ α ⟩ b → g a ≺ g b g-preserves-order a b l = γ where δ : a < b δ = ⌜ <-is-equivalent-to-≺ a b ⌝ l γ : f (g a) < f (g b) γ = transport₂ _<_ ((ε a)⁻¹) ((ε b)⁻¹) δ f-preserves-order : (x y : X) → x ≺ y → f x ≺⟨ α ⟩ f y f-preserves-order x y = ⌜ <-is-equivalent-to-≺ (f x) (f y) ⌝⁻¹ e : (X , _≺_ , w) ≃ₒ α e = (f , f-preserves-order , ⌜⌝-is-equiv 𝕗 , g-preserves-order) γ : Σ s ꞉ OrdinalStructure X , (X , s) ≃ₒ α γ = ((_≺_ , w) , e) \end{code}