Skip to content

Commit 56b984f

Browse files
committed
more
1 parent 6afab95 commit 56b984f

File tree

3 files changed

+143
-5
lines changed

3 files changed

+143
-5
lines changed

src/Init/Data/Array/Erase.lean

Lines changed: 80 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ open Nat
2424

2525
/-! ### eraseP -/
2626

27+
@[grind =]
2728
theorem eraseP_empty : #[].eraseP p = #[] := by simp
2829

2930
theorem 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 =]
6769
theorem 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 →]
8487
theorem 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 _=_]
96100
theorem 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 =]
100105
theorem 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 =]
105111
theorem 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 =]
122129
theorem 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 =]
129137
theorem 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 =]
168177
theorem 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 =]
211221
theorem 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 →]
225236
theorem 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 _=_]
237249
theorem 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 =]
254267
theorem 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 =]
261275
theorem 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 =]
272287
theorem 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 =]
315331
theorem 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 =]
325342
theorem 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 =]
342360
theorem 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 →]
365384
theorem 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 =]
383418
theorem 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

src/Init/Data/Vector/Erase.lean

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,13 @@ open Nat
2222

2323
/-! ### eraseIdx -/
2424

25+
@[grind =]
2526
theorem eraseIdx_eq_take_drop_succ {xs : Vector α n} {i : Nat} (h) :
2627
xs.eraseIdx i = (xs.take i ++ xs.drop (i + 1)).cast (by omega) := by
2728
rcases xs with ⟨xs, rfl⟩
2829
simp [Array.eraseIdx_eq_take_drop_succ, *]
2930

31+
@[grind =]
3032
theorem getElem?_eraseIdx {xs : Vector α n} {i : Nat} (h : i < n) {j : Nat} :
3133
(xs.eraseIdx i)[j]? = if j < i then xs[j]? else xs[j + 1]? := by
3234
rcases xs with ⟨xs, rfl⟩
@@ -44,12 +46,14 @@ theorem getElem?_eraseIdx_of_ge {xs : Vector α n} {i : Nat} (h : i < n) {j : Na
4446
intro h'
4547
omega
4648

49+
@[grind =]
4750
theorem getElem_eraseIdx {xs : Vector α n} {i : Nat} (h : i < n) {j : Nat} (h' : j < n - 1) :
4851
(xs.eraseIdx i)[j] = if h'' : j < i then xs[j] else xs[j + 1] := by
4952
apply Option.some.inj
5053
rw [← getElem?_eq_getElem, getElem?_eraseIdx]
5154
split <;> simp
5255

56+
@[grind →]
5357
theorem mem_of_mem_eraseIdx {xs : Vector α n} {i : Nat} {h} {a : α} (h : a ∈ xs.eraseIdx i) : a ∈ xs := by
5458
rcases xs with ⟨xs, rfl⟩
5559
simpa using Array.mem_of_mem_eraseIdx (by simpa using h)
@@ -64,13 +68,23 @@ theorem eraseIdx_append_of_length_le {xs : Vector α n} {k : Nat} (hk : n ≤ k)
6468
eraseIdx (xs ++ xs') k = (xs ++ eraseIdx xs' (k - n)).cast (by omega) := by
6569
rcases xs with ⟨xs⟩
6670
rcases xs' with ⟨xs'⟩
67-
simp [Array.eraseIdx_append_of_length_le, *]
71+
simp [Array.eraseIdx_append_of_size_le, *]
6872

73+
@[grind =]
74+
theorem eraseIdx_append {xs : Vector α n} {ys : Vector α m} {k : Nat} (h : k < n + m) :
75+
eraseIdx (xs ++ ys) k = if h' : k < n then (eraseIdx xs k ++ ys).cast (by omega) else (xs ++ eraseIdx ys (k - n) (by omega)).cast (by omega) := by
76+
rcases xs with ⟨xs, rfl⟩
77+
rcases ys with ⟨ys, rfl⟩
78+
simp only [mk_append_mk, eraseIdx_mk, Array.eraseIdx_append]
79+
split <;> simp
80+
81+
@[grind = ]
6982
theorem eraseIdx_cast {xs : Vector α n} {k : Nat} (h : k < m) :
7083
eraseIdx (xs.cast w) k h = (eraseIdx xs k).cast (by omega) := by
7184
rcases xs with ⟨xs⟩
7285
simp
7386

87+
@[grind =]
7488
theorem eraseIdx_replicate {n : Nat} {a : α} {k : Nat} {h} :
7589
(replicate n a).eraseIdx k = replicate (n - 1) a := by
7690
rw [replicate_eq_mk_replicate, eraseIdx_mk]
@@ -112,6 +126,45 @@ theorem eraseIdx_set_gt {xs : Vector α n} {i : Nat} {j : Nat} {a : α} (h : i <
112126
rcases xs with ⟨xs⟩
113127
simp [Array.eraseIdx_set_gt, *]
114128

129+
@[grind =]
130+
theorem eraseIdx_set {xs : Vector α n} {i : Nat} {a : α} {hi : i < n} {j : Nat} {hj : j < n} :
131+
(xs.set i a).eraseIdx j =
132+
if h' : j < i then
133+
(xs.eraseIdx j).set (i - 1) a
134+
else if h'' : j = i then
135+
xs.eraseIdx i
136+
else
137+
(xs.eraseIdx j).set i a := by
138+
rcases xs with ⟨xs⟩
139+
simp only [set_mk, eraseIdx_mk, Array.eraseIdx_set]
140+
split
141+
· simp
142+
· split <;> simp
143+
144+
theorem set_eraseIdx_le {xs : Vector α n} {i : Nat} {w : i < n} {j : Nat} {a : α} (h : i ≤ j) (hj : j < n - 1) :
145+
(xs.eraseIdx i).set j a = (xs.set (j + 1) a).eraseIdx i := by
146+
rw [eraseIdx_set_lt]
147+
· simp
148+
· omega
149+
150+
theorem set_eraseIdx_gt {xs : Vector α n} {i : Nat} {w : i < n} {j : Nat} {a : α} (h : j < i) (hj : j < n - 1) :
151+
(xs.eraseIdx i).set j a = (xs.set j a).eraseIdx i := by
152+
rw [eraseIdx_set_gt]
153+
omega
154+
155+
@[grind =]
156+
theorem set_eraseIdx {xs : Vector α n} {i : Nat} {w : i < n} {j : Nat} {a : α} (hj : j < n - 1) :
157+
(xs.eraseIdx i).set j a =
158+
if h' : i ≤ j then
159+
(xs.set (j + 1) a).eraseIdx i
160+
else
161+
(xs.set j a).eraseIdx i := by
162+
split <;> rename_i h'
163+
· rw [set_eraseIdx_le]
164+
omega
165+
· rw [set_eraseIdx_gt]
166+
omega
167+
115168
@[simp] theorem set_getElem_succ_eraseIdx_succ
116169
{xs : Vector α n} {i : Nat} (h : i + 1 < n) :
117170
(xs.eraseIdx (i + 1)).set i xs[i + 1] = xs.eraseIdx i := by

tests/lean/run/grind_list_erase.lean

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ theorem length_eraseP_of_mem (al : a ∈ l) (pa : p a) :
1010
length (l.eraseP p) = length l - 1 := by
1111
grind
1212

13-
-- reverse direction of lemma from library
1413
theorem eraseP_filterMap' {f : α → Option β} {l : List α} :
1514
filterMap f (l.eraseP (fun x => match f x with | some y => p y | none => false)) = (filterMap f l).eraseP p := by
1615
grind
@@ -21,3 +20,12 @@ theorem eraseP_append_left {a : α} (pa : p a) {l₁ : List α} {l₂} : a ∈ l
2120
theorem eraseP_append_right {l₁ : List α} {l₂} (h : ∀ b ∈ l₁, ¬p b) :
2221
eraseP p (l₁ ++ l₂) = l₁ ++ l₂.eraseP p := by
2322
grind
23+
24+
theorem head_eraseP_mem {xs : List α} {p : α → Bool} (h) : (xs.eraseP p).head h ∈ xs := by grind
25+
26+
theorem getLast_eraseP_mem {xs : List α} {p : α → Bool} (h) : (xs.eraseP p).getLast h ∈ xs := by grind
27+
28+
theorem set_getElem_succ_eraseIdx_succ
29+
{xs : Array α} {i : Nat} (h : i + 1 < xs.size) :
30+
(xs.eraseIdx (i + 1)).set i xs[i + 1] (by grind) = xs.eraseIdx i := by
31+
grind

0 commit comments

Comments
 (0)