Documentation

Mathlib.SetTheory.Ordinal.Arithmetic

Ordinal arithmetic #

Ordinals have an addition (corresponding to disjoint union) that turns them into an additive monoid, and a multiplication (corresponding to the lexicographic order on the product) that turns them into a monoid. One can also define correspondingly a subtraction, a division, a successor function, a power function and a logarithm function.

We also define limit ordinals and prove the basic induction principle on ordinals separating successor ordinals and limit ordinals, in limitRecOn.

Main definitions and results #

We discuss the properties of casts of natural numbers of and of ω with respect to these operations.

Some properties of the operations are also used to discuss general tools on ordinals:

Various other basic arithmetic results are given in Principal.lean instead.

Further properties of addition on ordinals #

@[deprecated add_left_cancel_iff (since := "2024-12-11")]
theorem Ordinal.add_left_cancel (a : Ordinal.{u_4}) {b c : Ordinal.{u_4}} :
a + b = a + c ↔ b = c
theorem Ordinal.add_le_add_iff_right {a b : Ordinal.{u_4}} (n : ℕ) :
a + ↑n ≤ b + ↑n ↔ a ≤ b
theorem Ordinal.add_right_cancel {a b : Ordinal.{u_4}} (n : ℕ) :
a + ↑n = b + ↑n ↔ a = b
theorem Ordinal.add_eq_zero_iff {a b : Ordinal.{u_4}} :
a + b = 0 ↔ a = 0 ∧ b = 0

The predecessor of an ordinal #

The ordinal predecessor of o is o' if o = succ o', and o otherwise.

Equations
Instances For
    @[simp]
    theorem Ordinal.pred_zero :
    pred 0 = 0

    Limit ordinals #

    A limit ordinal is an ordinal which is not zero and not a successor.

    TODO: deprecate this in favor of Order.IsSuccLimit.

    Equations
    Instances For
      theorem Ordinal.IsLimit.succ_lt {o a : Ordinal.{u_4}} (h : o.IsLimit) :
      a < o → Order.succ a < o
      theorem Ordinal.limit_le {o : Ordinal.{u_4}} (h : o.IsLimit) {a : Ordinal.{u_4}} :
      o ≤ a ↔ ∀ x < o, x ≤ a
      theorem Ordinal.lt_limit {o : Ordinal.{u_4}} (h : o.IsLimit) {a : Ordinal.{u_4}} :
      a < o ↔ ∃ x < o, a < x
      theorem Ordinal.IsLimit.nat_lt {o : Ordinal.{u_4}} (h : o.IsLimit) (n : ℕ) :
      ↑n < o
      theorem Ordinal.IsLimit.iSup_Iio {o : Ordinal.{u_4}} (h : o.IsLimit) :
      ⨆ (a : ↑(Set.Iio o)), ↑a = o
      def Ordinal.limitRecOn {motive : Ordinal.{u_5} → Sort u_4} (o : Ordinal.{u_5}) (zero : motive 0) (succ : (o : Ordinal.{u_5}) → motive o → motive (Order.succ o)) (isLimit : (o : Ordinal.{u_5}) → o.IsLimit → ((o' : Ordinal.{u_5}) → o' < o → motive o') → motive o) :
      motive o

      Main induction principle of ordinals: if one can prove a property by induction at successor ordinals and at limit ordinals, then it holds for all ordinals.

      Equations
      Instances For
        @[simp]
        theorem Ordinal.limitRecOn_zero {motive : Ordinal.{u_4} → Sort u_5} (H₁ : motive 0) (H₂ : (o : Ordinal.{u_4}) → motive o → motive (Order.succ o)) (H₃ : (o : Ordinal.{u_4}) → o.IsLimit → ((o' : Ordinal.{u_4}) → o' < o → motive o') → motive o) :
        limitRecOn 0 H₁ H₂ H₃ = H₁
        @[simp]
        theorem Ordinal.limitRecOn_succ {motive : Ordinal.{u_4} → Sort u_5} (o : Ordinal.{u_4}) (H₁ : motive 0) (H₂ : (o : Ordinal.{u_4}) → motive o → motive (Order.succ o)) (H₃ : (o : Ordinal.{u_4}) → o.IsLimit → ((o' : Ordinal.{u_4}) → o' < o → motive o') → motive o) :
        limitRecOn (Order.succ o) H₁ H₂ H₃ = H₂ o (limitRecOn o H₁ H₂ H₃)
        @[simp]
        theorem Ordinal.limitRecOn_limit {motive : Ordinal.{u_4} → Sort u_5} (o : Ordinal.{u_4}) (H₁ : motive 0) (H₂ : (o : Ordinal.{u_4}) → motive o → motive (Order.succ o)) (H₃ : (o : Ordinal.{u_4}) → o.IsLimit → ((o' : Ordinal.{u_4}) → o' < o → motive o') → motive o) (h : o.IsLimit) :
        limitRecOn o H₁ H₂ H₃ = H₃ o h fun (x : Ordinal.{u_4}) (_h : x < o) => limitRecOn x H₁ H₂ H₃
        def Ordinal.boundedLimitRecOn {l : Ordinal.{u_5}} (lLim : l.IsLimit) {motive : ↑(Set.Iio l) → Sort u_4} (o : ↑(Set.Iio l)) (zero : motive ⟨0, ⋯⟩) (succ : (o : ↑(Set.Iio l)) → motive o → motive ⟨Order.succ ↑o, ⋯⟩) (isLimit : (o : ↑(Set.Iio l)) → (↑o).IsLimit → ((o' : ↑(Set.Iio l)) → o' < o → motive o') → motive o) :
        motive o

        Bounded recursion on ordinals. Similar to limitRecOn, with the assumption o < l added to all cases. The final term's domain is the ordinals below l.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[simp]
          theorem Ordinal.boundedLimitRec_zero {l : Ordinal.{u_4}} (lLim : l.IsLimit) {motive : ↑(Set.Iio l) → Sort u_5} (H₁ : motive ⟨0, ⋯⟩) (H₂ : (o : ↑(Set.Iio l)) → motive o → motive ⟨Order.succ ↑o, ⋯⟩) (H₃ : (o : ↑(Set.Iio l)) → (↑o).IsLimit → ((o' : ↑(Set.Iio l)) → o' < o → motive o') → motive o) :
          boundedLimitRecOn lLim ⟨0, ⋯⟩ H₁ H₂ H₃ = H₁
          @[simp]
          theorem Ordinal.boundedLimitRec_succ {l : Ordinal.{u_4}} (lLim : l.IsLimit) {motive : ↑(Set.Iio l) → Sort u_5} (o : ↑(Set.Iio l)) (H₁ : motive ⟨0, ⋯⟩) (H₂ : (o : ↑(Set.Iio l)) → motive o → motive ⟨Order.succ ↑o, ⋯⟩) (H₃ : (o : ↑(Set.Iio l)) → (↑o).IsLimit → ((o' : ↑(Set.Iio l)) → o' < o → motive o') → motive o) :
          boundedLimitRecOn lLim ⟨Order.succ ↑o, ⋯⟩ H₁ H₂ H₃ = H₂ o (boundedLimitRecOn lLim o H₁ H₂ H₃)
          theorem Ordinal.boundedLimitRec_limit {l : Ordinal.{u_4}} (lLim : l.IsLimit) {motive : ↑(Set.Iio l) → Sort u_5} (o : ↑(Set.Iio l)) (H₁ : motive ⟨0, ⋯⟩) (H₂ : (o : ↑(Set.Iio l)) → motive o → motive ⟨Order.succ ↑o, ⋯⟩) (H₃ : (o : ↑(Set.Iio l)) → (↑o).IsLimit → ((o' : ↑(Set.Iio l)) → o' < o → motive o') → motive o) (oLim : (↑o).IsLimit) :
          boundedLimitRecOn lLim o H₁ H₂ H₃ = H₃ o oLim fun (x : ↑(Set.Iio l)) (x_1 : x < o) => boundedLimitRecOn lLim x H₁ H₂ H₃
          Equations
          theorem Ordinal.enum_succ_eq_top {o : Ordinal.{u_4}} :
          (enum fun (x1 x2 : (Order.succ o).toType) => x1 < x2) ⟨o, ⋯⟩ = ⊤
          theorem Ordinal.has_succ_of_type_succ_lt {α : Type u_4} {r : α → α → Prop} [wo : IsWellOrder α r] (h : ∀ a < type r, Order.succ a < type r) (x : α) :
          ∃ (y : α), r x y
          theorem Ordinal.bounded_singleton {α : Type u_1} {r : α → α → Prop} [IsWellOrder α r] (hr : (type r).IsLimit) (x : α) :
          @[simp]

          Normal ordinal functions #

          A normal ordinal function is a strictly increasing function which is order-continuous, i.e., the image f o of a limit ordinal o is the sup of f a for a < o.

          Equations
          Instances For
            theorem Ordinal.IsNormal.limit_le {f : Ordinal.{u_4} → Ordinal.{u_5}} (H : IsNormal f) {o : Ordinal.{u_4}} :
            o.IsLimit → ∀ {a : Ordinal.{u_5}}, f o ≤ a ↔ ∀ b < o, f b ≤ a
            theorem Ordinal.IsNormal.limit_lt {f : Ordinal.{u_4} → Ordinal.{u_5}} (H : IsNormal f) {o : Ordinal.{u_4}} (h : o.IsLimit) {a : Ordinal.{u_5}} :
            a < f o ↔ ∃ b < o, a < f b
            theorem Ordinal.isNormal_iff_strictMono_limit (f : Ordinal.{u_4} → Ordinal.{u_5}) :
            IsNormal f ↔ StrictMono f ∧ ∀ (o : Ordinal.{u_4}), o.IsLimit → ∀ (a : Ordinal.{u_5}), (∀ b < o, f b ≤ a) → f o ≤ a
            theorem Ordinal.IsNormal.lt_iff {f : Ordinal.{u_4} → Ordinal.{u_5}} (H : IsNormal f) {a b : Ordinal.{u_4}} :
            f a < f b ↔ a < b
            theorem Ordinal.IsNormal.inj {f : Ordinal.{u_4} → Ordinal.{u_5}} (H : IsNormal f) {a b : Ordinal.{u_4}} :
            f a = f b ↔ a = b
            theorem Ordinal.IsNormal.le_set {f : Ordinal.{u_4} → Ordinal.{u_5}} {o : Ordinal.{u_5}} (H : IsNormal f) (p : Set Ordinal.{u_4}) (p0 : p.Nonempty) (b : Ordinal.{u_4}) (H₂ : ∀ (o : Ordinal.{u_4}), b ≤ o ↔ ∀ a ∈ p, a ≤ o) :
            f b ≤ o ↔ ∀ a ∈ p, f a ≤ o
            theorem Ordinal.IsNormal.le_set' {α : Type u_1} {f : Ordinal.{u_4} → Ordinal.{u_5}} {o : Ordinal.{u_5}} (H : IsNormal f) (p : Set α) (p0 : p.Nonempty) (g : α → Ordinal.{u_4}) (b : Ordinal.{u_4}) (H₂ : ∀ (o : Ordinal.{u_4}), b ≤ o ↔ ∀ a ∈ p, g a ≤ o) :
            f b ≤ o ↔ ∀ a ∈ p, f (g a) ≤ o
            theorem Ordinal.add_le_of_limit {a b c : Ordinal.{u_4}} (h : b.IsLimit) :
            a + b ≤ c ↔ ∀ b' < b, a + b' ≤ c

            Subtraction on ordinals #

            a - b is the unique ordinal satisfying b + (a - b) = a when b ≤ a.

            Equations
            theorem Ordinal.le_add_sub (a b : Ordinal.{u_4}) :
            a ≤ b + (a - b)
            theorem Ordinal.sub_le {a b c : Ordinal.{u_4}} :
            a - b ≤ c ↔ a ≤ b + c
            theorem Ordinal.lt_sub {a b c : Ordinal.{u_4}} :
            a < b - c ↔ c + a < b
            theorem Ordinal.sub_eq_of_add_eq {a b c : Ordinal.{u_4}} (h : a + b = c) :
            c - a = b
            theorem Ordinal.add_sub_cancel_of_le {a b : Ordinal.{u_4}} (h : b ≤ a) :
            b + (a - b) = a
            theorem Ordinal.le_sub_of_le {a b c : Ordinal.{u_4}} (h : b ≤ a) :
            c ≤ a - b ↔ b + c ≤ a
            theorem Ordinal.sub_lt_of_le {a b c : Ordinal.{u_4}} (h : b ≤ a) :
            a - b < c ↔ a < b + c
            @[simp]
            theorem Ordinal.sub_zero (a : Ordinal.{u_4}) :
            a - 0 = a
            @[simp]
            theorem Ordinal.zero_sub (a : Ordinal.{u_4}) :
            0 - a = 0
            @[simp]
            theorem Ordinal.sub_self (a : Ordinal.{u_4}) :
            a - a = 0
            theorem Ordinal.sub_sub (a b c : Ordinal.{u_4}) :
            a - b - c = a - (b + c)
            @[simp]
            theorem Ordinal.add_sub_add_cancel (a b c : Ordinal.{u_4}) :
            a + b - (a + c) = b - c
            theorem Ordinal.le_sub_of_add_le {a b c : Ordinal.{u_4}} (h : b + c ≤ a) :
            c ≤ a - b
            theorem Ordinal.sub_lt_of_lt_add {a b c : Ordinal.{u_4}} (h : a < b + c) (hc : 0 < c) :
            a - b < c
            theorem Ordinal.lt_add_iff {a b c : Ordinal.{u_4}} (hc : c ≠ 0) :
            a < b + c ↔ ∃ d < c, a ≤ b + d
            theorem Ordinal.add_le_iff {a b c : Ordinal.{u_4}} (hb : b ≠ 0) :
            a + b ≤ c ↔ ∀ d < b, a + d < c
            @[deprecated Ordinal.add_le_iff (since := "2024-12-08")]
            theorem Ordinal.add_le_of_forall_add_lt {a b c : Ordinal.{u_4}} (hb : 0 < b) (h : ∀ d < b, a + d < c) :
            a + b ≤ c
            theorem Ordinal.isLimit_sub {a b : Ordinal.{u_4}} (ha : a.IsLimit) (h : b < a) :
            (a - b).IsLimit

            Multiplication of ordinals #

            The multiplication of ordinals o₁ and o₂ is the (well founded) lexicographic order on o₂ × o₁.

            Equations
            • One or more equations did not get rendered due to their size.
            @[simp]
            theorem Ordinal.type_prod_lex {α β : Type u} (r : α → α → Prop) (s : β → β → Prop) [IsWellOrder α r] [IsWellOrder β s] :
            type (Prod.Lex s r) = type r * type s
            @[simp]
            theorem Ordinal.card_mul (a b : Ordinal.{u_4}) :
            (a * b).card = a.card * b.card
            theorem Ordinal.mul_succ (a b : Ordinal.{u_4}) :
            a * Order.succ b = a * b + a
            theorem Ordinal.le_mul_left (a : Ordinal.{u_4}) {b : Ordinal.{u_4}} (hb : 0 < b) :
            a ≤ a * b
            theorem Ordinal.le_mul_right (a : Ordinal.{u_4}) {b : Ordinal.{u_4}} (hb : 0 < b) :
            a ≤ b * a
            theorem Ordinal.mul_le_of_limit {a b c : Ordinal.{u_4}} (h : b.IsLimit) :
            a * b ≤ c ↔ ∀ b' < b, a * b' ≤ c
            theorem Ordinal.isNormal_mul_right {a : Ordinal.{u_4}} (h : 0 < a) :
            IsNormal fun (x : Ordinal.{u_4}) => a * x
            theorem Ordinal.lt_mul_of_limit {a b c : Ordinal.{u_4}} (h : c.IsLimit) :
            a < b * c ↔ ∃ c' < c, a < b * c'
            theorem Ordinal.mul_lt_mul_iff_left {a b c : Ordinal.{u_4}} (a0 : 0 < a) :
            a * b < a * c ↔ b < c
            theorem Ordinal.mul_le_mul_iff_left {a b c : Ordinal.{u_4}} (a0 : 0 < a) :
            a * b ≤ a * c ↔ b ≤ c
            theorem Ordinal.mul_lt_mul_of_pos_left {a b c : Ordinal.{u_4}} (h : a < b) (c0 : 0 < c) :
            c * a < c * b
            theorem Ordinal.mul_pos {a b : Ordinal.{u_4}} (h₁ : 0 < a) (h₂ : 0 < b) :
            0 < a * b
            theorem Ordinal.mul_ne_zero {a b : Ordinal.{u_4}} :
            a ≠ 0 → b ≠ 0 → a * b ≠ 0
            theorem Ordinal.le_of_mul_le_mul_left {a b c : Ordinal.{u_4}} (h : c * a ≤ c * b) (h0 : 0 < c) :
            a ≤ b
            theorem Ordinal.mul_right_inj {a b c : Ordinal.{u_4}} (a0 : 0 < a) :
            a * b = a * c ↔ b = c
            theorem Ordinal.isLimit_mul {a b : Ordinal.{u_4}} (a0 : 0 < a) :
            b.IsLimit → (a * b).IsLimit
            theorem Ordinal.isLimit_mul_left {a b : Ordinal.{u_4}} (l : a.IsLimit) (b0 : 0 < b) :
            (a * b).IsLimit
            theorem Ordinal.smul_eq_mul (n : ℕ) (a : Ordinal.{u_4}) :
            n • a = a * ↑n
            theorem Ordinal.add_mul_succ {a b : Ordinal.{u_4}} (c : Ordinal.{u_4}) (ba : b + a = a) :
            (a + b) * Order.succ c = a * Order.succ c + b
            theorem Ordinal.add_mul_limit {a b c : Ordinal.{u_4}} (ba : b + a = a) (l : c.IsLimit) :
            (a + b) * c = a * c

            Division on ordinals #

            a / b is the unique ordinal o satisfying a = b * o + o' with o' < b.

            Equations
            @[simp]
            theorem Ordinal.div_zero (a : Ordinal.{u_4}) :
            a / 0 = 0
            theorem Ordinal.lt_mul_succ_div (a : Ordinal.{u_4}) {b : Ordinal.{u_4}} (h : b ≠ 0) :
            a < b * Order.succ (a / b)
            theorem Ordinal.lt_mul_div_add (a : Ordinal.{u_4}) {b : Ordinal.{u_4}} (h : b ≠ 0) :
            a < b * (a / b) + b
            theorem Ordinal.div_le {a b c : Ordinal.{u_4}} (b0 : b ≠ 0) :
            a / b ≤ c ↔ a < b * Order.succ c
            theorem Ordinal.lt_div {a b c : Ordinal.{u_4}} (h : c ≠ 0) :
            a < b / c ↔ c * Order.succ a ≤ b
            theorem Ordinal.div_pos {b c : Ordinal.{u_4}} (h : c ≠ 0) :
            0 < b / c ↔ c ≤ b
            theorem Ordinal.le_div {a b c : Ordinal.{u_4}} (c0 : c ≠ 0) :
            a ≤ b / c ↔ c * a ≤ b
            theorem Ordinal.div_lt {a b c : Ordinal.{u_4}} (b0 : b ≠ 0) :
            a / b < c ↔ a < b * c
            theorem Ordinal.div_le_of_le_mul {a b c : Ordinal.{u_4}} (h : a ≤ b * c) :
            a / b ≤ c
            theorem Ordinal.mul_lt_of_lt_div {a b c : Ordinal.{u_4}} :
            a < b / c → c * a < b
            @[simp]
            theorem Ordinal.zero_div (a : Ordinal.{u_4}) :
            0 / a = 0
            theorem Ordinal.mul_div_le (a b : Ordinal.{u_4}) :
            b * (a / b) ≤ a
            theorem Ordinal.div_le_left {a b : Ordinal.{u_4}} (h : a ≤ b) (c : Ordinal.{u_4}) :
            a / c ≤ b / c
            theorem Ordinal.mul_add_div (a : Ordinal.{u_4}) {b : Ordinal.{u_4}} (b0 : b ≠ 0) (c : Ordinal.{u_4}) :
            (b * a + c) / b = a + c / b
            theorem Ordinal.div_eq_zero_of_lt {a b : Ordinal.{u_4}} (h : a < b) :
            a / b = 0
            @[simp]
            theorem Ordinal.mul_div_cancel (a : Ordinal.{u_4}) {b : Ordinal.{u_4}} (b0 : b ≠ 0) :
            b * a / b = a
            theorem Ordinal.mul_add_div_mul {a c : Ordinal.{u_4}} (hc : c < a) (b d : Ordinal.{u_4}) :
            (a * b + c) / (a * d) = b / d
            theorem Ordinal.mul_div_mul_cancel {a : Ordinal.{u_4}} (ha : a ≠ 0) (b c : Ordinal.{u_4}) :
            a * b / (a * c) = b / c
            @[simp]
            theorem Ordinal.div_one (a : Ordinal.{u_4}) :
            a / 1 = a
            @[simp]
            theorem Ordinal.div_self {a : Ordinal.{u_4}} (h : a ≠ 0) :
            a / a = 1
            theorem Ordinal.mul_sub (a b c : Ordinal.{u_4}) :
            a * (b - c) = a * b - a * c
            theorem Ordinal.dvd_add_iff {a b c : Ordinal.{u_4}} :
            a ∣ b → (a ∣ b + c ↔ a ∣ c)
            theorem Ordinal.div_mul_cancel {a b : Ordinal.{u_4}} :
            a ≠ 0 → a ∣ b → a * (b / a) = b
            theorem Ordinal.le_of_dvd {a b : Ordinal.{u_4}} :
            b ≠ 0 → a ∣ b → a ≤ b
            theorem Ordinal.dvd_antisymm {a b : Ordinal.{u_4}} (h₁ : a ∣ b) (h₂ : b ∣ a) :
            a = b

            a % b is the unique ordinal o' satisfying a = b * o + o' with o' < b.

            Equations
            theorem Ordinal.mod_def (a b : Ordinal.{u_4}) :
            a % b = a - b * (a / b)
            theorem Ordinal.mod_le (a b : Ordinal.{u_4}) :
            a % b ≤ a
            @[simp]
            theorem Ordinal.mod_zero (a : Ordinal.{u_4}) :
            a % 0 = a
            theorem Ordinal.mod_eq_of_lt {a b : Ordinal.{u_4}} (h : a < b) :
            a % b = a
            @[simp]
            theorem Ordinal.zero_mod (b : Ordinal.{u_4}) :
            0 % b = 0
            theorem Ordinal.div_add_mod (a b : Ordinal.{u_4}) :
            b * (a / b) + a % b = a
            theorem Ordinal.mod_lt (a : Ordinal.{u_4}) {b : Ordinal.{u_4}} (h : b ≠ 0) :
            a % b < b
            @[simp]
            theorem Ordinal.mod_self (a : Ordinal.{u_4}) :
            a % a = 0
            @[simp]
            theorem Ordinal.mod_one (a : Ordinal.{u_4}) :
            a % 1 = 0
            theorem Ordinal.dvd_of_mod_eq_zero {a b : Ordinal.{u_4}} (H : a % b = 0) :
            b ∣ a
            theorem Ordinal.mod_eq_zero_of_dvd {a b : Ordinal.{u_4}} (H : b ∣ a) :
            a % b = 0
            @[simp]
            theorem Ordinal.mul_add_mod_self (x y z : Ordinal.{u_4}) :
            (x * y + z) % x = z % x
            @[simp]
            theorem Ordinal.mul_mod (x y : Ordinal.{u_4}) :
            x * y % x = 0
            theorem Ordinal.mul_add_mod_mul {w x : Ordinal.{u_4}} (hw : w < x) (y z : Ordinal.{u_4}) :
            (x * y + w) % (x * z) = x * (y % z) + w
            theorem Ordinal.mul_mod_mul (x y z : Ordinal.{u_4}) :
            x * y % (x * z) = x * (y % z)
            theorem Ordinal.mod_mod_of_dvd (a : Ordinal.{u_4}) {b c : Ordinal.{u_4}} (h : c ∣ b) :
            a % b % c = a % c
            @[simp]
            theorem Ordinal.mod_mod (a b : Ordinal.{u_4}) :
            a % b % b = a % b

            Casting naturals into ordinals, compatibility with operations #

            @[simp]
            theorem Ordinal.one_add_natCast (m : ℕ) :
            1 + ↑m = ↑(Order.succ m)
            @[simp]
            theorem Ordinal.natCast_mul (m n : ℕ) :
            ↑(m * n) = ↑m * ↑n
            @[simp]
            theorem Ordinal.natCast_sub (m n : ℕ) :
            ↑(m - n) = ↑m - ↑n
            @[simp]
            theorem Ordinal.natCast_div (m n : ℕ) :
            ↑(m / n) = ↑m / ↑n
            @[simp]
            theorem Ordinal.natCast_mod (m n : ℕ) :
            ↑(m % n) = ↑m % ↑n
            @[simp]
            theorem Ordinal.lift_natCast (n : ℕ) :
            lift.{u, v} ↑n = ↑n
            theorem Ordinal.lt_omega0 {o : Ordinal.{u_4}} :
            o < omega0 ↔ ∃ (n : ℕ), o = ↑n
            theorem Ordinal.eq_nat_or_omega0_le (o : Ordinal.{u_4}) :
            (∃ (n : ℕ), o = ↑n) ∨ omega0 ≤ o
            theorem Ordinal.omega0_le {o : Ordinal.{u_4}} :
            omega0 ≤ o ↔ ∀ (n : ℕ), ↑n ≤ o
            theorem Ordinal.nat_lt_limit {o : Ordinal.{u_4}} (h : o.IsLimit) (n : ℕ) :
            ↑n < o
            @[simp]
            theorem Ordinal.natCast_add_of_omega0_le {o : Ordinal.{u_4}} (h : omega0 ≤ o) (n : ℕ) :
            ↑n + o = o
            @[simp]
            @[simp]
            theorem Ordinal.natCast_mod_omega0 (n : ℕ) :
            ↑n % omega0 = ↑n
            @[simp]