lean4-htt/tests/lean/run/grind_trace.lean
Leonardo de Moura 37f3f0e1e2
feat: minimal indexable subexpressions in grind parameters (#10430)
This PR ensures users can select the "minimal indexable subexpression"
condition in `grind` parameters. Example, they can now write `grind [!
-> thmName]`. `grind?` will include the `!` modifier whenever users had
used `@[grind!]`. This PR also fixes a missing case in the new pattern
inference procedure.
It also adjusts some `grind` annotations and tests in preparation for
setting the new pattern inference heuristic as the new default.
2025-09-17 18:04:05 +00:00

114 lines
2.6 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

module
reset_grind_attrs%
attribute [grind =] List.length_cons
attribute [grind =] List.getElem?_eq_getElem
attribute [grind =] List.length_replicate
attribute [grind =] List.getElem_replicate
attribute [grind =] List.getElem?_eq_none
attribute [grind =] List.getElem?_eq_some_iff
attribute [grind =] getElem!_pos
attribute [grind =] Option.map_some Option.map_none
attribute [grind =] List.getElem?_map
attribute [grind =] List.getElem?_replicate
attribute [grind =] List.getLast?_eq_some_iff
attribute [grind ←] List.mem_concat_self
attribute [grind =] List.getElem_cons_zero in
attribute [grind =] List.getElem?_cons_zero in
/--
info: Try this:
grind only [= List.getElem?_eq_none, = List.getElem?_replicate, = List.getElem?_eq_getElem]
-/
#guard_msgs (info) in
theorem getElem?_replicate' : (List.replicate n a)[m]? = if m < n then some a else none := by
grind?
/--
info: Try this:
grind only [= List.length_cons]
-/
#guard_msgs (info) in
example : 0 < (x :: t).length := by
grind?
attribute [grind ext] List.ext_getElem?
/--
info: Try this:
grind only [= List.getElem?_eq_some_iff, = List.length_replicate, = List.getElem?_eq_none,
= List.getElem_replicate, = Option.map_some, = Option.map_none, = List.getElem?_replicate,
= List.getElem?_eq_getElem, = List.getElem?_map]
-/
#guard_msgs (info) in
theorem map_replicate' : (List.replicate n a).map f = List.replicate n (f a) := by
grind?
/--
info: Try this:
grind only [= List.getLast?_eq_some_iff, ← List.mem_concat_self]
-/
#guard_msgs (info) in
theorem mem_of_getLast?_eq_some' {xs : List α} {a : α} (h : xs.getLast? = some a) : a ∈ xs := by
grind?
@[expose] public def f : Nat → Nat
| 0 => 1
| _ => 2
/--
info: Try this:
grind only
-/
#guard_msgs (info) in
example : x = 0 → f x = 1 := by
unfold f
grind? -- should not include match equations
attribute [grind] f
/--
info: Try this:
grind only [f]
-/
#guard_msgs (info) in
example : x = 0 → f x = 1 := by
grind? [f]
opaque g : Nat → Nat
theorem gthm : g (g x) = g x := sorry
grind_pattern gthm => g (g x)
/--
info: Try this:
grind only [usr gthm]
-/
#guard_msgs (info) in
example : g (g (g x)) = g x := by
grind?
/--
error: `And` is marked as a built-in case-split for `grind` and cannot be erased
-/
#guard_msgs (error) in
attribute [-grind] And
/--
error: `And` is marked as a built-in case-split for `grind` and cannot be erased
-/
#guard_msgs (error) in
example : p ∧ q → p := by
grind [-And]
example : (List.replicate n a)[m]? = if m < n then some a else none := by
grind?
reset_grind_attrs%
example : (List.replicate n a)[m]? = if m < n then some a else none := by
fail_if_success grind?
sorry