Documentation

Mathlib.SetTheory.Ordinal.Veblen

Veblen hierarchy #

We define the two-arguments Veblen function, which satisfies veblen 0 a = ω ^ a and that for o ≠ 0, veblen o enumerates the common fixed points of veblen o' for o' < o.

We use this to define two important functions on ordinals: the epsilon function ε_ o = veblen 1 o, and the gamma function Γ_ o enumerating the fixed points of veblen · 0.

Main definitions #

Notation #

The following notation is scoped to the Ordinal namespace.

TODO #

References #

Veblen function with a given starting function #

@[irreducible]

veblenWith f o is the o-th function in the Veblen hierarchy starting with f. This is defined so that

Equations
    Instances For

      veblenWith f o is always normal for o ≠ 0. See isNormal_veblenWith for a version which assumes IsNormal f.

      veblenWith f o is always normal whenever f is. See isNormal_veblenWith' for a version which does not assume IsNormal f.

      @[deprecated Ordinal.isNormal_veblenWith (since := "2025-12-25")]

      Alias of Ordinal.isNormal_veblenWith.


      veblenWith f o is always normal whenever f is. See isNormal_veblenWith' for a version which does not assume IsNormal f.

      theorem Ordinal.veblenWith_veblenWith_of_lt {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ : Ordinal.{u}} (hf : Order.IsNormal f) (h : o₁ < o₂) (a : Ordinal.{u}) :
      veblenWith f o₁ (veblenWith f o₂ a) = veblenWith f o₂ a
      theorem Ordinal.veblenWith_eq_self_of_le {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ a : Ordinal.{u}} (hf : Order.IsNormal f) (h : o₁ o₂) (h' : veblenWith f o₂ a = a) :
      veblenWith f o₁ a = a
      theorem Ordinal.veblenWith_zero_lt_veblenWith_zero {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ : Ordinal.{u}} (hf : Order.IsNormal f) (hp : 0 < f 0) :
      veblenWith f o₁ 0 < veblenWith f o₂ 0 o₁ < o₂
      theorem Ordinal.veblenWith_zero_le_veblenWith_zero {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ : Ordinal.{u}} (hf : Order.IsNormal f) (hp : 0 < f 0) :
      veblenWith f o₁ 0 veblenWith f o₂ 0 o₁ o₂
      theorem Ordinal.veblenWith_zero_inj {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ : Ordinal.{u}} (hf : Order.IsNormal f) (hp : 0 < f 0) :
      veblenWith f o₁ 0 = veblenWith f o₂ 0 o₁ = o₂
      @[deprecated Ordinal.isNormal_veblenWith_zero (since := "2025-12-25")]

      Alias of Ordinal.isNormal_veblenWith_zero.

      theorem Ordinal.veblenWith_veblenWith_eq_veblenWith_iff {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ a : Ordinal.{u}} (hf : Order.IsNormal f) (h : o₂ o₁) :
      veblenWith f o₁ (veblenWith f o₂ a) = veblenWith f o₂ a veblenWith f o₁ a = a
      theorem Ordinal.veblenWith_lt_veblenWith_veblenWith_iff {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ a : Ordinal.{u}} (hf : Order.IsNormal f) (h : o₂ o₁) :
      veblenWith f o₂ a < veblenWith f o₁ (veblenWith f o₂ a) a < veblenWith f o₁ a
      theorem Ordinal.cmp_veblenWith {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ a b : Ordinal.{u}} (hf : Order.IsNormal f) :
      cmp (veblenWith f o₁ a) (veblenWith f o₂ b) = match cmp o₁ o₂ with | Ordering.eq => cmp a b | Ordering.lt => cmp a (veblenWith f o₂ b) | Ordering.gt => cmp (veblenWith f o₁ a) b
      theorem Ordinal.veblenWith_lt_veblenWith_iff {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ a b : Ordinal.{u}} (hf : Order.IsNormal f) :
      veblenWith f o₁ a < veblenWith f o₂ b o₁ = o₂ a < b o₁ < o₂ a < veblenWith f o₂ b o₂ < o₁ veblenWith f o₁ a < b

      veblenWith f o₁ a < veblenWith f o₂ b iff one of the following holds:

      theorem Ordinal.veblenWith_le_veblenWith_iff {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ a b : Ordinal.{u}} (hf : Order.IsNormal f) :
      veblenWith f o₁ a veblenWith f o₂ b o₁ = o₂ a b o₁ < o₂ a veblenWith f o₂ b o₂ < o₁ veblenWith f o₁ a b

      veblenWith f o₁ a ≤ veblenWith f o₂ b iff one of the following holds:

      • o₁ = o₂ and a ≤ b
      • o₁ < o₂ and a ≤ veblenWith f o₂ b
      • o₁ > o₂ and veblenWith f o₁ a ≤ b
      theorem Ordinal.veblenWith_eq_veblenWith_iff {f : Ordinal.{u}Ordinal.{u}} {o₁ o₂ a b : Ordinal.{u}} (hf : Order.IsNormal f) :
      veblenWith f o₁ a = veblenWith f o₂ b o₁ = o₂ a = b o₁ < o₂ a = veblenWith f o₂ b o₂ < o₁ veblenWith f o₁ a = b

      veblenWith f o₁ a = veblenWith f o₂ b iff one of the following holds:

      Veblen function #

      veblen o is the o-th function in the Veblen hierarchy starting with ω ^ ·. That is:

      • veblen 0 a = ω ^ a.
      • veblen o for o ≠ 0 enumerates the fixed points of veblen o' for o' < o.
      Equations
        Instances For
          theorem Ordinal.veblen_of_ne_zero {o : Ordinal.{u}} (h : o 0) :
          veblen o = derivFamily fun (x : (Set.Iio o)) => veblen x
          theorem Ordinal.mem_range_veblen {o a : Ordinal.{u}} (h : o 0) :
          a Set.range (veblen o) b < o, veblen b a = a
          theorem Ordinal.veblen_veblen_of_lt {o₁ o₂ : Ordinal.{u}} (h : o₁ < o₂) (a : Ordinal.{u}) :
          veblen o₁ (veblen o₂ a) = veblen o₂ a
          theorem Ordinal.veblen_eq_self_of_le {o₁ o₂ a : Ordinal.{u}} (h : o₁ o₂) (h' : veblen o₂ a = a) :
          veblen o₁ a = a
          @[simp]
          theorem Ordinal.veblen_inj {o a b : Ordinal.{u}} :
          veblen o a = veblen o b a = b
          @[simp]
          theorem Ordinal.veblen_zero_lt_veblen_zero {o₁ o₂ : Ordinal.{u}} :
          veblen o₁ 0 < veblen o₂ 0 o₁ < o₂
          @[simp]
          theorem Ordinal.veblen_zero_le_veblen_zero {o₁ o₂ : Ordinal.{u}} :
          veblen o₁ 0 veblen o₂ 0 o₁ o₂
          @[simp]
          theorem Ordinal.veblen_zero_inj {o₁ o₂ : Ordinal.{u}} :
          veblen o₁ 0 = veblen o₂ 0 o₁ = o₂
          theorem Ordinal.veblen_veblen_eq_veblen_iff {o₁ o₂ a : Ordinal.{u}} (h : o₂ o₁) :
          veblen o₁ (veblen o₂ a) = veblen o₂ a veblen o₁ a = a
          theorem Ordinal.veblen_lt_veblen_veblen_iff {o₁ o₂ a : Ordinal.{u}} (h : o₂ o₁) :
          veblen o₂ a < veblen o₁ (veblen o₂ a) a < veblen o₁ a
          theorem Ordinal.cmp_veblen {o₁ o₂ a b : Ordinal.{u}} :
          cmp (veblen o₁ a) (veblen o₂ b) = match cmp o₁ o₂ with | Ordering.eq => cmp a b | Ordering.lt => cmp a (veblen o₂ b) | Ordering.gt => cmp (veblen o₁ a) b
          theorem Ordinal.veblen_lt_veblen_iff {o₁ o₂ a b : Ordinal.{u}} :
          veblen o₁ a < veblen o₂ b o₁ = o₂ a < b o₁ < o₂ a < veblen o₂ b o₂ < o₁ veblen o₁ a < b

          veblen o₁ a < veblen o₂ b iff one of the following holds:

          • o₁ = o₂ and a < b
          • o₁ < o₂ and a < veblen o₂ b
          • o₁ > o₂ and veblen o₁ a < b
          theorem Ordinal.veblen_le_veblen_iff {o₁ o₂ a b : Ordinal.{u}} :
          veblen o₁ a veblen o₂ b o₁ = o₂ a b o₁ < o₂ a veblen o₂ b o₂ < o₁ veblen o₁ a b

          veblen o₁ a ≤ veblen o₂ b iff one of the following holds:

          • o₁ = o₂ and a ≤ b
          • o₁ < o₂ and a ≤ veblen o₂ b
          • o₁ > o₂ and veblen o₁ a ≤ b
          theorem Ordinal.veblen_eq_veblen_iff {o₁ o₂ a b : Ordinal.{u}} :
          veblen o₁ a = veblen o₂ b o₁ = o₂ a = b o₁ < o₂ a = veblen o₂ b o₂ < o₁ veblen o₁ a = b

          veblen o₁ a ≤ veblen o₂ b iff one of the following holds:

          • o₁ = o₂ and a = b
          • o₁ < o₂ and a = veblen o₂ b
          • o₁ > o₂ and veblen o₁ a = b

          Inverse Veblen function #

          For any given x, there exists a unique pair (o, a) such that ω ^ x = veblen o a and a < ω ^ x. invVeblen₁ x and invVeblen₂ x return the first and second entries of this pair, respectively. See veblen_eq_opow_iff for a proof.

          Composing this function with Ordinal.CNF yields a predicative ordinal notation up to Γ₀.

          Equations
            Instances For

              For any given x, there exists a unique pair (o, a) such that ω ^ x = veblen o a and a < ω ^ x. invVeblen₁ x and invVeblen₂ x return the first and second entries of this pair, respectively. See veblen_eq_opow_iff for a proof.

              Composing this function with Ordinal.CNF yields a predicative ordinal notation up to Γ₀.

              Equations
                Instances For

                  Epsilon function #

                  @[reducible, inline]

                  The epsilon function enumerates the fixed points of ω ^ ⬝. This is an abbreviation for veblen 1.

                  Conventions for notations in identifiers:

                  • The recommended spelling of ε_ in identifiers is epsilon.
                  Equations
                    Instances For

                      The epsilon function enumerates the fixed points of ω ^ ⬝. This is an abbreviation for veblen 1.

                      Conventions for notations in identifiers:

                      • The recommended spelling of ε_ in identifiers is epsilon.
                      Equations
                        Instances For

                          ε₀ is the first fixed point of ω ^ ⬝, i.e. the supremum of ω, ω ^ ω, ω ^ ω ^ ω, …

                          Conventions for notations in identifiers:

                          • The recommended spelling of ε₀ in identifiers is epsilon_zero.
                          Equations
                            Instances For
                              @[deprecated Ordinal.epsilon_zero_eq_nfp (since := "2026-02-02")]
                              theorem Ordinal.epsilon0_eq_nfp :
                              epsilon 0 = nfp (fun (a : Ordinal.{u_1}) => omega0 ^ a) 0

                              Alias of Ordinal.epsilon_zero_eq_nfp.

                              @[deprecated Ordinal.epsilon_zero_le_of_omega0_opow_le (since := "2026-02-02")]

                              Alias of Ordinal.epsilon_zero_le_of_omega0_opow_le.

                              theorem Ordinal.lt_epsilon_zero {o : Ordinal.{u}} :
                              o < epsilon 0 ∃ (n : ), o < (fun (a : Ordinal.{u}) => omega0 ^ a)^[n] 0

                              ε₀ is the limit of 0, ω ^ 0, ω ^ ω ^ 0, …

                              @[deprecated Ordinal.lt_epsilon_zero (since := "2026-02-02")]
                              theorem Ordinal.lt_epsilon0 {o : Ordinal.{u}} :
                              o < epsilon 0 ∃ (n : ), o < (fun (a : Ordinal.{u}) => omega0 ^ a)^[n] 0

                              Alias of Ordinal.lt_epsilon_zero.


                              ε₀ is the limit of 0, ω ^ 0, ω ^ ω ^ 0, …

                              ω ^ ω ^ … ^ 0 < ε₀

                              @[deprecated Ordinal.iterate_omega0_opow_lt_epsilon_zero (since := "2026-02-02")]

                              Alias of Ordinal.iterate_omega0_opow_lt_epsilon_zero.


                              ω ^ ω ^ … ^ 0 < ε₀

                              Gamma function #

                              The gamma function enumerates the fixed points of veblen · 0.

                              Of particular importance is Γ₀ = gamma 0, the Feferman-Schütte ordinal.

                              Conventions for notations in identifiers:

                              • The recommended spelling of Γ_ in identifiers is gamma.
                              Equations
                                Instances For

                                  The gamma function enumerates the fixed points of veblen · 0.

                                  Of particular importance is Γ₀ = gamma 0, the Feferman-Schütte ordinal.

                                  Conventions for notations in identifiers:

                                  • The recommended spelling of Γ_ in identifiers is gamma.
                                  Equations
                                    Instances For

                                      The Feferman-Schütte ordinal Γ₀ is the smallest fixed point of veblen · 0, i.e. the supremum of veblen ε₀ 0, veblen (veblen ε₀ 0) 0, etc.

                                      Conventions for notations in identifiers:

                                      • The recommended spelling of Γ₀ in identifiers is gamma_zero.
                                      Equations
                                        Instances For
                                          @[deprecated Ordinal.gamma_zero_eq_nfp (since := "2026-02-02")]
                                          theorem Ordinal.gamma0_eq_nfp :
                                          gamma 0 = nfp (fun (x : Ordinal.{u_1}) => veblen x 0) 0

                                          Alias of Ordinal.gamma_zero_eq_nfp.

                                          @[deprecated Ordinal.gamma_zero_le_of_veblen_le (since := "2026-02-02")]

                                          Alias of Ordinal.gamma_zero_le_of_veblen_le.

                                          theorem Ordinal.lt_gamma_zero {o : Ordinal.{u}} :
                                          o < gamma 0 ∃ (n : ), o < (fun (a : Ordinal.{u}) => veblen a 0)^[n] 0

                                          Γ₀ is the limit of 0, veblen 0 0, veblen (veblen 0 0) 0, …

                                          @[deprecated Ordinal.lt_gamma_zero (since := "2026-02-02")]
                                          theorem Ordinal.lt_gamma0 {o : Ordinal.{u}} :
                                          o < gamma 0 ∃ (n : ), o < (fun (a : Ordinal.{u}) => veblen a 0)^[n] 0

                                          Alias of Ordinal.lt_gamma_zero.


                                          Γ₀ is the limit of 0, veblen 0 0, veblen (veblen 0 0) 0, …

                                          veblen (veblen … (veblen 0 0) … 0) 0 < Γ₀

                                          @[deprecated Ordinal.iterate_veblen_lt_gamma_zero (since := "2026-02-02")]
                                          theorem Ordinal.iterate_veblen_lt_gamma0 (n : ) :
                                          (fun (a : Ordinal.{u_1}) => veblen a 0)^[n] 0 < gamma 0

                                          Alias of Ordinal.iterate_veblen_lt_gamma_zero.


                                          veblen (veblen … (veblen 0 0) … 0) 0 < Γ₀

                                          @[deprecated Ordinal.epsilon_zero_lt_gamma (since := "2026-02-02")]

                                          Alias of Ordinal.epsilon_zero_lt_gamma.