@@ -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
114155theorem mem_eraseIdx_iff_getElem {x : α} :
0 commit comments