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 #

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

Limit ordinals #

@[deprecated Order.IsSuccLimit (since := "2025-02-09")]

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

Deprecated: use Order.IsSuccLimit instead.

Equations
    Instances For
      @[deprecated Ordinal.isSuccLimit_iff (since := "2025-07-09")]

      Alias of Ordinal.isSuccLimit_iff.

      @[deprecated Order.IsSuccLimit.isSuccPrelimit (since := "2025-07-09")]

      Alias of Order.IsSuccLimit.isSuccPrelimit.

      @[deprecated Order.IsSuccLimit.succ_lt (since := "2025-07-09")]
      theorem Ordinal.IsLimit.succ_lt {α : Type u_1} {a b : α} [PartialOrder α] [SuccOrder α] (hb : Order.IsSuccLimit b) (ha : a < b) :

      Alias of Order.IsSuccLimit.succ_lt.

      @[deprecated Ordinal.not_isSuccLimit_zero (since := "2025-07-09")]

      Alias of Ordinal.not_isSuccLimit_zero.

      @[deprecated Order.not_isSuccLimit_succ (since := "2025-07-09")]

      Alias of Order.not_isSuccLimit_succ.

      @[deprecated Order.not_isSuccLimit_succ (since := "2025-07-09")]
      @[deprecated Order.IsSuccLimit.succ_lt_iff (since := "2025-07-09")]
      theorem Ordinal.succ_lt_of_isLimit {α : Type u_1} {a b : α} [PartialOrder α] [SuccOrder α] (hb : Order.IsSuccLimit b) :
      Order.succ a < b a < b

      Alias of Order.IsSuccLimit.succ_lt_iff.

      @[deprecated Order.IsSuccLimit.le_succ_iff (since := "2025-07-09")]
      theorem Ordinal.le_succ_of_isLimit {α : Type u_1} {a b : α} [LinearOrder α] [SuccOrder α] (hb : Order.IsSuccLimit b) :

      Alias of Order.IsSuccLimit.le_succ_iff.

      @[deprecated Order.IsSuccLimit.le_iff_forall_le (since := "2025-07-09")]
      theorem Ordinal.limit_le {α : Type u_1} {a b : α} [LinearOrder α] (h : Order.IsSuccLimit a) :
      a b c < a, c b

      Alias of Order.IsSuccLimit.le_iff_forall_le.

      @[deprecated Order.IsSuccLimit.lt_iff_exists_lt (since := "2025-07-09")]
      theorem Ordinal.lt_limit {α : Type u_1} {a b : α} [LinearOrder α] (h : Order.IsSuccLimit b) :
      a < b c < b, a < c

      Alias of Order.IsSuccLimit.lt_iff_exists_lt.

      @[deprecated Ordinal.isSuccLimit_lift (since := "2025-07-09")]

      Alias of Ordinal.isSuccLimit_lift.

      @[deprecated Order.IsSuccLimit.bot_lt (since := "2025-07-09")]
      theorem Ordinal.IsLimit.pos {o : Ordinal.{u_4}} (h : o.IsLimit) :
      0 < o
      @[deprecated Order.IsSuccLimit.ne_bot (since := "2025-07-09")]
      @[deprecated Ordinal.natCast_lt_of_isSuccLimit (since := "2025-07-09")]
      theorem Ordinal.IsLimit.nat_lt {o : Ordinal.{u_4}} (h : Order.IsSuccLimit o) (n : ) :
      n < o

      Alias of Ordinal.natCast_lt_of_isSuccLimit.

      @[deprecated Ordinal.one_lt_of_isSuccLimit (since := "2025-07-09")]

      Alias of Ordinal.one_lt_of_isSuccLimit.

      @[deprecated Ordinal.zero_or_succ_or_isSuccLimit (since := "2025-07-09")]
      @[deprecated Ordinal.zero_or_succ_or_isSuccLimit (since := "2025-07-09")]
      @[deprecated Order.IsSuccLimit.sSup_Iio (since := "2025-07-09")]

      Alias of Order.IsSuccLimit.sSup_Iio.

      @[deprecated Order.IsSuccLimit.iSup_Iio (since := "2025-07-09")]
      theorem Ordinal.IsLimit.iSup_Iio {α : Type u_2} [ConditionallyCompleteLinearOrderBot α] {x : α} (h : Order.IsSuccLimit x) :
      ⨆ (a : (Set.Iio x)), a = x

      Alias of Order.IsSuccLimit.iSup_Iio.

      def Ordinal.limitRecOn {motive : Ordinal.{u_5}Sort u_4} (o : Ordinal.{u_5}) (zero : motive 0) (succ : (o : Ordinal.{u_5}) → motive omotive (Order.succ o)) (limit : (o : Ordinal.{u_5}) → Order.IsSuccLimit o((o' : Ordinal.{u_5}) → o' < omotive 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 omotive (Order.succ o)) (H₃ : (o : Ordinal.{u_4}) → Order.IsSuccLimit o((o' : Ordinal.{u_4}) → o' < omotive 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 omotive (Order.succ o)) (H₃ : (o : Ordinal.{u_4}) → Order.IsSuccLimit o((o' : Ordinal.{u_4}) → o' < omotive 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 omotive (Order.succ o)) (H₃ : (o : Ordinal.{u_4}) → Order.IsSuccLimit o((o' : Ordinal.{u_4}) → o' < omotive o')motive o) (h : Order.IsSuccLimit o) :
          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 : Order.IsSuccLimit l) {motive : (Set.Iio l)Sort u_4} (o : (Set.Iio l)) (zero : motive 0, ) (succ : (o : (Set.Iio l)) → motive omotive Order.succ o, ) (limit : (o : (Set.Iio l)) → Order.IsSuccLimit o((o' : (Set.Iio l)) → o' < omotive 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
            Instances For
              @[simp]
              theorem Ordinal.boundedLimitRec_zero {l : Ordinal.{u_4}} (lLim : Order.IsSuccLimit l) {motive : (Set.Iio l)Sort u_5} (H₁ : motive 0, ) (H₂ : (o : (Set.Iio l)) → motive omotive Order.succ o, ) (H₃ : (o : (Set.Iio l)) → Order.IsSuccLimit o((o' : (Set.Iio l)) → o' < omotive o')motive o) :
              boundedLimitRecOn lLim 0, H₁ H₂ H₃ = H₁
              @[simp]
              theorem Ordinal.boundedLimitRec_succ {l : Ordinal.{u_4}} (lLim : Order.IsSuccLimit l) {motive : (Set.Iio l)Sort u_5} (o : (Set.Iio l)) (H₁ : motive 0, ) (H₂ : (o : (Set.Iio l)) → motive omotive Order.succ o, ) (H₃ : (o : (Set.Iio l)) → Order.IsSuccLimit o((o' : (Set.Iio l)) → o' < omotive 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 : Order.IsSuccLimit l) {motive : (Set.Iio l)Sort u_5} (o : (Set.Iio l)) (H₁ : motive 0, ) (H₂ : (o : (Set.Iio l)) → motive omotive Order.succ o, ) (H₃ : (o : (Set.Iio l)) → Order.IsSuccLimit o((o' : (Set.Iio l)) → o' < omotive o')motive o) (oLim : Order.IsSuccLimit o) :
              boundedLimitRecOn lLim o H₁ H₂ H₃ = H₃ o oLim fun (x : (Set.Iio l)) (x_1 : x < o) => boundedLimitRecOn lLim x H₁ H₂ H₃
              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 : Order.IsSuccLimit (type r)) (x : α) :
              @[simp]

              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
                  @[deprecated Ordinal.pred_le_iff_le_succ (since := "2025-02-11")]

                  Alias of Ordinal.pred_le_iff_le_succ.

                  @[deprecated Ordinal.lt_pred_iff_succ_lt (since := "2025-02-11")]

                  Alias of Ordinal.lt_pred_iff_succ_lt.

                  Ordinal.pred and Order.succ form a Galois insertion.

                  Equations
                    Instances For
                      @[deprecated Ordinal.pred_eq_iff_isSuccPrelimit (since := "2025-02-11")]
                      @[deprecated Ordinal.pred_eq_iff_isSuccPrelimit (since := "2025-02-11")]
                      @[deprecated Ordinal.pred_lt_iff_not_isSuccPrelimit (since := "2025-02-11")]
                      @[deprecated Ordinal.succ_pred_iff_is_succ (since := "2025-02-11")]
                      @[deprecated Order.IsSuccPrelimit.succ_lt_iff (since := "2025-02-11")]
                      theorem Ordinal.succ_lt_of_not_succ {o b : Ordinal.{u_4}} (h : ¬∃ (a : Ordinal.{u_4}), o = Order.succ a) :
                      Order.succ b < o b < o
                      @[deprecated Ordinal.isSuccPrelimit_lift (since := "2025-02-11")]

                      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.

                      Todo: deprecate this in favor of Order.IsNormal.

                      Equations
                        Instances For
                          theorem Ordinal.IsNormal.limit_le {f : Ordinal.{u_4}Ordinal.{u_5}} (H : IsNormal f) {o : Ordinal.{u_4}} :
                          Order.IsSuccLimit o∀ {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 : Order.IsSuccLimit o) {a : Ordinal.{u_5}} :
                          a < f o b < o, a < f b
                          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 ap, a o) :
                          f b o ap, 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 ap, g a o) :
                          f b o ap, f (g a) o

                          Subtraction on ordinals #

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

                          Equations
                            theorem Ordinal.add_sub_cancel_of_le {a b : Ordinal.{u_4}} (h : b a) :
                            b + (a - b) = a
                            @[simp]
                            theorem Ordinal.add_sub_cancel (a b : Ordinal.{u_4}) :
                            a + b - a = b
                            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.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
                            theorem Ordinal.lt_add_iff_of_isSuccLimit {a b c : Ordinal.{u_4}} (hc : Order.IsSuccLimit c) :
                            a < b + c d < c, a < b + d
                            @[deprecated Ordinal.lt_add_iff_of_isSuccLimit (since := "2025-07-08")]
                            theorem Ordinal.lt_add_of_limit {a b c : Ordinal.{u_4}} (hc : Order.IsSuccLimit c) :
                            a < b + c d < c, a < b + d

                            Alias of Ordinal.lt_add_iff_of_isSuccLimit.

                            theorem Ordinal.add_le_iff_of_isSuccLimit {a b c : Ordinal.{u_4}} (hb : Order.IsSuccLimit b) :
                            a + b c d < b, a + d c
                            @[deprecated Ordinal.add_le_iff_of_isSuccLimit (since := "2025-07-08")]
                            theorem Ordinal.add_le_of_limit {a b c : Ordinal.{u_4}} (hb : Order.IsSuccLimit b) :
                            a + b c d < b, a + d c

                            Alias of Ordinal.add_le_iff_of_isSuccLimit.

                            @[deprecated Ordinal.isSuccLimit_add (since := "2025-07-09")]

                            Alias of Ordinal.isSuccLimit_add.

                            @[deprecated Ordinal.isSuccLimit_add (since := "2025-07-09")]

                            Alias of Ordinal.isSuccLimit_add.

                            @[deprecated Ordinal.isSuccLimit_sub (since := "2025-07-09")]
                            theorem Ordinal.isLimit_sub {a b : Ordinal.{u_4}} (ha : Order.IsSuccLimit a) (h : b < a) :

                            Alias of Ordinal.isSuccLimit_sub.

                            Multiplication of ordinals #

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

                            Equations
                              @[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_iff_of_isSuccLimit {a b c : Ordinal.{u_4}} (h : Order.IsSuccLimit b) :
                              a * b c b' < b, a * b' c
                              @[deprecated Ordinal.mul_le_iff_of_isSuccLimit (since := "2025-07-09")]
                              theorem Ordinal.mul_le_of_limit {a b c : Ordinal.{u_4}} (h : Order.IsSuccLimit b) :
                              a * b c b' < b, a * b' c

                              Alias of Ordinal.mul_le_iff_of_isSuccLimit.

                              theorem Ordinal.isNormal_mul_right {a : Ordinal.{u_4}} (h : 0 < a) :
                              IsNormal fun (x : Ordinal.{u_4}) => a * x
                              theorem Ordinal.lt_mul_iff_of_isSuccLimit {a b c : Ordinal.{u_4}} (h : Order.IsSuccLimit c) :
                              a < b * c c' < c, a < b * c'
                              @[deprecated Ordinal.lt_mul_iff_of_isSuccLimit (since := "2025-07-09")]
                              theorem Ordinal.lt_mul_of_limit {a b c : Ordinal.{u_4}} (h : Order.IsSuccLimit c) :
                              a < b * c c' < c, a < b * c'

                              Alias of Ordinal.lt_mul_iff_of_isSuccLimit.

                              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 0b 0a * 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
                              @[deprecated Ordinal.isSuccLimit_mul (since := "2025-07-09")]

                              Alias of Ordinal.isSuccLimit_mul.

                              @[deprecated Ordinal.isSuccLimit_mul_left (since := "2025-07-09")]

                              Alias of Ordinal.isSuccLimit_mul_left.

                              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_of_isSuccLimit {a b c : Ordinal.{u_4}} (ba : b + a = a) (l : Order.IsSuccLimit c) :
                              (a + b) * c = a * c
                              @[deprecated Ordinal.add_mul_of_isSuccLimit (since := "2025-07-09")]
                              theorem Ordinal.add_mul_limit {a b c : Ordinal.{u_4}} (ba : b + a = a) (l : Order.IsSuccLimit c) :
                              (a + b) * c = a * c

                              Alias of Ordinal.add_mul_of_isSuccLimit.

                              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 / cc * 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
                                @[deprecated Ordinal.isSuccLimit_add_iff (since := "2025-07-09")]

                                Alias of Ordinal.isSuccLimit_add_iff.

                                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 0a ba * (b / a) = b
                                theorem Ordinal.le_of_dvd {a b : Ordinal.{u_4}} :
                                b 0a ba 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

                                  Properties of ω #

                                  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
                                  @[deprecated Ordinal.isSuccLimit_omega0 (since := "2025-07-09")]

                                  Alias of Ordinal.isSuccLimit_omega0.

                                  @[deprecated Ordinal.natCast_lt_of_isSuccLimit (since := "2025-07-09")]
                                  theorem Ordinal.nat_lt_limit {o : Ordinal.{u_4}} (h : Order.IsSuccLimit o) (n : ) :
                                  n < o

                                  Alias of Ordinal.natCast_lt_of_isSuccLimit.

                                  theorem Ordinal.omega0_le {o : Ordinal.{u_4}} :
                                  omega0 o ∀ (n : ), n o
                                  @[deprecated Ordinal.omega0_le_of_isSuccLimit (since := "2025-07-09")]

                                  Alias of Ordinal.omega0_le_of_isSuccLimit.

                                  @[simp]
                                  theorem Ordinal.natCast_add_of_omega0_le {o : Ordinal.{u_4}} (h : omega0 o) (n : ) :
                                  n + o = o
                                  @[simp]
                                  @[deprecated Ordinal.isSuccLimit_iff_omega0_dvd (since := "2025-07-09")]

                                  Alias of Ordinal.isSuccLimit_iff_omega0_dvd.

                                  @[simp]
                                  theorem Ordinal.natCast_mod_omega0 (n : ) :
                                  n % omega0 = n
                                  @[simp]
                                  @[deprecated Cardinal.isSuccLimit_ord (since := "2025-07-09")]

                                  Alias of Cardinal.isSuccLimit_ord.