@@ -24,6 +24,7 @@ open Nat
2424
2525/-! ### eraseP -/
2626
27+ @[grind =]
2728theorem eraseP_empty : #[].eraseP p = #[] := by simp
2829
2930theorem eraseP_of_forall_mem_not {xs : Array α} (h : ∀ a, a ∈ xs → ¬p a) : xs.eraseP p = xs := by
@@ -64,6 +65,7 @@ theorem exists_or_eq_self_of_eraseP (p) (xs : Array α) :
6465 let ⟨_, ys, zs, _, _, e₁, e₂⟩ := exists_of_eraseP al pa
6566 rw [e₂]; simp [size_append, e₁]
6667
68+ @[grind =]
6769theorem size_eraseP {xs : Array α} : (xs.eraseP p).size = if xs.any p then xs.size - 1 else xs.size := by
6870 split <;> rename_i h
6971 · simp only [any_eq_true] at h
@@ -81,27 +83,31 @@ theorem le_size_eraseP {xs : Array α} : xs.size - 1 ≤ (xs.eraseP p).size := b
8183 rcases xs with ⟨xs⟩
8284 simpa using List.le_length_eraseP
8385
86+ @[grind →]
8487theorem mem_of_mem_eraseP {xs : Array α} : a ∈ xs.eraseP p → a ∈ xs := by
8588 rcases xs with ⟨xs⟩
8689 simpa using List.mem_of_mem_eraseP
8790
88- @[simp] theorem mem_eraseP_of_neg {xs : Array α} (pa : ¬p a) : a ∈ xs.eraseP p ↔ a ∈ xs := by
91+ @[simp, grind ] theorem mem_eraseP_of_neg {xs : Array α} (pa : ¬p a) : a ∈ xs.eraseP p ↔ a ∈ xs := by
8992 rcases xs with ⟨xs⟩
9093 simpa using List.mem_eraseP_of_neg pa
9194
9295@[simp] theorem eraseP_eq_self_iff {xs : Array α} : xs.eraseP p = xs ↔ ∀ a ∈ xs, ¬ p a := by
9396 rcases xs with ⟨xs⟩
9497 simp
9598
99+ @[grind _=_]
96100theorem eraseP_map {f : β → α} {xs : Array β} : (xs.map f).eraseP p = (xs.eraseP (p ∘ f)).map f := by
97101 rcases xs with ⟨xs⟩
98102 simpa using List.eraseP_map
99103
104+ @[grind =]
100105theorem eraseP_filterMap {f : α → Option β} {xs : Array α} :
101106 (filterMap f xs).eraseP p = filterMap f (xs.eraseP (fun x => match f x with | some y => p y | none => false)) := by
102107 rcases xs with ⟨xs⟩
103108 simpa using List.eraseP_filterMap
104109
110+ @[grind =]
105111theorem eraseP_filter {f : α → Bool} {xs : Array α} :
106112 (filter f xs).eraseP p = filter f (xs.eraseP (fun x => p x && f x)) := by
107113 rcases xs with ⟨xs⟩
@@ -119,13 +125,15 @@ theorem eraseP_append_right {xs : Array α} ys (h : ∀ b ∈ xs, ¬p b) :
119125 rcases ys with ⟨ys⟩
120126 simpa using List.eraseP_append_right ys (by simpa using h)
121127
128+ @[grind =]
122129theorem eraseP_append {xs : Array α} {ys : Array α} :
123130 (xs ++ ys).eraseP p = if xs.any p then xs.eraseP p ++ ys else xs ++ ys.eraseP p := by
124131 rcases xs with ⟨xs⟩
125132 rcases ys with ⟨ys⟩
126133 simp only [List.append_toArray, List.eraseP_toArray, List.eraseP_append, List.any_toArray]
127134 split <;> simp
128135
136+ @[grind =]
129137theorem eraseP_replicate {n : Nat} {a : α} {p : α → Bool} :
130138 (replicate n a).eraseP p = if p a then replicate (n - 1 ) a else replicate n a := by
131139 simp only [← List.toArray_replicate, List.eraseP_toArray, List.eraseP_replicate]
@@ -165,6 +173,7 @@ theorem eraseP_eq_iff {p} {xs : Array α} :
165173 · exact Or.inl h
166174 · exact Or.inr ⟨a, l₁, by simpa using h₁, h₂, ⟨l, by simp⟩⟩
167175
176+ @[grind =]
168177theorem eraseP_comm {xs : Array α} (h : ∀ a ∈ xs, ¬ p a ∨ ¬ q a) :
169178 (xs.eraseP p).eraseP q = (xs.eraseP q).eraseP p := by
170179 rcases xs with ⟨xs⟩
@@ -208,6 +217,7 @@ theorem exists_erase_eq [LawfulBEq α] {a : α} {xs : Array α} (h : a ∈ xs) :
208217 (xs.erase a).size = xs.size - 1 := by
209218 rw [erase_eq_eraseP]; exact size_eraseP_of_mem h (beq_self_eq_true a)
210219
220+ @[grind =]
211221theorem size_erase [LawfulBEq α] {a : α} {xs : Array α} :
212222 (xs.erase a).size = if a ∈ xs then xs.size - 1 else xs.size := by
213223 rw [erase_eq_eraseP, size_eraseP]
@@ -222,18 +232,20 @@ theorem le_size_erase [LawfulBEq α] {a : α} {xs : Array α} : xs.size - 1 ≤
222232 rcases xs with ⟨xs⟩
223233 simpa using List.le_length_erase
224234
235+ @[grind →]
225236theorem mem_of_mem_erase {a b : α} {xs : Array α} (h : a ∈ xs.erase b) : a ∈ xs := by
226237 rcases xs with ⟨xs⟩
227238 simpa using List.mem_of_mem_erase (by simpa using h)
228239
229- @[simp] theorem mem_erase_of_ne [LawfulBEq α] {a b : α} {xs : Array α} (ab : a ≠ b) :
240+ @[simp, grind ] theorem mem_erase_of_ne [LawfulBEq α] {a b : α} {xs : Array α} (ab : a ≠ b) :
230241 a ∈ xs.erase b ↔ a ∈ xs :=
231242 erase_eq_eraseP b xs ▸ mem_eraseP_of_neg (mt eq_of_beq ab.symm)
232243
233244@[simp] theorem erase_eq_self_iff [LawfulBEq α] {xs : Array α} : xs.erase a = xs ↔ a ∉ xs := by
234245 rw [erase_eq_eraseP', eraseP_eq_self_iff]
235246 simp [forall_mem_ne']
236247
248+ @[grind _=_]
237249theorem erase_filter [LawfulBEq α] {f : α → Bool} {xs : Array α} :
238250 (filter f xs).erase a = filter f (xs.erase a) := by
239251 rcases xs with ⟨xs⟩
@@ -251,13 +263,15 @@ theorem erase_append_right [LawfulBEq α] {a : α} {xs : Array α} (ys : Array
251263 rcases ys with ⟨ys⟩
252264 simpa using List.erase_append_right ys (by simpa using h)
253265
266+ @[grind =]
254267theorem erase_append [LawfulBEq α] {a : α} {xs ys : Array α} :
255268 (xs ++ ys).erase a = if a ∈ xs then xs.erase a ++ ys else xs ++ ys.erase a := by
256269 rcases xs with ⟨xs⟩
257270 rcases ys with ⟨ys⟩
258271 simp only [List.append_toArray, List.erase_toArray, List.erase_append, mem_toArray]
259272 split <;> simp
260273
274+ @[grind =]
261275theorem erase_replicate [LawfulBEq α] {n : Nat} {a b : α} :
262276 (replicate n a).erase b = if b == a then replicate (n - 1 ) a else replicate n a := by
263277 simp only [← List.toArray_replicate, List.erase_toArray]
@@ -269,6 +283,7 @@ abbrev erase_mkArray := @erase_replicate
269283
270284-- The arguments `a b` are explicit,
271285-- so they can be specified to prevent `simp` repeatedly applying the lemma.
286+ @[grind =]
272287theorem erase_comm [LawfulBEq α] (a b : α) {xs : Array α} :
273288 (xs.erase a).erase b = (xs.erase b).erase a := by
274289 rcases xs with ⟨xs⟩
@@ -312,6 +327,7 @@ theorem eraseIdx_eq_eraseIdxIfInBounds {xs : Array α} {i : Nat} (h : i < xs.siz
312327 xs.eraseIdx i h = xs.eraseIdxIfInBounds i := by
313328 simp [eraseIdxIfInBounds, h]
314329
330+ @[grind =]
315331theorem eraseIdx_eq_take_drop_succ {xs : Array α} {i : Nat} (h) :
316332 xs.eraseIdx i h = xs.take i ++ xs.drop (i + 1 ) := by
317333 rcases xs with ⟨xs⟩
@@ -322,6 +338,7 @@ theorem eraseIdx_eq_take_drop_succ {xs : Array α} {i : Nat} (h) :
322338 rw [List.take_of_length_le]
323339 simp
324340
341+ @[grind =]
325342theorem getElem ?_eraseIdx {xs : Array α} {i : Nat} (h : i < xs.size) {j : Nat} :
326343 (xs.eraseIdx i)[j]? = if j < i then xs[j]? else xs[j + 1 ]? := by
327344 rcases xs with ⟨xs⟩
@@ -339,6 +356,7 @@ theorem getElem?_eraseIdx_of_ge {xs : Array α} {i : Nat} (h : i < xs.size) {j :
339356 intro h'
340357 omega
341358
359+ @[grind =]
342360theorem getElem_eraseIdx {xs : Array α} {i : Nat} (h : i < xs.size) {j : Nat} (h' : j < (xs.eraseIdx i).size) :
343361 (xs.eraseIdx i)[j] = if h'' : j < i then
344362 xs[j]
@@ -362,6 +380,7 @@ theorem eraseIdx_ne_empty_iff {xs : Array α} {i : Nat} {h} : xs.eraseIdx i ≠
362380 simp [h]
363381 · simp
364382
383+ @[grind →]
365384theorem mem_of_mem_eraseIdx {xs : Array α} {i : Nat} {h} {a : α} (h : a ∈ xs.eraseIdx i) : a ∈ xs := by
366385 rcases xs with ⟨xs⟩
367386 simpa using List.mem_of_mem_eraseIdx (by simpa using h)
@@ -373,13 +392,29 @@ theorem eraseIdx_append_of_lt_size {xs : Array α} {k : Nat} (hk : k < xs.size)
373392 simp at hk
374393 simp [List.eraseIdx_append_of_lt_length, *]
375394
376- theorem eraseIdx_append_of_length_le {xs : Array α} {k : Nat} (hk : xs.size ≤ k) (ys : Array α) (h) :
395+ theorem eraseIdx_append_of_size_le {xs : Array α} {k : Nat} (hk : xs.size ≤ k) (ys : Array α) (h) :
377396 eraseIdx (xs ++ ys) k = xs ++ eraseIdx ys (k - xs.size) (by simp at h; omega) := by
378397 rcases xs with ⟨l⟩
379398 rcases ys with ⟨l'⟩
380399 simp at hk
381400 simp [List.eraseIdx_append_of_length_le, *]
382401
402+ @[deprecated eraseIdx_append_of_size_le (since := " 2025-06-11" )]
403+ abbrev eraseIdx_append_of_length_le := @eraseIdx_append_of_size_le
404+
405+ @[grind =]
406+ theorem eraseIdx_append {xs ys : Array α} (h : k < (xs ++ ys).size) :
407+ eraseIdx (xs ++ ys) k =
408+ if h' : k < xs.size then
409+ eraseIdx xs k ++ ys
410+ else
411+ xs ++ eraseIdx ys (k - xs.size) (by simp at h; omega) := by
412+ split <;> rename_i h
413+ · simp [eraseIdx_append_of_lt_size h]
414+ · rw [eraseIdx_append_of_size_le]
415+ omega
416+
417+ @[grind =]
383418theorem eraseIdx_replicate {n : Nat} {a : α} {k : Nat} {h} :
384419 (replicate n a).eraseIdx k = replicate (n - 1 ) a := by
385420 simp at h
@@ -428,6 +463,48 @@ theorem eraseIdx_set_gt {xs : Array α} {i : Nat} {j : Nat} {a : α} (h : i < j)
428463 rcases xs with ⟨xs⟩
429464 simp [List.eraseIdx_set_gt, *]
430465
466+ @[grind =]
467+ theorem eraseIdx_set {xs : Array α} {i : Nat} {a : α} {hi : i < xs.size} {j : Nat} {hj : j < (xs.set i a).size} :
468+ (xs.set i a).eraseIdx j =
469+ if h' : j < i then
470+ (xs.eraseIdx j).set (i - 1 ) a (by simp; omega)
471+ else if h'' : j = i then
472+ xs.eraseIdx i
473+ else
474+ (xs.eraseIdx j (by simp at hj; omega)).set i a (by simp at hj ⊢; omega) := by
475+ split <;> rename_i h'
476+ · rw [eraseIdx_set_lt]
477+ omega
478+ · split <;> rename_i h''
479+ · subst h''
480+ rw [eraseIdx_set_eq]
481+ · rw [eraseIdx_set_gt]
482+ omega
483+
484+ theorem set_eraseIdx_le {xs : Array α} {i : Nat} {w : i < xs.size} {j : Nat} {a : α} (h : i ≤ j) (hj : j < (xs.eraseIdx i).size) :
485+ (xs.eraseIdx i).set j a = (xs.set (j + 1 ) a (by simp at hj; omega)).eraseIdx i (by simp at ⊢; omega) := by
486+ rw [eraseIdx_set_lt]
487+ · simp
488+ · omega
489+
490+ theorem set_eraseIdx_gt {xs : Array α} {i : Nat} {w : i < xs.size} {j : Nat} {a : α} (h : j < i) (hj : j < (xs.eraseIdx i).size) :
491+ (xs.eraseIdx i).set j a = (xs.set j a).eraseIdx i (by simp at ⊢; omega) := by
492+ rw [eraseIdx_set_gt]
493+ omega
494+
495+ @[grind =]
496+ theorem set_eraseIdx {xs : Array α} {i : Nat} {w : i < xs.size} {j : Nat} {a : α} (hj : j < (xs.eraseIdx i).size) :
497+ (xs.eraseIdx i).set j a =
498+ if h' : i ≤ j then
499+ (xs.set (j + 1 ) a (by simp at hj; omega)).eraseIdx i (by simp at ⊢; omega)
500+ else
501+ (xs.set j a).eraseIdx i (by simp at ⊢; omega) := by
502+ split <;> rename_i h'
503+ · rw [set_eraseIdx_le]
504+ omega
505+ · rw [set_eraseIdx_gt]
506+ omega
507+
431508@[simp] theorem set_getElem_succ_eraseIdx_succ
432509 {xs : Array α} {i : Nat} (h : i + 1 < xs.size) :
433510 (xs.eraseIdx (i + 1 )).set i xs[i + 1 ] (by simp; omega) = xs.eraseIdx i := by
0 commit comments