This PR introduces a new feature that allows users to specify which inductive datatypes the `grind` tactic should perform case splits on. The configuration option `splitIndPred` is now set to `false` by default. The attribute `[grind cases]` is used to mark inductive datatypes and predicates that `grind` may case split on during the search. Additionally, the attribute `[grind cases eager]` can be used to mark datatypes and predicates for case splitting both during pre-processing and the search. Users can also write `grind [HasType]` or `grind [cases HasType]` to instruct `grind` to perform case splitting on the inductive predicate `HasType` in a specific instance. Similarly, `grind [-Or]` can be used to instruct `grind` not to case split on disjunctions. Co-authored-by: Leonardo de Moura <leodemoura@amazon.com>
50 lines
953 B
Text
50 lines
953 B
Text
variable (d : Nat) in
|
|
inductive X : Nat → Prop
|
|
| f {s : Nat} : X s
|
|
| g {s : Nat} : X d → X s
|
|
|
|
/--
|
|
error: `grind` failed
|
|
case grind.1
|
|
c : Nat
|
|
q : X c 0
|
|
s : Nat
|
|
h✝ : 0 = s
|
|
h : HEq ⋯ ⋯
|
|
⊢ False
|
|
[grind] Diagnostics
|
|
[facts] Asserted facts
|
|
[prop] X c 0
|
|
[prop] 0 = s
|
|
[prop] HEq ⋯ ⋯
|
|
[eqc] True propositions
|
|
[prop] X c 0
|
|
[prop] X c s
|
|
[eqc] Equivalence classes
|
|
[eqc] {s, 0}
|
|
case grind.2
|
|
c : Nat
|
|
q : X c 0
|
|
s : Nat
|
|
a✝¹ a✝ : X c c
|
|
h✝ : 0 = s
|
|
h : HEq ⋯ ⋯
|
|
⊢ False
|
|
[grind] Diagnostics
|
|
[facts] Asserted facts
|
|
[prop] X c 0
|
|
[prop] X c c
|
|
[prop] 0 = s
|
|
[prop] HEq ⋯ ⋯
|
|
[eqc] True propositions
|
|
[prop] X c 0
|
|
[prop] X c c
|
|
[prop] X c s
|
|
[eqc] Equivalence classes
|
|
[eqc] {s, 0}
|
|
[issues] Issues
|
|
[issue] this goal was not fully processed due to previous failures, threshold: `(failures := 1)`
|
|
-/
|
|
#guard_msgs (error) in
|
|
example {c : Nat} (q : X c 0) : False := by
|
|
grind [X]
|