@@ -11,21 +11,32 @@ import Mathlib.SetTheory.Ordinal.FixedPoint
1111We define the two-arguments Veblen function, which satisfies `veblen 0 a = ω ^ a` and that for
1212`o ≠ 0`, `veblen o` enumerates the common fixed points of `veblen o'` for `o' < o`.
1313
14+ We use this to define two important functions on ordinals: the epsilon function `ε_ o = veblen 1 o`,
15+ and the gamma function `Γ_ o` enumerating the fixed points of `veblen · 0`.
16+
1417## Main definitions
1518
1619* `veblenWith`: The Veblen hierarchy with a specified initial function.
1720* `veblen`: The Veblen hierarchy starting with `ω ^ ·`.
1821
22+ ## Notation
23+
24+ The following notation is scoped to the `Ordinal` namespace.
25+
26+ - `ε_ o` is notation for `veblen 1 o`. `ε₀` is notation for `ε_ 0`.
27+ - `Γ_ o` is notation for `gamma o`. `Γ₀` is notation for `Γ_ 0`.
28+
1929 ## TODO
2030
21- - Define the epsilon numbers and gamma numbers.
2231- Prove that `ε₀` and `Γ₀` are countable.
2332- Prove that the exponential principal ordinals are the epsilon ordinals (and 0, 1, 2, ω).
2433- Prove that the ordinals principal under `veblen` are the gamma ordinals (and 0).
2534 -/
2635
2736noncomputable section
2837
38+ open Order
39+
2940universe u
3041
3142namespace Ordinal
@@ -81,15 +92,15 @@ theorem veblenWith_veblenWith_of_lt (h : o₁ < o₂) (a : Ordinal) :
8192 derivFamily_fp (f := fun y : Set.Iio o₂ ↦ veblenWith f y.1 ) (i := x)]
8293 exact hf.veblenWith x
8394
84- theorem veblenWith_succ (o : Ordinal) : veblenWith f (Order. succ o) = deriv (veblenWith f o) := by
95+ theorem veblenWith_succ (o : Ordinal) : veblenWith f (succ o) = deriv (veblenWith f o) := by
8596 rw [deriv_eq_enumOrd (hf.veblenWith o), veblenWith_of_ne_zero f (succ_ne_zero _),
8697 derivFamily_eq_enumOrd]
8798 · apply congr_arg
8899 ext a
89100 rw [Set.mem_iInter]
90- use fun ha ↦ ha ⟨o, Order. lt_succ o⟩
101+ use fun ha ↦ ha ⟨o, lt_succ o⟩
91102 rintro (ha : _ = _) ⟨b, hb : b < _⟩
92- obtain rfl | hb := Order. lt_succ_iff_eq_or_lt.1 hb
103+ obtain rfl | hb := lt_succ_iff_eq_or_lt.1 hb
93104 · rw [Function.mem_fixedPoints_iff, ha]
94105 · rw [← ha]
95106 exact veblenWith_veblenWith_of_lt hf hb _
@@ -166,9 +177,9 @@ theorem IsNormal.veblenWith_zero (hp : 0 < f 0) : IsNormal (veblenWith f · 0) :
166177 obtain ⟨b, hb, hb'⟩ := IH
167178 refine ⟨_, ho.succ_lt (max_lt a.2 hb), ((veblenWith_right_strictMono hf _).monotone <|
168179 hb'.trans <| veblenWith_left_monotone hf _ <|
169- (le_max_right a.1 b).trans (Order. le_succ _)).trans ?_⟩
180+ (le_max_right a.1 b).trans (le_succ _)).trans ?_⟩
170181 rw [veblenWith_veblenWith_of_lt hf]
171- rw [Order. lt_succ_iff]
182+ rw [lt_succ_iff]
172183 exact le_max_left _ b
173184
174185theorem cmp_veblenWith :
@@ -244,7 +255,7 @@ theorem isNormal_veblen (o : Ordinal) : IsNormal (veblen o) :=
244255theorem veblen_veblen_of_lt (h : o₁ < o₂) (a : Ordinal) : veblen o₁ (veblen o₂ a) = veblen o₂ a :=
245256 veblenWith_veblenWith_of_lt (isNormal_opow one_lt_omega0) h a
246257
247- theorem veblen_succ (o : Ordinal) : veblen (Order. succ o) = deriv (veblen o) :=
258+ theorem veblen_succ (o : Ordinal) : veblen (succ o) = deriv (veblen o) :=
248259 veblenWith_succ (isNormal_opow one_lt_omega0) o
249260
250261theorem veblen_right_strictMono (o : Ordinal) : StrictMono (veblen o) :=
@@ -331,4 +342,127 @@ theorem veblen_eq_veblen_iff :
331342 veblenWith_eq_veblenWith_iff (isNormal_opow one_lt_omega0)
332343
333344end veblen
345+
346+ /-! ### Epsilon function -/
347+
348+ /-- The epsilon function enumerates the fixed points of `ω ^ ⬝`.
349+ This is an abbreviation for `veblen 1`. -/
350+ abbrev epsilon := veblen 1
351+
352+ @[inherit_doc] scoped notation "ε_ " => epsilon
353+
354+ /-- `ε₀` is the first fixed point of `ω ^ ⬝`, i.e. the supremum of `ω`, `ω ^ ω`, `ω ^ ω ^ ω`, … -/
355+ scoped notation "ε₀" => ε_ 0
356+
357+ theorem epsilon_eq_deriv (o : Ordinal) : ε_ o = deriv (fun a ↦ ω ^ a) o := by
358+ rw [epsilon, ← succ_zero, veblen_succ, veblen_zero]
359+
360+ theorem epsilon0_eq_nfp : ε₀ = nfp (fun a ↦ ω ^ a) 0 := by
361+ rw [epsilon_eq_deriv, deriv_zero_right]
362+
363+ theorem epsilon_succ_eq_nfp (o : Ordinal) : ε_ (succ o) = nfp (fun a ↦ ω ^ a) (succ (ε_ o)) := by
364+ rw [epsilon_eq_deriv, epsilon_eq_deriv, deriv_succ]
365+
366+ theorem epsilon0_le_of_omega0_opow_le (h : ω ^ o ≤ o) : ε₀ ≤ o := by
367+ rw [epsilon0_eq_nfp]
368+ exact nfp_le_fp (fun _ _ ↦ (opow_le_opow_iff_right one_lt_omega0).2 ) (Ordinal.zero_le o) h
369+
370+ @[simp]
371+ theorem omega0_opow_epsilon (o : Ordinal) : ω ^ ε_ o = ε_ o := by
372+ rw [epsilon_eq_deriv, (isNormal_opow one_lt_omega0).deriv_fp]
373+
374+ /-- `ε₀` is the limit of `0`, `ω ^ 0`, `ω ^ ω ^ 0`, … -/
375+ theorem lt_epsilon0 : o < ε₀ ↔ ∃ n : ℕ, o < (fun a ↦ ω ^ a)^[n] 0 := by
376+ rw [epsilon0_eq_nfp, lt_nfp_iff]
377+
378+ /-- `ω ^ ω ^ … ^ 0 < ε₀` -/
379+ theorem iterate_omega0_opow_lt_epsilon0 (n : ℕ) : (fun a ↦ ω ^ a)^[n] 0 < ε₀ := by
380+ rw [epsilon0_eq_nfp]
381+ apply iterate_lt_nfp (isNormal_opow one_lt_omega0).strictMono
382+ simp
383+
384+ theorem omega0_lt_epsilon (o : Ordinal) : ω < ε_ o := by
385+ apply lt_of_lt_of_le _ <| (veblen_right_strictMono _).monotone (Ordinal.zero_le o)
386+ simpa using iterate_omega0_opow_lt_epsilon0 2
387+
388+ theorem natCast_lt_epsilon (n : ℕ) (o : Ordinal) : n < ε_ o :=
389+ (nat_lt_omega0 n).trans <| omega0_lt_epsilon o
390+
391+ theorem epsilon_pos (o : Ordinal) : 0 < ε_ o :=
392+ veblen_pos
393+
394+ /-! ### Gamma function -/
395+
396+ /-- The gamma function enumerates the fixed points of `veblen · 0`.
397+
398+ Of particular importance is `Γ₀ = gamma 0`, the Feferman-Schütte ordinal. -/
399+ def gamma (o : Ordinal) : Ordinal :=
400+ deriv (veblen · 0 ) o
401+
402+ @[inherit_doc]
403+ scoped notation "Γ_ " => gamma
404+
405+ /-- The Feferman-Schütte ordinal `Γ₀` is the smallest fixed point of `veblen · 0`, i.e. the supremum
406+ of `veblen ε₀ 0`, `veblen (veblen ε₀ 0) 0`, etc. -/
407+ scoped notation "Γ₀" => Γ_ 0
408+
409+ theorem isNormal_gamma : IsNormal gamma :=
410+ isNormal_deriv _
411+
412+ theorem strictMono_gamma : StrictMono gamma :=
413+ isNormal_gamma.strictMono
414+
415+ theorem monotone_gamma : Monotone gamma :=
416+ isNormal_gamma.monotone
417+
418+ @[simp]
419+ theorem gamma_lt_gamma : Γ_ a < Γ_ b ↔ a < b :=
420+ strictMono_gamma.lt_iff_lt
421+
422+ @[simp]
423+ theorem gamma_le_gamma : Γ_ a ≤ Γ_ b ↔ a ≤ b :=
424+ strictMono_gamma.le_iff_le
425+
426+ @[simp]
427+ theorem gamma_inj : Γ_ a = Γ_ b ↔ a = b :=
428+ strictMono_gamma.injective.eq_iff
429+
430+ @[simp]
431+ theorem veblen_gamma_zero (o : Ordinal) : veblen (Γ_ o) 0 = Γ_ o :=
432+ isNormal_veblen_zero.deriv_fp o
433+
434+ theorem gamma0_eq_nfp : Γ₀ = nfp (veblen · 0 ) 0 :=
435+ deriv_zero_right _
436+
437+ theorem gamma_succ_eq_nfp (o : Ordinal) : Γ_ (succ o) = nfp (veblen · 0 ) (succ (Γ_ o)) :=
438+ deriv_succ _ _
439+
440+ theorem gamma0_le_of_veblen_le (h : veblen o 0 ≤ o) : Γ₀ ≤ o := by
441+ rw [gamma0_eq_nfp]
442+ exact nfp_le_fp (veblen_left_monotone 0 ) (Ordinal.zero_le o) h
443+
444+ /-- `Γ₀` is the limit of `0`, `veblen 0 0`, `veblen (veblen 0 0) 0`, … -/
445+ theorem lt_gamma0 : o < Γ₀ ↔ ∃ n : ℕ, o < (fun a ↦ veblen a 0 )^[n] 0 := by
446+ rw [gamma0_eq_nfp, lt_nfp_iff]
447+
448+ /-- `veblen (veblen … (veblen 0 0) … 0) 0 < Γ₀` -/
449+ theorem iterate_veblen_lt_gamma0 (n : ℕ) : (fun a ↦ veblen a 0 )^[n] 0 < Γ₀ := by
450+ rw [gamma0_eq_nfp]
451+ apply iterate_lt_nfp veblen_zero_strictMono
452+ simp
453+
454+ theorem epsilon0_lt_gamma (o : Ordinal) : ε₀ < Γ_ o := by
455+ apply lt_of_lt_of_le _ <| (gamma_le_gamma.2 (Ordinal.zero_le _))
456+ simpa using iterate_veblen_lt_gamma0 2
457+
458+ theorem omega0_lt_gamma (o : Ordinal) : ω < Γ_ o :=
459+ (omega0_lt_epsilon 0 ).trans (epsilon0_lt_gamma o)
460+
461+ theorem natCast_lt_gamma (n : ℕ) : n < Γ_ o :=
462+ (nat_lt_omega0 n).trans (omega0_lt_gamma o)
463+
464+ @[simp]
465+ theorem gamma_pos : 0 < Γ_ o :=
466+ natCast_lt_gamma 0
467+
334468end Ordinal
0 commit comments