lean4-htt/tests/lean/run/grind_ctor_ematch.lean
Leonardo de Moura 6ca699b1ff
feat: enable new E-matching pattern inference procedure in grind (#10432)
This PR enables the new E-matching pattern inference heuristic for
`grind`, implemented in PR #10422.
**Important**: Users can still use the old pattern inference heuristic
by setting:

```lean
set_option backward.grind.inferPattern true
```

In PR #10422, we introduced the new modifier `@[grind!]` for enabling
the minimal indexable subexpression condition. This option can now also
be set in `grind` parameters. Example:

```lean
opaque f : Nat → Nat
opaque fInv : Nat → Nat 
axiom fInv_f : fInv (f x) = x

/-- trace: [grind.ematch.pattern] fInv_f: [f #0] -/
#guard_msgs in 
set_option trace.grind.ematch.pattern true in
example {x y} : f x = f y → x = y := by
  /-
  The modifier `!` instructs `grind` to use the minimal indexable subexpression 
  (i.e., `f x` in this case).   
  -/
  grind [!fInv_f] 
```
2025-09-18 04:13:54 +00:00

74 lines
1.6 KiB
Text

module
inductive Even : Nat → Prop
| zero : Even 0
| plus_two {n} : Even n → Even (n + 2)
example : Even 2 := by
grind [Even.plus_two, Even.zero]
attribute [grind] Even.zero
attribute [grind] Even.plus_two
example : Even 2 := by
grind
example : Even 4 := by
grind
/--
error: `grind` failed
case grind
h : ¬Even 16
⊢ False
[grind] Goal diagnostics
[facts] Asserted facts
[prop] ¬Even 16
[prop] Even 14 → Even 16
[prop] Even 12 → Even 14
[prop] Even 10 → Even 12
[prop] Even 8 → Even 10
[prop] Even 6 → Even 8
[eqc] True propositions
[prop] Even 14 → Even 16
[prop] Even 12 → Even 14
[prop] Even 10 → Even 12
[prop] Even 8 → Even 10
[prop] Even 6 → Even 8
[eqc] False propositions
[prop] Even 16
[prop] Even 14
[prop] Even 12
[prop] Even 10
[prop] Even 8
[prop] Even 6
[ematch] E-matching patterns
[thm] Even.plus_two: [Even (#1 + 2)]
[thm] Even.zero: [Even `[0]]
[limits] Thresholds reached
[limit] maximum number of E-matching rounds has been reached, threshold: `(ematch := 5)`
[grind] Diagnostics
[thm] E-Matching instances
[thm] Even.plus_two ↦ 5
-/
#guard_msgs (error) in
example : Even 16 := by
grind
example : Even 16 := by
grind (gen := 9) (ematch := 9)
opaque f : Nat → Nat
axiom fax (x : Nat) : f (f x) = f x
example : f (f (f x)) = f x := by
grind [fax]
attribute [grind] fax
example : f (f (f x)) = f x := by
grind
/-- error: invalid `grind` theorem, failed to find an usable pattern using different modifiers -/
#guard_msgs in
attribute [grind] Nat.succ