1- def intersperse : Unit :=
2- ()
1+ def intersperse : List Int → Int → List Int
2+ | [], _ => []
3+ | [i], _ => [i]
4+ | i₁ :: i₂ :: tl, delim => i₁ :: delim :: intersperse (i₂ :: tl) delim
5+
6+ example : intersperse [] 7 = [] := rfl
7+ example : intersperse [5 , 6 , 3 , 2 ] 8 = [5 , 8 , 6 , 8 , 3 , 8 , 2 ] := rfl
8+ example : intersperse [2 , 2 , 2 ] 2 = [2 , 2 , 2 , 2 , 2 ] := rfl
9+
10+ theorem intersperse_length_le : (intersperse nums delim).length ≤ 2 * nums.length - 1 := by
11+ fun_induction intersperse <;> simp only [intersperse, List.length_cons] at * <;> omega
12+
13+ -- Every element of index `2 * i` is the `i`th element of the input list.
14+ theorem intersperse_get?_num (h : 1 < nums.length) :
15+ (intersperse nums delim)[2 * i]? = nums[i]? := by
16+ fun_induction intersperse generalizing i <;> try contradiction
17+ next tl _ ih =>
18+ cases tl <;> cases i
19+ case nil.succ j =>
20+ cases j <;> simp +arith [intersperse]
21+ case cons.succ j =>
22+ have hj : 2 * (j + 1 ) = 2 * j + 2 := rfl
23+ rw [intersperse, hj]
24+ simp [ih]
25+ all_goals simp [intersperse]
326
427/-!
528## Prompt
@@ -50,4 +73,4 @@ def check(candidate):
5073 assert candidate([5, 6, 3, 2], 8) == [5, 8, 6, 8, 3, 8, 2]
5174 assert candidate([2, 2, 2], 2) == [2, 2, 2, 2, 2]
5275```
53- -/
76+ -/
0 commit comments