@@ -51,27 +51,27 @@ theorem mapFinIdx_spec {xs : Array α} {f : (i : Nat) → α → (h : i < xs.siz
5151 ∀ i h, p i ((Array.mapFinIdx xs f)[i]) h :=
5252 (mapFinIdx_induction _ _ (fun _ => True) trivial p fun _ _ _ => ⟨hs .., trivial⟩).2
5353
54- @[simp] theorem size_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} :
54+ @[simp, grind = ] theorem size_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} :
5555 (xs.mapFinIdx f).size = xs.size :=
5656 (mapFinIdx_spec (p := fun _ _ _ => True) (hs := fun _ _ => trivial)).1
5757
58- @[simp] theorem size_zipIdx {xs : Array α} {k : Nat} : (xs.zipIdx k).size = xs.size :=
58+ @[simp, grind = ] theorem size_zipIdx {xs : Array α} {k : Nat} : (xs.zipIdx k).size = xs.size :=
5959 Array.size_mapFinIdx
6060
6161@[deprecated size_zipIdx (since := " 2025-01-21" )] abbrev size_zipWithIndex := @size_zipIdx
6262
63- @[simp] theorem getElem_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} {i : Nat}
63+ @[simp, grind = ] theorem getElem_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} {i : Nat}
6464 (h : i < (xs.mapFinIdx f).size) :
6565 (xs.mapFinIdx f)[i] = f i (xs[i]'(by simp_all)) (by simp_all) :=
6666 (mapFinIdx_spec (p := fun i b h => b = f i xs[i] h) fun _ _ => rfl).2 i _
6767
68- @[simp] theorem getElem ?_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} {i : Nat} :
68+ @[simp, grind = ] theorem getElem ?_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} {i : Nat} :
6969 (xs.mapFinIdx f)[i]? =
7070 xs[i]?.pbind fun b h => some <| f i b (getElem?_eq_some_iff.1 h).1 := by
7171 simp only [getElem?_def, size_mapFinIdx, getElem_mapFinIdx]
7272 split <;> simp_all
7373
74- @[simp] theorem toList_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} :
74+ @[simp, grind = ] theorem toList_mapFinIdx {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} :
7575 (xs.mapFinIdx f).toList = xs.toList.mapFinIdx (fun i a h => f i a (by simpa)) := by
7676 apply List.ext_getElem <;> simp
7777
@@ -91,20 +91,20 @@ theorem mapIdx_spec {f : Nat → α → β} {xs : Array α}
9191 ∀ i h, p i ((xs.mapIdx f)[i]) h :=
9292 (mapIdx_induction (motive := fun _ => True) trivial fun _ _ _ => ⟨hs .., trivial⟩).2
9393
94- @[simp] theorem size_mapIdx {f : Nat → α → β} {xs : Array α} : (xs.mapIdx f).size = xs.size :=
94+ @[simp, grind = ] theorem size_mapIdx {f : Nat → α → β} {xs : Array α} : (xs.mapIdx f).size = xs.size :=
9595 (mapIdx_spec (p := fun _ _ _ => True) (hs := fun _ _ => trivial)).1
9696
97- @[simp] theorem getElem_mapIdx {f : Nat → α → β} {xs : Array α} {i : Nat}
97+ @[simp, grind = ] theorem getElem_mapIdx {f : Nat → α → β} {xs : Array α} {i : Nat}
9898 (h : i < (xs.mapIdx f).size) :
9999 (xs.mapIdx f)[i] = f i (xs[i]'(by simp_all)) :=
100100 (mapIdx_spec (p := fun i b h => b = f i xs[i]) fun _ _ => rfl).2 i (by simp_all)
101101
102- @[simp] theorem getElem ?_mapIdx {f : Nat → α → β} {xs : Array α} {i : Nat} :
102+ @[simp, grind = ] theorem getElem ?_mapIdx {f : Nat → α → β} {xs : Array α} {i : Nat} :
103103 (xs.mapIdx f)[i]? =
104104 xs[i]?.map (f i) := by
105105 simp [getElem?_def, size_mapIdx, getElem_mapIdx]
106106
107- @[simp] theorem toList_mapIdx {f : Nat → α → β} {xs : Array α} :
107+ @[simp, grind = ] theorem toList_mapIdx {f : Nat → α → β} {xs : Array α} :
108108 (xs.mapIdx f).toList = xs.toList.mapIdx (fun i a => f i a) := by
109109 apply List.ext_getElem <;> simp
110110
@@ -126,7 +126,7 @@ namespace Array
126126
127127/-! ### zipIdx -/
128128
129- @[simp] theorem getElem_zipIdx {xs : Array α} {k : Nat} {i : Nat} (h : i < (xs.zipIdx k).size) :
129+ @[simp, grind = ] theorem getElem_zipIdx {xs : Array α} {k : Nat} {i : Nat} (h : i < (xs.zipIdx k).size) :
130130 (xs.zipIdx k)[i] = (xs[i]'(by simp_all), k + i) := by
131131 simp [zipIdx]
132132
@@ -140,7 +140,7 @@ abbrev getElem_zipWithIndex := @getElem_zipIdx
140140@[deprecated zipIdx_toArray (since := " 2025-01-21" )]
141141abbrev zipWithIndex_toArray := @zipIdx_toArray
142142
143- @[simp] theorem toList_zipIdx {xs : Array α} {k : Nat} :
143+ @[simp, grind = ] theorem toList_zipIdx {xs : Array α} {k : Nat} :
144144 (xs.zipIdx k).toList = xs.toList.zipIdx k := by
145145 rcases xs with ⟨xs⟩
146146 simp
@@ -185,7 +185,7 @@ abbrev mem_zipWithIndex_iff_getElem? := @mem_zipIdx_iff_getElem?
185185 subst w
186186 rfl
187187
188- @[simp]
188+ @[simp, grind = ]
189189theorem mapFinIdx_empty {f : (i : Nat) → α → (h : i < 0 ) → β} : mapFinIdx #[] f = #[] :=
190190 rfl
191191
@@ -195,6 +195,7 @@ theorem mapFinIdx_eq_ofFn {xs : Array α} {f : (i : Nat) → α → (h : i < xs.
195195 simp only [List.mapFinIdx_toArray, List.mapFinIdx_eq_ofFn, Fin.getElem_fin, List.getElem_toArray]
196196 simp [Array.size]
197197
198+ @[grind =]
198199theorem mapFinIdx_append {xs ys : Array α} {f : (i : Nat) → α → (h : i < (xs ++ ys).size) → β} :
199200 (xs ++ ys).mapFinIdx f =
200201 xs.mapFinIdx (fun i a h => f i a (by simp; omega)) ++
@@ -203,7 +204,7 @@ theorem mapFinIdx_append {xs ys : Array α} {f : (i : Nat) → α → (h : i < (
203204 cases ys
204205 simp [List.mapFinIdx_append, Array.size]
205206
206- @[simp]
207+ @[simp, grind = ]
207208theorem mapFinIdx_push {xs : Array α} {a : α} {f : (i : Nat) → α → (h : i < (xs.push a).size) → β} :
208209 mapFinIdx (xs.push a) f =
209210 (mapFinIdx xs (fun i a h => f i a (by simp; omega))).push (f xs.size a (by simp)) := by
@@ -237,7 +238,7 @@ theorem exists_of_mem_mapFinIdx {b : β} {xs : Array α} {f : (i : Nat) → α
237238 rcases xs with ⟨xs⟩
238239 exact List.exists_of_mem_mapFinIdx (by simpa using h)
239240
240- @[simp] theorem mem_mapFinIdx {b : β} {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} :
241+ @[simp, grind = ] theorem mem_mapFinIdx {b : β} {xs : Array α} {f : (i : Nat) → α → (h : i < xs.size) → β} :
241242 b ∈ xs.mapFinIdx f ↔ ∃ (i : Nat) (h : i < xs.size), f i xs[i] h = b := by
242243 rcases xs with ⟨xs⟩
243244 simp
@@ -290,7 +291,7 @@ theorem mapFinIdx_eq_mapFinIdx_iff {xs : Array α} {f g : (i : Nat) → α → (
290291 rw [eq_comm, mapFinIdx_eq_iff]
291292 simp
292293
293- @[simp] theorem mapFinIdx_mapFinIdx {xs : Array α}
294+ @[simp, grind = ] theorem mapFinIdx_mapFinIdx {xs : Array α}
294295 {f : (i : Nat) → α → (h : i < xs.size) → β}
295296 {g : (i : Nat) → β → (h : i < (xs.mapFinIdx f).size) → γ} :
296297 (xs.mapFinIdx f).mapFinIdx g = xs.mapFinIdx (fun i a h => g i (f i a h) (by simpa using h)) := by
@@ -305,14 +306,14 @@ theorem mapFinIdx_eq_replicate_iff {xs : Array α} {f : (i : Nat) → α → (h
305306@[deprecated mapFinIdx_eq_replicate_iff (since := " 2025-03-18" )]
306307abbrev mapFinIdx_eq_mkArray_iff := @mapFinIdx_eq_replicate_iff
307308
308- @[simp] theorem mapFinIdx_reverse {xs : Array α} {f : (i : Nat) → α → (h : i < xs.reverse.size) → β} :
309+ @[simp, grind = ] theorem mapFinIdx_reverse {xs : Array α} {f : (i : Nat) → α → (h : i < xs.reverse.size) → β} :
309310 xs.reverse.mapFinIdx f = (xs.mapFinIdx (fun i a h => f (xs.size - 1 - i) a (by simp; omega))).reverse := by
310311 rcases xs with ⟨l⟩
311312 simp [List.mapFinIdx_reverse, Array.size]
312313
313314/-! ### mapIdx -/
314315
315- @[simp]
316+ @[simp, grind = ]
316317theorem mapIdx_empty {f : Nat → α → β} : mapIdx f #[] = #[] :=
317318 rfl
318319
@@ -332,13 +333,14 @@ theorem mapIdx_eq_zipIdx_map {xs : Array α} {f : Nat → α → β} :
332333@[deprecated mapIdx_eq_zipIdx_map (since := " 2025-01-21" )]
333334abbrev mapIdx_eq_zipWithIndex_map := @mapIdx_eq_zipIdx_map
334335
336+ @[grind =]
335337theorem mapIdx_append {xs ys : Array α} :
336338 (xs ++ ys).mapIdx f = xs.mapIdx f ++ ys.mapIdx (fun i => f (i + xs.size)) := by
337339 rcases xs with ⟨xs⟩
338340 rcases ys with ⟨ys⟩
339341 simp [List.mapIdx_append]
340342
341- @[simp]
343+ @[simp, grind = ]
342344theorem mapIdx_push {xs : Array α} {a : α} :
343345 mapIdx f (xs.push a) = (mapIdx f xs).push (f xs.size a) := by
344346 simp [← append_singleton, mapIdx_append]
@@ -360,7 +362,7 @@ theorem exists_of_mem_mapIdx {b : β} {xs : Array α}
360362 rw [mapIdx_eq_mapFinIdx] at h
361363 simpa [Fin.exists_iff] using exists_of_mem_mapFinIdx h
362364
363- @[simp] theorem mem_mapIdx {b : β} {xs : Array α} :
365+ @[simp, grind = ] theorem mem_mapIdx {b : β} {xs : Array α} :
364366 b ∈ mapIdx f xs ↔ ∃ (i : Nat) (h : i < xs.size), f i xs[i] = b := by
365367 constructor
366368 · intro h
@@ -414,7 +416,7 @@ theorem mapIdx_eq_mapIdx_iff {xs : Array α} :
414416 rcases xs with ⟨xs⟩
415417 simp [List.mapIdx_eq_mapIdx_iff]
416418
417- @[simp] theorem mapIdx_set {f : Nat → α → β} {xs : Array α} {i : Nat} {h : i < xs.size} {a : α} :
419+ @[simp, grind = ] theorem mapIdx_set {f : Nat → α → β} {xs : Array α} {i : Nat} {h : i < xs.size} {a : α} :
418420 (xs.set i a).mapIdx f = (xs.mapIdx f).set i (f i a) (by simpa) := by
419421 rcases xs with ⟨xs⟩
420422 simp [List.mapIdx_set]
@@ -424,17 +426,17 @@ theorem mapIdx_eq_mapIdx_iff {xs : Array α} :
424426 rcases xs with ⟨xs⟩
425427 simp [List.mapIdx_set]
426428
427- @[simp] theorem back ?_mapIdx {xs : Array α} {f : Nat → α → β} :
429+ @[simp, grind = ] theorem back ?_mapIdx {xs : Array α} {f : Nat → α → β} :
428430 (mapIdx f xs).back? = (xs.back?).map (f (xs.size - 1 )) := by
429431 rcases xs with ⟨xs⟩
430432 simp [List.getLast?_mapIdx]
431433
432- @[simp] theorem back_mapIdx {xs : Array α} {f : Nat → α → β} (h) :
434+ @[simp, grind = ] theorem back_mapIdx {xs : Array α} {f : Nat → α → β} (h) :
433435 (xs.mapIdx f).back h = f (xs.size - 1 ) (xs.back (by simpa using h)) := by
434436 rcases xs with ⟨xs⟩
435437 simp [List.getLast_mapIdx]
436438
437- @[simp] theorem mapIdx_mapIdx {xs : Array α} {f : Nat → α → β} {g : Nat → β → γ} :
439+ @[simp, grind = ] theorem mapIdx_mapIdx {xs : Array α} {f : Nat → α → β} {g : Nat → β → γ} :
438440 (xs.mapIdx f).mapIdx g = xs.mapIdx (fun i => g i ∘ f i) := by
439441 simp [mapIdx_eq_iff]
440442
@@ -447,7 +449,7 @@ theorem mapIdx_eq_replicate_iff {xs : Array α} {f : Nat → α → β} {b : β}
447449@[deprecated mapIdx_eq_replicate_iff (since := " 2025-03-18" )]
448450abbrev mapIdx_eq_mkArray_iff := @mapIdx_eq_replicate_iff
449451
450- @[simp] theorem mapIdx_reverse {xs : Array α} {f : Nat → α → β} :
452+ @[simp, grind = ] theorem mapIdx_reverse {xs : Array α} {f : Nat → α → β} :
451453 xs.reverse.mapIdx f = (mapIdx (fun i => f (xs.size - 1 - i)) xs).reverse := by
452454 rcases xs with ⟨xs⟩
453455 simp [List.mapIdx_reverse]
@@ -456,7 +458,7 @@ end Array
456458
457459namespace List
458460
459- @[grind] theorem mapFinIdxM_toArray [Monad m] [LawfulMonad m] {l : List α}
461+ @[grind = ] theorem mapFinIdxM_toArray [Monad m] [LawfulMonad m] {l : List α}
460462 {f : (i : Nat) → α → (h : i < l.length) → m β} :
461463 l.toArray.mapFinIdxM f = toArray <$> l.mapFinIdxM f := by
462464 let rec go (i : Nat) (acc : Array β) (inv : i + acc.size = l.length) :
@@ -477,7 +479,7 @@ namespace List
477479 simp only [Array.mapFinIdxM, mapFinIdxM]
478480 exact go _ #[] _
479481
480- @[grind] theorem mapIdxM_toArray [Monad m] [LawfulMonad m] {l : List α}
482+ @[grind = ] theorem mapIdxM_toArray [Monad m] [LawfulMonad m] {l : List α}
481483 {f : Nat → α → m β} :
482484 l.toArray.mapIdxM f = toArray <$> l.mapIdxM f := by
483485 let rec go (bs : List α) (acc : Array β) (inv : bs.length + acc.size = l.length) :
0 commit comments