@@ -2111,7 +2111,7 @@ by rw [CNF_rec, dif_neg o0]
2111
2111
base-`b` expansion of `o`.
2112
2112
2113
2113
`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) :=
2115
2115
if b0 : b = 0 then [] else
2116
2116
CNF_rec b0 [] (λ o o0 IH, (log b o, o / b ^ log b o) :: IH) o
2117
2117
@@ -2125,8 +2125,7 @@ theorem CNF_ne_zero {b o : ordinal} (b0 : b ≠ 0) (o0 : o ≠ 0) :
2125
2125
CNF b o = (log b o, o / b ^ log b o) :: CNF b (o % b ^ log b o) :=
2126
2126
by unfold CNF; rw [dif_neg b0, dif_neg b0, CNF_rec_ne_zero b0 o0]
2127
2127
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)] :=
2130
2129
by rw [CNF_ne_zero ordinal.one_ne_zero o0, log_not_one_lt (lt_irrefl _), opow_zero, mod_one,
2131
2130
CNF_zero, div_one]
2132
2131
@@ -2135,8 +2134,10 @@ theorem CNF_foldr {b : ordinal} (b0 : b ≠ 0) (o) :
2135
2134
CNF_rec b0 (by rw CNF_zero; refl)
2136
2135
(λ o o0 IH, by rw [CNF_ne_zero b0 o0, list.foldr_cons, IH, div_add_mod]) o
2137
2136
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 ) :=
2140
2141
begin
2141
2142
by_cases b0 : b = 0 ,
2142
2143
{ simp only [b0, zero_CNF, list.pairwise.nil, and_true], exact λ _, false.elim },
@@ -2158,27 +2159,41 @@ begin
2158
2159
list.pairwise_singleton] }
2159
2160
end
2160
2161
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 ) :=
2162
2164
(CNF_pairwise_aux _ _).2
2163
2165
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 :=
2165
2168
(CNF_pairwise_aux _ _).1
2166
2169
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 _ _)
2169
2172
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 :=
2171
2177
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
2178
2185
end
2179
2186
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 }
2182
2197
2183
2198
/-! ### Casting naturals into ordinals, compatibility with operations -/
2184
2199
0 commit comments