Skip to content

Commit a6a2833

Browse files
authored
feat: lemmas about List.intersperse (#8272)
This PR adds lemmas about the length and use of `[]?` on results of `List.intersperse`. This was suggested by @TwoFX as discussed in https://github.com/TwoFX/human-eval-lean/pull/164#discussion_r2074101914. I am unsure about the correct naming of `intersperse_getElem?_even` and `intersperse_getElem?_odd`.
1 parent b04ecae commit a6a2833

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

src/Init/Data/List/Nat/Basic.lean

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,47 @@ theorem length_rightpad {n : Nat} {a : α} {l : List α} :
109109
simp [rightpad]
110110
omega
111111

112+
/-! ### intersperse -/
113+
section intersperse
114+
115+
variable {l : List α} {sep : α} {i : Nat}
116+
117+
@[simp] theorem length_intersperse : (l.intersperse sep).length = 2 * l.length - 1 := by
118+
fun_induction intersperse <;> simp only [intersperse, length_cons, length_nil] at *
119+
rename_i h _
120+
have := length_pos_iff.mpr h
121+
omega
122+
123+
@[simp] theorem getElem?_intersperse_two_mul : (l.intersperse sep)[2 * i]? = l[i]? := by
124+
induction l using intersperse.induct_unfolding sep generalizing i <;> cases i
125+
all_goals simp [mul_succ, *]
126+
127+
theorem getElem?_intersperse_two_mul_add_one (h : i + 1 < l.length) :
128+
(l.intersperse sep)[2 * i + 1]? = some sep := by
129+
fun_induction intersperse generalizing i
130+
· contradiction
131+
· contradiction
132+
· rename_i hn _
133+
have ⟨_, tl, _⟩ := ne_nil_iff_exists_cons.mp hn
134+
cases tl <;> cases i <;> simp_all +arith
135+
136+
@[simp] theorem getElem_intersperse_two_mul (h : 2 * i < (l.intersperse sep).length) :
137+
(l.intersperse sep)[2 * i] = l[i]'(by rw [length_intersperse] at h; omega) := by
138+
rw [← Option.some_inj, ← getElem?_eq_getElem h]
139+
simp
140+
141+
@[simp] theorem getElem_intersperse_two_mul_add_one (h : 2 * i + 1 < (l.intersperse sep).length) :
142+
(l.intersperse sep)[2 * i + 1] = sep := by
143+
rw [← Option.some_inj, ← getElem?_eq_getElem h, getElem?_intersperse_two_mul_add_one]
144+
rw [length_intersperse] at h
145+
omega
146+
147+
theorem getElem_eq_getElem_intersperse_two_mul (h : i < l.length) :
148+
l[i] = (l.intersperse sep)[2 * i]'(by rw [length_intersperse]; omega) := by
149+
simp
150+
151+
end intersperse
152+
112153
/-! ### eraseIdx -/
113154

114155
theorem mem_eraseIdx_iff_getElem {x : α} :

0 commit comments

Comments
 (0)