Skip to content

Commit a0599b3

Browse files
committed
Refactor segment function and simplify proof steps
1 parent 27dec01 commit a0599b3

File tree

1 file changed

+17
-44
lines changed

1 file changed

+17
-44
lines changed

LubySequence/Segment.lean

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -17,54 +17,27 @@ Return the segment index for `n`.
1717
- `n` starts from 0.
1818
- segment index starts from 1.
1919
-/
20-
partial
2120
def segment (n : ℕ) : ℕ := match n with
2221
| 0 => 1
2322
| n =>
24-
if _h : n = 2 ^ ((n + 2).size - 1) - 2
25-
then 2 ^ ((n + 2).size - 2)
23+
if h : n = 2 ^ ((n + 2).size - 1) - 2
24+
then 2 ^ ((n + 2).size - 2)
2625
else
27-
/-
28-
have order : 2 * n' - 2 < n := by
29-
simp [n'_def]
30-
by_cases n_le_1 : n ≤ 1
31-
· have cases : n = 0 ∨ n = 1 := by exact le_one_iff_eq_zero_or_eq_one.mp n_le_1
32-
rcases cases with n_eq_0|n_eq_1
33-
· simp [n_eq_0, size] at *
34-
simp [n'_def] at h
35-
· simp [n_eq_1, size] at *
36-
· have n_ge_2 : n ≥ 2 := by
37-
have : n > 1 := by exact Nat.lt_of_not_le n_le_1
38-
exact this
39-
have nsize2 : n.size ≥ 2 := by
40-
have t1 : n.size ≥ (2 : ℕ).size := by
41-
exact size_le_size n_ge_2
42-
have t2 : (2 : ℕ).size = 2 := by simp [size, binaryRec]
43-
simp [t2] at t1
44-
exact t1
45-
have : 2 * 2 ^ (n.size - 2) = 2 ^ (n.size - 1) := by
46-
have : 2 * 2 ^ (n.size - 2) = 2 ^ (n.size - 2 + 1) := by
47-
exact Eq.symm Nat.pow_succ'
48-
simp [this]
49-
rw [add_comm]
50-
refine Eq.symm ((fun {b a c} h ↦ (Nat.sub_eq_iff_eq_add' h).mp) ?_ rfl)
51-
· exact le_sub_one_of_lt nsize2
52-
simp [this]
53-
refine Nat.sub_lt_right_of_lt_add ?_ ?_
54-
· exact le_pow (zero_lt_sub_of_lt nsize2)
55-
· have t1 : 2 ^ (n.size - 1) ≤ n := by
56-
exact n_ge_subenvelope (one_le_of_lt n_ge_2)
57-
have t2 : 2 ^ (n.size - 1) < n + 1 := by exact Order.lt_add_one_iff.mpr t1
58-
exact lt_succ_of_lt t2
59-
have decreasing : n - (2 * n' - 2) - 1 < n := by
60-
have : 2 * n' - 2 ≥ 0 := by exact Nat.zero_le (2 * n' - 2)
61-
replace : n - (2 * n' - 2) ≤ n := by exact sub_le n (2 * n' - 2)
62-
by_cases x : n - (2 * n' - 2) ≥ 1
63-
· exact sub_one_lt_of_le x this
64-
· exact sub_one_lt_of_le (zero_lt_sub_of_lt order) this
65-
-/
66-
2 ^ ((n + 2).size - 2) +
67-
segment (n - (2 ^ ((n + 2).size - 1) - 1))
26+
have n2size : (n + 2).size ≥ 2 := by
27+
have s1 : (n + 2).size ≥ (0 + 2).size := by
28+
exact size_le_size (Nat.le_add_left (0 + 2) n)
29+
have s2 : (0 + 2).size = 2 := by simp [size, binaryRec]
30+
simp [s2] at s1
31+
exact s1
32+
have order : n - (2 ^ ((n + 2).size - 1) - 1) < n := by
33+
have s1 : 0 < 2 ^ ((n + 2).size - 1) - 1 := by
34+
refine zero_lt_sub_of_lt ?_
35+
· exact Nat.one_lt_two_pow (Nat.sub_ne_zero_iff_lt.mpr n2size)
36+
refine sub_lt ?_ s1
37+
· by_contra n_eq_0
38+
simp at n_eq_0
39+
simp [n_eq_0, size, binaryRec] at h
40+
2 ^ ((n + 2).size - 2) + segment (n - (2 ^ ((n + 2).size - 1) - 1))
6841

6942
#eval! List.range 32 |>.map (fun n ↦ (n, LubySegment.segment n))
7043
#eval! List.range 8 |>.map (2 ^ ·.succ - 2) |>.map (fun n ↦ (n, LubySegment.segment n))

0 commit comments

Comments
 (0)