Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit 196a48c

Browse files
committed
feat(set_theory/ordinal_arithmetic): Coefficients of Cantor Normal Form (#12681)
We prove all coefficients of the base-b expansion of an ordinal are less than `b`. We also tweak the parameters of various other theorems.
1 parent a3c753c commit 196a48c

File tree

1 file changed

+33
-18
lines changed

1 file changed

+33
-18
lines changed

src/set_theory/ordinal_arithmetic.lean

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2111,7 +2111,7 @@ by rw [CNF_rec, dif_neg o0]
21112111
base-`b` expansion of `o`.
21122112
21132113
`CNF b (b ^ u₁ * v₁ + b ^ u₂ * v₂) = [(u₁, v₁), (u₂, v₂)]` -/
2114-
def CNF (b := omega) (o : ordinal) : list (ordinal × ordinal) :=
2114+
def CNF (b o : ordinal) : list (ordinal × ordinal) :=
21152115
if b0 : b = 0 then [] else
21162116
CNF_rec b0 [] (λ o o0 IH, (log b o, o / b ^ log b o) :: IH) o
21172117

@@ -2125,8 +2125,7 @@ theorem CNF_ne_zero {b o : ordinal} (b0 : b ≠ 0) (o0 : o ≠ 0) :
21252125
CNF b o = (log b o, o / b ^ log b o) :: CNF b (o % b ^ log b o) :=
21262126
by unfold CNF; rw [dif_neg b0, dif_neg b0, CNF_rec_ne_zero b0 o0]
21272127

2128-
@[simp] theorem one_CNF {o : ordinal} (o0 : o ≠ 0) :
2129-
CNF 1 o = [(0, o)] :=
2128+
@[simp] theorem one_CNF {o : ordinal} (o0 : o ≠ 0) : CNF 1 o = [(0, o)] :=
21302129
by rw [CNF_ne_zero ordinal.one_ne_zero o0, log_not_one_lt (lt_irrefl _), opow_zero, mod_one,
21312130
CNF_zero, div_one]
21322131

@@ -2135,8 +2134,10 @@ theorem CNF_foldr {b : ordinal} (b0 : b ≠ 0) (o) :
21352134
CNF_rec b0 (by rw CNF_zero; refl)
21362135
(λ o o0 IH, by rw [CNF_ne_zero b0 o0, list.foldr_cons, IH, div_add_mod]) o
21372136

2138-
private theorem CNF_pairwise_aux (b := omega) (o) :
2139-
(∀ p ∈ CNF b o, prod.fst p ≤ log b o) ∧ (CNF b o).pairwise (λ p q, q.1 < p.1) :=
2137+
/-- This theorem exists to factor out commonalities between the proofs of `ordinal.CNF_pairwise` and
2138+
`ordinal.CNF_fst_le_log`. -/
2139+
private theorem CNF_pairwise_aux (b o : ordinal.{u}) :
2140+
(∀ p : ordinal × ordinal, p ∈ CNF b o → p.1 ≤ log b o) ∧ (CNF b o).pairwise (λ p q, q.1 < p.1) :=
21402141
begin
21412142
by_cases b0 : b = 0,
21422143
{ simp only [b0, zero_CNF, list.pairwise.nil, and_true], exact λ _, false.elim },
@@ -2158,27 +2159,41 @@ begin
21582159
list.pairwise_singleton] }
21592160
end
21602161

2161-
theorem CNF_pairwise (b := omega) (o) : (CNF b o).pairwise (λ p q, prod.fst q < p.1) :=
2162+
theorem CNF_pairwise (b o : ordinal.{u}) :
2163+
(CNF b o).pairwise (λ p q : ordinal × ordinal, q.1 < p.1) :=
21622164
(CNF_pairwise_aux _ _).2
21632165

2164-
theorem CNF_fst_le_log (b := omega) (o) : ∀ p ∈ CNF b o, prod.fst p ≤ log b o :=
2166+
theorem CNF_fst_le_log {b o : ordinal.{u}} :
2167+
∀ {p : ordinal × ordinal}, p ∈ CNF b o → p.1 ≤ log b o :=
21652168
(CNF_pairwise_aux _ _).1
21662169

2167-
theorem CNF_fst_le (b := omega) (o) (p ∈ CNF b o) : prod.fst p ≤ o :=
2168-
le_trans (CNF_fst_le_log _ _ p H) (log_le_self _ _)
2170+
theorem CNF_fst_le {b o : ordinal.{u}} {p : ordinal × ordinal} (hp : p ∈ CNF b o) : p.1 ≤ o :=
2171+
(CNF_fst_le_log hp).trans (log_le_self _ _)
21692172

2170-
theorem CNF_snd_lt {b : ordinal} (b1 : 1 < b) (o) : ∀ p ∈ CNF b o, prod.snd p < b :=
2173+
/-- This theorem exists to factor out commonalities between the proofs of `ordinal.CNF_snd_lt` and
2174+
`ordinal.CNF_lt_snd`. -/
2175+
private theorem CNF_snd_lt_aux {b o : ordinal.{u}} (b1 : 1 < b) :
2176+
∀ {p : ordinal × ordinal}, p ∈ CNF b o → p.2 < b ∧ 0 < p.2 :=
21712177
begin
2172-
have b0 := ne_of_gt (lt_trans zero_lt_one b1),
2173-
refine CNF_rec b0 (λ _, by rw [CNF_zero]; exact false.elim) _ o,
2174-
intros o o0 IH,
2175-
simp only [CNF_ne_zero b0 o0, list.mem_cons_iff, forall_eq_or_imp, iff_true_intro IH, and_true],
2176-
rw [div_lt (opow_ne_zero _ b0), ← opow_succ],
2177-
exact lt_opow_succ_log b1 _,
2178+
have b0 := (zero_lt_one.trans b1).ne',
2179+
refine CNF_rec b0 (λ _, by { rw CNF_zero, exact false.elim }) (λ o o0 IH, _) o,
2180+
simp only [CNF_ne_zero b0 o0, list.mem_cons_iff, forall_eq_or_imp, iff_true_intro @IH, and_true],
2181+
nth_rewrite 1 ←succ_le,
2182+
rw [div_lt (opow_ne_zero _ b0), ←opow_succ, le_div (opow_ne_zero _ b0), succ_zero, mul_one],
2183+
refine ⟨lt_opow_succ_log b1 _, opow_log_le _ _⟩,
2184+
rwa ordinal.pos_iff_ne_zero
21782185
end
21792186

2180-
theorem CNF_sorted (b := omega) (o) : ((CNF b o).map prod.fst).sorted (>) :=
2181-
by rw [list.sorted, list.pairwise_map]; exact CNF_pairwise b o
2187+
theorem CNF_snd_lt {b o : ordinal.{u}} (b1 : 1 < b) {p : ordinal × ordinal} (hp : p ∈ CNF b o) :
2188+
p.2 < b :=
2189+
(CNF_snd_lt_aux b1 hp).1
2190+
2191+
theorem CNF_lt_snd {b o : ordinal.{u}} (b1 : 1 < b) {p : ordinal × ordinal} (hp : p ∈ CNF b o) :
2192+
0 < p.2 :=
2193+
(CNF_snd_lt_aux b1 hp).2
2194+
2195+
theorem CNF_sorted (b o : ordinal) : ((CNF b o).map prod.fst).sorted (>) :=
2196+
by { rw [list.sorted, list.pairwise_map], exact CNF_pairwise b o }
21822197

21832198
/-! ### Casting naturals into ordinals, compatibility with operations -/
21842199

0 commit comments

Comments
 (0)