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

Commit 53ab3a5

Browse files
committed
feat(set_theory/ordinal/arithmetic): generalize mod_opow_log_lt_self (#15448)
We remove the assumption `b ≠ 0` from `ordinal.mod_opow_log_lt_self`, and from other theorems/definitions that depended on it.
1 parent 997fa57 commit 53ab3a5

File tree

2 files changed

+18
-15
lines changed

2 files changed

+18
-15
lines changed

src/set_theory/ordinal/arithmetic.lean

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2097,8 +2097,12 @@ else by simp only [log_of_not_one_lt_left hb, ordinal.zero_le]
20972097
@[simp] theorem log_one_right (b : ordinal) : log b 1 = 0 :=
20982098
if hb : 1 < b then log_eq_zero hb else log_of_not_one_lt_left hb 1
20992099

2100-
theorem mod_opow_log_lt_self {b o : ordinal} (hb : b ≠ 0) (ho : o ≠ 0) : o % b ^ log b o < o :=
2101-
(mod_lt _ $ opow_ne_zero _ hb).trans_le (opow_log_le_self _ ho)
2100+
theorem mod_opow_log_lt_self (b : ordinal) {o : ordinal} (ho : o ≠ 0) : o % b ^ log b o < o :=
2101+
begin
2102+
rcases eq_or_ne b 0 with rfl | hb,
2103+
{ simpa using ordinal.pos_iff_ne_zero.2 ho },
2104+
{ exact (mod_lt _ $ opow_ne_zero _ hb).trans_le (opow_log_le_self _ ho) }
2105+
end
21022106

21032107
theorem log_mod_opow_log_lt_log_self {b o : ordinal} (hb : 1 < b) (ho : o ≠ 0) (hbo : b ≤ o) :
21042108
log b (o % b ^ log b o) < log b o :=

src/set_theory/ordinal/cantor_normal_form.lean

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,18 @@ open order
3737
namespace ordinal
3838

3939
/-- Inducts on the base `b` expansion of an ordinal. -/
40-
@[elab_as_eliminator] noncomputable def CNF_rec {b : ordinal} (hb : b ≠ 0)
40+
@[elab_as_eliminator] noncomputable def CNF_rec (b : ordinal)
4141
{C : ordinal → Sort*} (H0 : C 0) (H : ∀ o, o ≠ 0 → C (o % b ^ log b o) → C o) : ∀ o, C o
4242
| o :=
4343
if ho : o = 0 then by rwa ho else
44-
have _, from mod_opow_log_lt_self hb ho,
45-
H o ho (CNF_rec (o % b ^ log b o))
44+
let hwf := mod_opow_log_lt_self b ho in H o ho (CNF_rec (o % b ^ log b o))
4645
using_well_founded {dec_tac := `[assumption]}
4746

48-
@[simp] theorem CNF_rec_zero {b} (hb) {C H0 H} : @CNF_rec b hb C H0 H 0 = H0 :=
47+
@[simp] theorem CNF_rec_zero {b C H0 H} : @CNF_rec b C H0 H 0 = H0 :=
4948
by rw [CNF_rec, dif_pos rfl]; refl
5049

51-
@[simp] theorem CNF_rec_ne_zero {b} (hb) {C H0 H o} (ho) :
52-
@CNF_rec b hb C H0 H o = H o ho (@CNF_rec b hb C H0 H _) :=
50+
@[simp] theorem CNF_rec_ne_zero {b C H0 H o} (ho) :
51+
@CNF_rec b C H0 H o = H o ho (@CNF_rec b C H0 H _) :=
5352
by rw [CNF_rec, dif_neg ho]
5453

5554
/-- The Cantor normal form of an ordinal `o` is the list of coefficients and exponents in the
@@ -60,18 +59,18 @@ We special-case `CNF 0 o = []`, `CNF b 0 = []`, and `CNF 1 o = [(0, o)]` for `o
6059
`CNF b (b ^ u₁ * v₁ + b ^ u₂ * v₂) = [(u₁, v₁), (u₂, v₂)]` -/
6160
@[pp_nodot] def CNF (b o : ordinal) : list (ordinal × ordinal) :=
6261
if hb : b = 0 then [] else
63-
CNF_rec hb [] (λ o o0 IH, (log b o, o / b ^ log b o) :: IH) o
62+
CNF_rec b [] (λ o o0 IH, (log b o, o / b ^ log b o) :: IH) o
6463

6564
@[simp] theorem zero_CNF (o) : CNF 0 o = [] :=
6665
dif_pos rfl
6766

6867
@[simp] theorem CNF_zero (b) : CNF b 0 = [] :=
69-
if hb : b = 0 then dif_pos hb else (dif_neg hb).trans $ CNF_rec_zero _
68+
if hb : b = 0 then dif_pos hb else (dif_neg hb).trans CNF_rec_zero
7069

7170
/-- Recursive definition for the Cantor normal form. -/
7271
theorem CNF_ne_zero {b o : ordinal} (hb : b ≠ 0) (ho : o ≠ 0) :
7372
CNF b o = (log b o, o / b ^ log b o) :: CNF b (o % b ^ log b o) :=
74-
by unfold CNF; rw [dif_neg hb, dif_neg hb, CNF_rec_ne_zero hb ho]
73+
by unfold CNF; rw [dif_neg hb, dif_neg hb, CNF_rec_ne_zero ho]
7574

7675
@[simp] theorem one_CNF {o : ordinal} (ho : o ≠ 0) : CNF 1 o = [(0, o)] :=
7776
by rw [CNF_ne_zero ordinal.one_ne_zero ho, log_of_not_one_lt_left (irrefl _), opow_zero, mod_one,
@@ -80,7 +79,7 @@ by rw [CNF_ne_zero ordinal.one_ne_zero ho, log_of_not_one_lt_left (irrefl _), op
8079
/-- Evaluating the Cantor normal form of an ordinal returns the ordinal. -/
8180
theorem CNF_foldr {b : ordinal} (hb : b ≠ 0) (o) :
8281
(CNF b o).foldr (λ p r, b ^ p.1 * p.2 + r) 0 = o :=
83-
CNF_rec hb (by rw CNF_zero; refl)
82+
CNF_rec b (by rw CNF_zero; refl)
8483
(λ o ho IH, by rw [CNF_ne_zero hb ho, list.foldr_cons, IH, div_add_mod]) o
8584

8685
/-- This theorem exists to factor out commonalities between the proofs of `ordinal.CNF_pairwise` and
@@ -91,12 +90,12 @@ begin
9190
by_cases hb : b = 0,
9291
{ simp only [hb, zero_CNF, list.pairwise.nil, and_true], exact λ _, false.elim },
9392
cases lt_or_eq_of_le (one_le_iff_ne_zero.2 hb) with hb' hb',
94-
{ refine CNF_rec hb _ _ o,
93+
{ refine CNF_rec b _ _ o,
9594
{ simp only [CNF_zero, list.pairwise.nil, and_true], exact λ _, false.elim },
9695
intros o ho IH, cases IH with IH₁ IH₂,
9796
simp only [CNF_ne_zero hb ho, list.forall_mem_cons, list.pairwise_cons, IH₂, and_true],
9897
refine ⟨⟨le_rfl, λ p m, _⟩, λ p m, _⟩,
99-
{ exact (IH₁ p m).trans (log_mono_right _ $ le_of_lt $ mod_opow_log_lt_self hb ho) },
98+
{ exact (IH₁ p m).trans (log_mono_right _ $ le_of_lt $ mod_opow_log_lt_self b ho) },
10099
{ refine (IH₁ p m).trans_lt ((lt_opow_iff_log_lt hb' _).1 _),
101100
{ intro e,
102101
rw e at m, simpa only [CNF_zero] using m },
@@ -128,7 +127,7 @@ private theorem CNF_snd_lt_aux {b o : ordinal.{u}} (hb' : 1 < b) :
128127
∀ {p : ordinal × ordinal}, p ∈ CNF b o → p.2 < b ∧ 0 < p.2 :=
129128
begin
130129
have hb := (zero_lt_one.trans hb').ne',
131-
refine CNF_rec hb (λ _, by { rw CNF_zero, exact false.elim }) (λ o ho IH, _) o,
130+
refine CNF_rec b (λ _, by { rw CNF_zero, exact false.elim }) (λ o ho IH, _) o,
132131
simp only [CNF_ne_zero hb ho, list.mem_cons_iff, forall_eq_or_imp, iff_true_intro @IH, and_true],
133132
nth_rewrite 1 ←@succ_le_iff,
134133
rw [div_lt (opow_ne_zero _ hb), ←opow_succ, le_div (opow_ne_zero _ hb), succ_zero, mul_one],

0 commit comments

Comments
 (0)