Skip to content

Commit 7fe3c66

Browse files
committed
finish
1 parent 56b984f commit 7fe3c66

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

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

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ set_option linter.indexVariables true -- Enforce naming conventions for index va
1414

1515
namespace List
1616

17+
@[grind =]
1718
theorem getElem?_eraseIdx {l : List α} {i : Nat} {j : Nat} :
1819
(l.eraseIdx i)[j]? = if j < i then l[j]? else l[j + 1]? := by
1920
rw [eraseIdx_eq_take_drop_succ, getElem?_append]
@@ -49,6 +50,7 @@ theorem getElem?_eraseIdx_of_ge {l : List α} {i : Nat} {j : Nat} (h : i ≤ j)
4950
intro h'
5051
omega
5152

53+
@[grind =]
5254
theorem getElem_eraseIdx {l : List α} {i : Nat} {j : Nat} (h : j < (l.eraseIdx i).length) :
5355
(l.eraseIdx i)[j] = if h' : j < i then
5456
l[j]'(by have := length_eraseIdx_le l i; omega)
@@ -123,6 +125,48 @@ theorem eraseIdx_set_gt {l : List α} {i : Nat} {j : Nat} {a : α} (h : i < j) :
123125
· have t : i ≠ n := by omega
124126
simp [t]
125127

128+
@[grind =]
129+
theorem eraseIdx_set {xs : List α} {i : Nat} {a : α} {j : Nat} :
130+
(xs.set i a).eraseIdx j =
131+
if j < i then
132+
(xs.eraseIdx j).set (i - 1) a
133+
else if j = i then
134+
xs.eraseIdx i
135+
else
136+
(xs.eraseIdx j).set i a := by
137+
split <;> rename_i h'
138+
· rw [eraseIdx_set_lt]
139+
omega
140+
· split <;> rename_i h''
141+
· subst h''
142+
rw [eraseIdx_set_eq]
143+
· rw [eraseIdx_set_gt]
144+
omega
145+
146+
theorem set_eraseIdx_le {xs : List α} {i : Nat} {j : Nat} {a : α} (h : i ≤ j) :
147+
(xs.eraseIdx i).set j a = (xs.set (j + 1) a).eraseIdx i := by
148+
rw [eraseIdx_set_lt]
149+
· simp
150+
· omega
151+
152+
theorem set_eraseIdx_gt {xs : List α} {i : Nat} {j : Nat} {a : α} (h : j < i) :
153+
(xs.eraseIdx i).set j a = (xs.set j a).eraseIdx i := by
154+
rw [eraseIdx_set_gt]
155+
omega
156+
157+
@[grind =]
158+
theorem set_eraseIdx {xs : List α} {i : Nat} {j : Nat} {a : α} :
159+
(xs.eraseIdx i).set j a =
160+
if i ≤ j then
161+
(xs.set (j + 1) a).eraseIdx i
162+
else
163+
(xs.set j a).eraseIdx i := by
164+
split <;> rename_i h'
165+
· rw [set_eraseIdx_le]
166+
omega
167+
· rw [set_eraseIdx_gt]
168+
omega
169+
126170
@[simp] theorem set_getElem_succ_eraseIdx_succ
127171
{l : List α} {i : Nat} (h : i + 1 < l.length) :
128172
(l.eraseIdx (i + 1)).set i l[i + 1] = l.eraseIdx i := by

tests/lean/run/grind_list_erase.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,4 @@ theorem getLast_eraseP_mem {xs : List α} {p : α → Bool} (h) : (xs.eraseP p).
2828
theorem set_getElem_succ_eraseIdx_succ
2929
{xs : Array α} {i : Nat} (h : i + 1 < xs.size) :
3030
(xs.eraseIdx (i + 1)).set i xs[i + 1] (by grind) = xs.eraseIdx i := by
31-
grind
31+
grind (splits := 9)

0 commit comments

Comments
 (0)