Skip to content

Commit f77d227

Browse files
committed
feat(SetTheory/Ordinal/Veblen): epsilon and gamma ordinals (#17802)
We define the epsilon function `ε_ o = veblen 1 o`, and the gamma function `Γ_ o` which enumerates the fixed points of `veblen · 0`.
1 parent 2b3484b commit f77d227

File tree

2 files changed

+146
-7
lines changed

2 files changed

+146
-7
lines changed

Mathlib/SetTheory/Ordinal/FixedPoint.lean

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,11 @@ theorem nfp_id : nfp id = id := by
273273
theorem nfp_monotone (hf : Monotone f) : Monotone (nfp f) :=
274274
nfpFamily_monotone fun _ => hf
275275

276+
theorem iterate_lt_nfp (hf : StrictMono f) {a} (h : a < f a) (n : ℕ) : f^[n] a < nfp f a := by
277+
apply (hf.iterate n h).trans_le
278+
rw [← iterate_succ_apply]
279+
exact iterate_le_nfp ..
280+
276281
theorem IsNormal.apply_lt_nfp (H : IsNormal f) {a b} : f b < nfp f a ↔ b < nfp f a := by
277282
unfold nfp
278283
rw [← @apply_lt_nfpFamily_iff Unit (fun _ => f) _ _ (fun _ => H) a b]

Mathlib/SetTheory/Ordinal/Veblen.lean

Lines changed: 141 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,32 @@ import Mathlib.SetTheory.Ordinal.FixedPoint
1111
We 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

2736
noncomputable section
2837

38+
open Order
39+
2940
universe u
3041

3142
namespace 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

174185
theorem cmp_veblenWith :
@@ -244,7 +255,7 @@ theorem isNormal_veblen (o : Ordinal) : IsNormal (veblen o) :=
244255
theorem 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

250261
theorem 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

333344
end 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+
334468
end Ordinal

0 commit comments

Comments
 (0)