-
Notifications
You must be signed in to change notification settings - Fork 447
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
This PR introduces the `[grind_eq]` attribute, designed to annotate equational theorems and functions for heuristic instantiations in the `grind` tactic. When applied to an equational theorem, the `[grind_eq]` attribute instructs the `grind` tactic to automatically use the annotated theorem to instantiate patterns during proof search. If applied to a function, it marks all equational theorems associated with that function. ```lean @[grind_eq] theorem foo_idempotent : foo (foo x) = foo x := ... @[grind_eq] def f (a : Nat) := match a with | 0 => 10 | x+1 => g (f x) ``` In the example above, the `grind` tactic will add instances of the theorem `foo_idempotent` to the local context whenever it encounters the pattern `foo (foo x)`. Similarly, functions annotated with `[grind_eq]` will propagate this annotation to their associated equational theorems.
- Loading branch information
1 parent
fd091d1
commit 675244d
Showing
4 changed files
with
120 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,76 @@ | ||
opaque g : Nat → Nat | ||
|
||
@[grind_eq] def f (a : Nat) := | ||
match a with | ||
| 0 => 10 | ||
| x+1 => g (f x) | ||
|
||
set_option grind.debug true | ||
set_option grind.debug.proofs true | ||
|
||
set_option trace.grind.ematch.instance true | ||
set_option trace.grind.assert true | ||
|
||
/-- | ||
info: [grind.assert] f (y + 1) = a | ||
[grind.assert] ¬a = g (f y) | ||
[grind.ematch.instance] f.eq_2: f y.succ = g (f y) | ||
[grind.assert] f (y + 1) = g (f y) | ||
-/ | ||
#guard_msgs (info) in | ||
example : f (y + 1) = a → a = g (f y):= by | ||
grind | ||
|
||
@[grind_eq] def app (xs ys : List α) := | ||
match xs with | ||
| [] => ys | ||
| x::xs => x :: app xs ys | ||
|
||
/-- | ||
info: [grind.assert] app [1, 2] ys = xs | ||
[grind.assert] ¬xs = 1 :: 2 :: ys | ||
[grind.ematch.instance] app.eq_2: app [1, 2] ys = 1 :: app [2] ys | ||
[grind.assert] app [1, 2] ys = 1 :: app [2] ys | ||
[grind.ematch.instance] app.eq_2: app [2] ys = 2 :: app [] ys | ||
[grind.assert] app [2] ys = 2 :: app [] ys | ||
[grind.ematch.instance] app.eq_1: app [] ys = ys | ||
[grind.assert] app [] ys = ys | ||
-/ | ||
#guard_msgs (info) in | ||
example : app [1, 2] ys = xs → xs = 1::2::ys := by | ||
grind | ||
|
||
opaque p : Nat → Nat → Prop | ||
opaque q : Nat → Prop | ||
|
||
@[grind_eq] theorem pq : p x x ↔ q x := by sorry | ||
|
||
/-- | ||
info: [grind.assert] p a a | ||
[grind.assert] ¬q a | ||
[grind.ematch.instance] pq: p a a ↔ q a | ||
[grind.assert] p a a = q a | ||
-/ | ||
#guard_msgs (info) in | ||
example : p a a → q a := by | ||
grind | ||
|
||
opaque appV (xs : Vector α n) (ys : Vector α m) : Vector α (n + m) := | ||
Vector.append xs ys | ||
|
||
@[grind_eq] | ||
theorem appV_assoc (a : Vector α n) (b : Vector α m) (c : Vector α n') : | ||
HEq (appV a (appV b c)) (appV (appV a b) c) := sorry | ||
|
||
/-- | ||
info: [grind.assert] x1 = appV a b | ||
[grind.assert] x2 = appV x1 c | ||
[grind.assert] x3 = appV b c | ||
[grind.assert] x4 = appV a x3 | ||
[grind.assert] ¬HEq x2 x4 | ||
[grind.ematch.instance] appV_assoc: HEq (appV a (appV b c)) (appV (appV a b) c) | ||
[grind.assert] HEq (appV a (appV b c)) (appV (appV a b) c) | ||
-/ | ||
#guard_msgs (info) in | ||
example : x1 = appV a b → x2 = appV x1 c → x3 = appV b c → x4 = appV a x3 → HEq x2 x4 := by | ||
grind |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters