@@ -151,15 +151,22 @@ example : segment_length 0 = 1 := by
151
151
theorem segment_length_prop1 : ∀ n > 0 , n = 2 ^ n.size - 2 →
152
152
segment_length (2 ^ (n + 2 ).size - 2 ) = 1 + segment_length n := by
153
153
intro n n_gt_0 n_is_envelope
154
+ have n_gt_2 : n ≥ 2 := by
155
+ by_contra n_eq_1
156
+ simp at n_eq_1
157
+ have : n = 1 := by exact Nat.eq_of_le_of_lt_succ n_gt_0 n_eq_1
158
+ simp [this] at n_is_envelope
159
+ have n2size_ge_3 : (n + 2 ).size ≥ 3 := by
160
+ have s1 : (2 + 2 ).size ≤ (n + 2 ).size := by
161
+ have : 2 + 2 ≤ n + 2 := by exact Nat.add_le_add_right n_gt_2 2
162
+ exact size_le_size this
163
+ have : (2 + 2 ).size = 3 := by simp [size, binaryRec]
164
+ simp [this] at s1
165
+ exact s1
166
+ have pow2nsize : 2 ^ n.size - 2 + 2 = 2 ^ n.size := by
167
+ exact Nat.sub_add_cancel (le_pow (size_pos.mpr n_gt_0))
154
168
have segment_of_n : segment n = 2 ^ (n.size - 1 ) := by
155
169
rw [segment]
156
- have n_gt_2 : n ≥ 2 := by
157
- by_contra n_eq_1
158
- simp at n_eq_1
159
- have : n = 1 := by exact Nat.eq_of_le_of_lt_succ n_gt_0 n_eq_1
160
- simp [this] at n_is_envelope
161
- have pow2nsize : 2 ^ n.size - 2 + 2 = 2 ^ n.size := by
162
- exact Nat.sub_add_cancel (le_pow (size_pos.mpr n_gt_0))
163
170
split
164
171
· expose_names
165
172
rw (occs := .pos [1 ]) [n_is_envelope]
@@ -181,8 +188,70 @@ theorem segment_length_prop1 : ∀ n > 0, n = 2 ^ n.size - 2 →
181
188
have : trailing_zeros (2 ^ (n.size - 1 )) = n.size - 1 := by
182
189
exact trailing_zeros_prop3 (n.size - 1 )
183
190
simp [this]
184
- --
185
- sorry
191
+ let n' := 2 ^ (n + 2 ).size - 2
192
+ have n'_def : n' = value_of% n' := by exact rfl
193
+ have n'_is_envelope : n' = 2 ^ n'.size - 2 := by
194
+ simp [n'_def]
195
+ have : (2 ^ (n + 2 ).size - 2 ).size = (n + 2 ).size := by
196
+ refine size_sub ?_ ?_ ?_
197
+ · exact size_pos.mpr (Nat.add_pos_left n_gt_0 2 )
198
+ · exact Nat.zero_lt_two
199
+ · refine Nat.le_self_pow ?_ 2
200
+ · refine Nat.sub_ne_zero_iff_lt.mpr ?_
201
+ · exact lt_of_add_left_lt n2size_ge_3
202
+ simp [this]
203
+ simp [segment_length]
204
+ have : segment (2 ^ (n + 2 ).size - 2 ) = 2 ^ ((n + 2 ).size - 1 ) := by
205
+ rw [segment]
206
+ simp
207
+ split
208
+ · expose_names
209
+ have : 2 ^ (n + 2 ).size - 2 + 2 = 2 ^ (n + 2 ).size := by
210
+ refine Nat.sub_add_cancel ?_
211
+ · refine Nat.le_self_pow ?_ 2
212
+ · exact Nat.ne_zero_of_lt n2size_ge_3
213
+ simp [this]
214
+ replace : (2 ^ (n + 2 ).size).size = (n + 2 ).size + 1 := by exact size_pow
215
+ simp [this]
216
+ · expose_names
217
+ have : 2 ^ (n + 2 ).size - 2 + 2 = 2 ^ (n + 2 ).size := by
218
+ refine Nat.sub_add_cancel ?_
219
+ · exact le_pow (zero_lt_of_lt n2size_ge_3)
220
+ simp only [this] at h
221
+ replace : (2 ^ (n + 2 ).size).size - 1 = (n + 2 ).size := by
222
+ have : (2 ^ (n + 2 ).size).size = (n + 2 ).size + 1 := by exact size_pow
223
+ simp [this]
224
+ simp [this] at h
225
+ · intro x
226
+ have c : 2 ^ (n + 2 ).size - 2 ≥ 6 := by
227
+ have s1 : 2 ^ (n + 2 ).size ≥ 2 ^ (2 + 2 ).size := by
228
+ refine Luby.pow2_le_pow2 (2 + 2 ).size (n + 2 ).size ?_
229
+ · exact size_le_size (Nat.add_le_add_right n_gt_2 2 )
230
+ have : 2 ^ (2 + 2 ).size = 8 := by simp [size, binaryRec]
231
+ simp [this] at s1
232
+ exact le_sub_of_add_le s1
233
+ replace c : ¬2 ^ (n + 2 ).size - 2 = 0 := by exact Nat.ne_zero_of_lt c
234
+ exact absurd x c
235
+ simp [this]
236
+ replace : trailing_zeros (2 ^ ((n + 2 ).size - 1 )) = (n + 2 ).size - 1 := by
237
+ exact trailing_zeros_prop3 ((n + 2 ).size - 1 )
238
+ simp [this]
239
+ have n_is_envelope' : n + 2 = 2 ^ n.size := by
240
+ refine Eq.symm (Nat.eq_add_of_sub_eq ?_ (id (Eq.symm n_is_envelope)))
241
+ · exact tsub_add_cancel_iff_le.mp pow2nsize
242
+ simp [n_is_envelope']
243
+ replace : (2 ^ n.size).size = n.size + 1 := by exact size_pow
244
+ simp [this]
245
+ replace : n.size - 1 + 1 = n.size := by
246
+ refine Nat.sub_add_cancel ?_
247
+ · have : n.size ≥ 2 := by
248
+ have s1 : n.size ≥ (2 : ℕ).size := by exact size_le_size n_gt_2
249
+ have s2 : (2 : ℕ).size = 2 := by simp [size, binaryRec]
250
+ simp [s2] at s1
251
+ exact s1
252
+ exact one_le_of_lt this
253
+ simp [this]
254
+ exact Nat.add_comm n.size 1
186
255
187
256
theorem segment_length_prop2 : ∀ n > 0 , ¬n = 2 ^ n.size - 2 →
188
257
segment_length (2 ^ (n + 2 ).size - 2 ) = segment_length n := by
0 commit comments