Skip to content

Commit 5027d96

Browse files
committed
Complete proof for segment_length_prop1
1 parent b42b900 commit 5027d96

File tree

1 file changed

+78
-9
lines changed

1 file changed

+78
-9
lines changed

LubySequence/Segment.lean

Lines changed: 78 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -151,15 +151,22 @@ example : segment_length 0 = 1 := by
151151
theorem segment_length_prop1 : ∀ n > 0, n = 2 ^ n.size - 2
152152
segment_length (2 ^ (n + 2).size - 2) = 1 + segment_length n := by
153153
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))
154168
have segment_of_n : segment n = 2 ^ (n.size - 1) := by
155169
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))
163170
split
164171
· expose_names
165172
rw (occs := .pos [1]) [n_is_envelope]
@@ -181,8 +188,70 @@ theorem segment_length_prop1 : ∀ n > 0, n = 2 ^ n.size - 2 →
181188
have : trailing_zeros (2 ^ (n.size - 1)) = n.size - 1 := by
182189
exact trailing_zeros_prop3 (n.size - 1)
183190
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 - 26 := 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
186255

187256
theorem segment_length_prop2 : ∀ n > 0, ¬n = 2 ^ n.size - 2
188257
segment_length (2 ^ (n + 2).size - 2) = segment_length n := by

0 commit comments

Comments
 (0)