Skip to content

Commit 9d0f28f

Browse files
authored
perf: make {Array,List}.findIdx e-matching less aggressive (#14182)
This PR stops automatically connected `findIdx` to `findIdx?` through e-matching whenever `findIdx` is available and instead only does so when `findIdx` and `findIdx?` are available.
1 parent c60dff6 commit 9d0f28f

4 files changed

Lines changed: 5 additions & 9 deletions

File tree

src/Init/Data/Array/Find.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,12 +595,13 @@ theorem findIdx?_eq_none_of_findIdx?_eq_none {xs : Array α} {p q : α → Bool}
595595
rcases xs with ⟨xs⟩
596596
simpa using List.findIdx?_eq_none_of_findIdx?_eq_none (by simpa using w)
597597

598-
@[grind =]
599598
theorem findIdx_eq_getD_findIdx? {xs : Array α} {p : α → Bool} :
600599
xs.findIdx p = (xs.findIdx? p).getD xs.size := by
601600
rcases xs with ⟨xs⟩
602601
simp [List.findIdx_eq_getD_findIdx?]
603602

603+
grind_pattern findIdx_eq_getD_findIdx? => xs.findIdx p, xs.findIdx? p
604+
604605
theorem findIdx?_eq_some_le_of_findIdx?_eq_some {xs : Array α} {p q : α → Bool} (w : ∀ x ∈ xs, p x → q x) {i : Nat}
605606
(h : xs.findIdx? p = some i) : ∃ j, j ≤ i ∧ xs.findIdx? q = some j := by
606607
rcases xs with ⟨xs⟩

src/Init/Data/List/Basic.lean

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1700,7 +1700,7 @@ Examples:
17001700
| [], n => n
17011701
| a :: l, n => bif p a then n else go l (n + 1)
17021702

1703-
@[simp] theorem findIdx_nil {p : α → Bool} : [].findIdx p = 0 := rfl
1703+
@[simp, grind =] theorem findIdx_nil {p : α → Bool} : [].findIdx p = 0 := rfl
17041704

17051705
/-! ### idxOf -/
17061706

src/Init/Data/List/Find.lean

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,6 @@ theorem IsInfix.findIdx?_eq_none {l₁ l₂ : List α} {p : α → Bool} (h : l
980980
grind_pattern IsInfix.findIdx?_eq_none => l₁ <:+: l₂, l₁.findIdx? p
981981
grind_pattern IsInfix.findIdx?_eq_none => l₁ <:+: l₂, l₂.findIdx? p
982982

983-
@[grind =]
984983
theorem findIdx_eq_getD_findIdx? {xs : List α} {p : α → Bool} :
985984
xs.findIdx p = (xs.findIdx? p).getD xs.length := by
986985
induction xs with
@@ -989,6 +988,8 @@ theorem findIdx_eq_getD_findIdx? {xs : List α} {p : α → Bool} :
989988
simp only [findIdx_cons, findIdx?_cons]
990989
split <;> simp_all
991990

991+
grind_pattern findIdx_eq_getD_findIdx? => xs.findIdx p, xs.findIdx? p
992+
992993
@[simp] theorem findIdx?_subtype {p : α → Prop} {l : List { x // p x }}
993994
{f : { x // p x } → Bool} {g : α → Bool} (hf : ∀ x h, f ⟨x, h⟩ = g x) :
994995
l.findIdx? f = l.unattach.findIdx? g := by

tests/elab/grind_lint_1.lean

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,16 +103,10 @@ info: instantiating `Array.back?_empty` triggers 17 additional `grind` theorem i
103103
---
104104
info: instantiating `Array.count_empty` triggers 19 additional `grind` theorem instantiations
105105
---
106-
info: instantiating `Array.findIdx_empty` triggers 20 additional `grind` theorem instantiations
107-
---
108-
info: instantiating `Array.findIdx_singleton` triggers 16 additional `grind` theorem instantiations
109-
---
110106
info: Try this:
111107
[apply] #grind_lint check (min := 15) in Array
112108
#grind_lint inspect Array.back?_empty
113109
#grind_lint inspect Array.count_empty
114-
#grind_lint inspect Array.findIdx_empty
115-
#grind_lint inspect Array.findIdx_singleton
116110
-/
117111
#guard_msgs in
118112
#grind_lint check (min := 15) in Array

0 commit comments

Comments
 (0)