Skip to content

Commit b4660c9

Browse files
authored
feat: grind annotations for List/Array/Vector.ofFn theorems and List.Impl (#8749)
This PR adds grind annotations for `List/Array/Vector.ofFn` theorems and additional `List.Impl` find operations. The annotations are added to theorems that correspond to those already annotated in the List implementation, ensuring consistency across all three container types (List, Array, Vector) for ofFn operations and related functionality. Key theorems annotated include: - Element access theorems (`getElem_ofFn`, `getElem?_ofFn`) - Construction and conversion theorems (`ofFn_zero`, `toList_ofFn`, `toArray_ofFn`) - Membership theorems (`mem_ofFn`) - Head/tail operations (`back_ofFn`) - Monadic operations (`ofFnM_zero`, `toList_ofFnM`, `toArray_ofFnM`, `idRun_ofFnM`) - List.Impl find operations (`find?_singleton`, `find?_append`, `findSome?_singleton`, `findSome?_append`)
1 parent 2cddf23 commit b4660c9

File tree

4 files changed

+24
-24
lines changed

4 files changed

+24
-24
lines changed

src/Init/Data/Array/OfFn.lean

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ namespace Array
2323

2424
/-! ### ofFn -/
2525

26-
@[simp] theorem ofFn_zero {f : Fin 0 → α} : ofFn f = #[] := by
26+
@[simp, grind =] theorem ofFn_zero {f : Fin 0 → α} : ofFn f = #[] := by
2727
simp [ofFn, ofFn.go]
2828

2929
theorem ofFn_succ {f : Fin (n+1) → α} :
@@ -42,10 +42,10 @@ theorem ofFn_add {n m} {f : Fin (n + m) → α} :
4242
| zero => simp
4343
| succ m ih => simp [ofFn_succ, ih]
4444

45-
@[simp] theorem _root_.List.toArray_ofFn {f : Fin n → α} : (List.ofFn f).toArray = Array.ofFn f := by
45+
@[simp, grind =] theorem _root_.List.toArray_ofFn {f : Fin n → α} : (List.ofFn f).toArray = Array.ofFn f := by
4646
ext <;> simp
4747

48-
@[simp] theorem toList_ofFn {f : Fin n → α} : (Array.ofFn f).toList = List.ofFn f := by
48+
@[simp, grind =] theorem toList_ofFn {f : Fin n → α} : (Array.ofFn f).toList = List.ofFn f := by
4949
apply List.ext_getElem <;> simp
5050

5151
theorem ofFn_succ' {f : Fin (n+1) → α} :
@@ -58,7 +58,7 @@ theorem ofFn_eq_empty_iff {f : Fin n → α} : ofFn f = #[] ↔ n = 0 := by
5858
rw [← Array.toList_inj]
5959
simp
6060

61-
@[simp 500]
61+
@[simp 500, grind =]
6262
theorem mem_ofFn {n} {f : Fin n → α} {a : α} : a ∈ ofFn f ↔ ∃ i, f i = a := by
6363
constructor
6464
· intro w
@@ -73,7 +73,7 @@ theorem mem_ofFn {n} {f : Fin n → α} {a : α} : a ∈ ofFn f ↔ ∃ i, f i =
7373
def ofFnM {n} [Monad m] (f : Fin n → m α) : m (Array α) :=
7474
Fin.foldlM n (fun xs i => xs.push <$> f i) (Array.emptyWithCapacity n)
7575

76-
@[simp]
76+
@[simp, grind =]
7777
theorem ofFnM_zero [Monad m] {f : Fin 0 → m α} : ofFnM f = pure #[] := by
7878
simp [ofFnM]
7979

@@ -109,7 +109,7 @@ theorem ofFnM_add {n m} [Monad m] [LawfulMonad m] {f : Fin (n + k) → m α} :
109109
funext x
110110
simp
111111

112-
@[simp] theorem toList_ofFnM [Monad m] [LawfulMonad m] {f : Fin n → m α} :
112+
@[simp, grind =] theorem toList_ofFnM [Monad m] [LawfulMonad m] {f : Fin n → m α} :
113113
toList <$> ofFnM f = List.ofFnM f := by
114114
induction n with
115115
| zero => simp

src/Init/Data/List/Impl.lean

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,7 @@ Examples:
261261
/-- Tail recursive implementation of `findRev?`. This is only used at runtime. -/
262262
def findRev?TR (p : α → Bool) (l : List α) : Option α := l.reverse.find? p
263263

264-
@[simp] theorem find?_singleton {a : α} : [a].find? p = if p a then some a else none := by
264+
@[simp, grind =] theorem find?_singleton {a : α} : [a].find? p = if p a then some a else none := by
265265
simp only [find?]
266266
split <;> simp_all
267267

@@ -287,12 +287,12 @@ def findRev?TR (p : α → Bool) (l : List α) : Option α := l.reverse.find? p
287287
/-- Tail recursive implementation of `finSomedRev?`. This is only used at runtime. -/
288288
def findSomeRev?TR (f : α → Option β) (l : List α) : Option β := l.reverse.findSome? f
289289

290-
@[simp] theorem findSome?_singleton {a : α} :
290+
@[simp, grind =] theorem findSome?_singleton {a : α} :
291291
[a].findSome? f = f a := by
292292
simp only [findSome?_cons, findSome?_nil]
293293
split <;> simp_all
294294

295-
@[simp] theorem findSome?_append {xs ys : List α} : (xs ++ ys).findSome? f = (xs.findSome? f).or (ys.findSome? f) := by
295+
@[simp, grind =] theorem findSome?_append {xs ys : List α} : (xs ++ ys).findSome? f = (xs.findSome? f).or (ys.findSome? f) := by
296296
induction xs with
297297
| nil => simp [findSome?]
298298
| cons x xs ih =>

src/Init/Data/List/OfFn.lean

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,14 +34,14 @@ to each potential index in order, starting at `0`.
3434
def ofFnM {n} [Monad m] (f : Fin n → m α) : m (List α) :=
3535
List.reverse <$> Fin.foldlM n (fun xs i => (· :: xs) <$> f i) []
3636

37-
@[simp]
37+
@[simp, grind =]
3838
theorem length_ofFn {f : Fin n → α} : (ofFn f).length = n := by
3939
simp only [ofFn]
4040
induction n with
4141
| zero => simp
4242
| succ n ih => simp [Fin.foldr_succ, ih]
4343

44-
@[simp]
44+
@[simp, grind =]
4545
protected theorem getElem_ofFn {f : Fin n → α} (h : i < (ofFn f).length) :
4646
(ofFn f)[i] = f ⟨i, by simp_all⟩ := by
4747
simp only [ofFn]
@@ -55,7 +55,7 @@ protected theorem getElem_ofFn {f : Fin n → α} (h : i < (ofFn f).length) :
5555
apply ih
5656
simp_all
5757

58-
@[simp]
58+
@[simp, grind =]
5959
protected theorem getElem?_ofFn {f : Fin n → α} :
6060
(ofFn f)[i]? = if h : i < n then some (f ⟨i, h⟩) else none :=
6161
if h : i < (ofFn f).length
@@ -67,7 +67,7 @@ protected theorem getElem?_ofFn {f : Fin n → α} :
6767
simpa using h
6868

6969
/-- `ofFn` on an empty domain is the empty list. -/
70-
@[simp]
70+
@[simp, grind =]
7171
theorem ofFn_zero {f : Fin 0 → α} : ofFn f = [] := by
7272
rw [ofFn, Fin.foldr_zero]
7373

@@ -98,7 +98,7 @@ theorem ofFn_add {n m} {f : Fin (n + m) → α} :
9898
theorem ofFn_eq_nil_iff {f : Fin n → α} : ofFn f = [] ↔ n = 0 := by
9999
cases n <;> simp only [ofFn_zero, ofFn_succ, eq_self_iff_true, Nat.succ_ne_zero, reduceCtorEq]
100100

101-
@[simp 500]
101+
@[simp 500, grind =]
102102
theorem mem_ofFn {n} {f : Fin n → α} {a : α} : a ∈ ofFn f ↔ ∃ i, f i = a := by
103103
constructor
104104
· intro w
@@ -107,17 +107,17 @@ theorem mem_ofFn {n} {f : Fin n → α} {a : α} : a ∈ ofFn f ↔ ∃ i, f i =
107107
· rintro ⟨i, rfl⟩
108108
apply mem_of_getElem (i := i) <;> simp
109109

110-
theorem head_ofFn {n} {f : Fin n → α} (h : ofFn f ≠ []) :
110+
@[grind =] theorem head_ofFn {n} {f : Fin n → α} (h : ofFn f ≠ []) :
111111
(ofFn f).head h = f ⟨0, Nat.pos_of_ne_zero (mt ofFn_eq_nil_iff.2 h)⟩ := by
112112
rw [← getElem_zero (length_ofFn ▸ Nat.pos_of_ne_zero (mt ofFn_eq_nil_iff.2 h)),
113113
List.getElem_ofFn]
114114

115-
theorem getLast_ofFn {n} {f : Fin n → α} (h : ofFn f ≠ []) :
115+
@[grind =]theorem getLast_ofFn {n} {f : Fin n → α} (h : ofFn f ≠ []) :
116116
(ofFn f).getLast h = f ⟨n - 1, Nat.sub_one_lt (mt ofFn_eq_nil_iff.2 h)⟩ := by
117117
simp [getLast_eq_getElem, length_ofFn, List.getElem_ofFn]
118118

119119
/-- `ofFnM` on an empty domain is the empty list. -/
120-
@[simp]
120+
@[simp, grind =]
121121
theorem ofFnM_zero [Monad m] [LawfulMonad m] {f : Fin 0 → m α} : ofFnM f = pure [] := by
122122
simp [ofFnM]
123123

src/Init/Data/Vector/OfFn.lean

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@ set_option linter.indexVariables true -- Enforce naming conventions for index va
2020

2121
namespace Vector
2222

23-
@[simp] theorem getElem_ofFn {α n} {f : Fin n → α} (h : i < n) :
23+
@[simp, grind =] theorem getElem_ofFn {α n} {f : Fin n → α} (h : i < n) :
2424
(Vector.ofFn f)[i] = f ⟨i, by simpa using h⟩ := by
2525
simp [ofFn]
2626

27-
theorem getElem?_ofFn {α n} {f : Fin n → α} :
27+
@[simp, grind =] theorem getElem?_ofFn {α n} {f : Fin n → α} :
2828
(ofFn f)[i]? = if h : i < n then some (f ⟨i, h⟩) else none := by
2929
simp [getElem?_def]
3030

31-
@[simp 500]
31+
@[simp 500, grind =]
3232
theorem mem_ofFn {n} {f : Fin n → α} {a : α} : a ∈ ofFn f ↔ ∃ i, f i = a := by
3333
constructor
3434
· intro w
@@ -37,7 +37,7 @@ theorem mem_ofFn {n} {f : Fin n → α} {a : α} : a ∈ ofFn f ↔ ∃ i, f i =
3737
· rintro ⟨i, rfl⟩
3838
apply mem_of_getElem (i := i) <;> simp
3939

40-
theorem back_ofFn {n} [NeZero n] {f : Fin n → α} :
40+
@[grind =] theorem back_ofFn {n} [NeZero n] {f : Fin n → α} :
4141
(ofFn f).back = f ⟨n - 1, by have := NeZero.ne n; omega⟩ := by
4242
simp [back]
4343

@@ -71,7 +71,7 @@ def ofFnM {n} [Monad m] (f : Fin n → m α) : m (Vector α n) :=
7171
else
7272
pure ⟨acc, by omega⟩
7373

74-
@[simp]
74+
@[simp, grind =]
7575
theorem ofFnM_zero [Monad m] {f : Fin 0 → m α} : Vector.ofFnM f = pure #v[] := by
7676
simp [ofFnM, ofFnM.go]
7777

@@ -114,13 +114,13 @@ theorem ofFnM_add {n m} [Monad m] [LawfulMonad m] {f : Fin (n + k) → m α} :
114114
| zero => simp
115115
| succ k ih => simp [ofFnM_succ, ih, ← push_append]
116116

117-
@[simp, grind] theorem toArray_ofFnM [Monad m] [LawfulMonad m] {f : Fin n → m α} :
117+
@[simp, grind =] theorem toArray_ofFnM [Monad m] [LawfulMonad m] {f : Fin n → m α} :
118118
toArray <$> ofFnM f = Array.ofFnM f := by
119119
induction n with
120120
| zero => simp
121121
| succ n ih => simp [ofFnM_succ, Array.ofFnM_succ, ← ih]
122122

123-
@[simp, grind] theorem toList_ofFnM [Monad m] [LawfulMonad m] {f : Fin n → m α} :
123+
@[simp, grind =] theorem toList_ofFnM [Monad m] [LawfulMonad m] {f : Fin n → m α} :
124124
toList <$> Vector.ofFnM f = List.ofFnM f := by
125125
unfold toList
126126
suffices Array.toList <$> (toArray <$> ofFnM f) = List.ofFnM f by

0 commit comments

Comments
 (0)