Module docstring
{"grind tactic and related tactics.
"}
{"grind tactic and related tactics.
"}
Lean.Parser.resetGrindAttrs
definition
: Lean.ParserDescr✝
Lean.Parser.Attr.grindEq
definition
: Lean.ParserDescr✝
syntax grindEq := "= "
Lean.Parser.Attr.grindEqBoth
definition
: Lean.ParserDescr✝
syntax grindEqBoth := atomic("_" "=" "_ ")
Lean.Parser.Attr.grindEqRhs
definition
: Lean.ParserDescr✝
syntax grindEqRhs := atomic("=" "_ ")
Lean.Parser.Attr.grindEqBwd
definition
: Lean.ParserDescr✝
Lean.Parser.Attr.grindBwd
definition
: Lean.ParserDescr✝
syntax grindBwd := "← " <|> "-> "
Lean.Parser.Attr.grindFwd
definition
: Lean.ParserDescr✝
syntax grindFwd := "→ " <|> "<- "
Lean.Parser.Attr.grindRL
definition
: Lean.ParserDescr✝
syntax grindRL := "⇐ " <|> "<= "
Lean.Parser.Attr.grindLR
definition
: Lean.ParserDescr✝
syntax grindLR := "⇒ " <|> "=> "
Lean.Parser.Attr.grindUsr
definition
: Lean.ParserDescr✝
syntax grindUsr := &"usr "
Lean.Parser.Attr.grindCases
definition
: Lean.ParserDescr✝
syntax grindCases := &"cases "
Lean.Parser.Attr.grindCasesEager
definition
: Lean.ParserDescr✝
Lean.Parser.Attr.grindIntro
definition
: Lean.ParserDescr✝
syntax grindIntro := &"intro "
Lean.Parser.Attr.grindMod
definition
: Lean.ParserDescr✝
Lean.Parser.Attr.grind
definition
: Lean.ParserDescr✝
Lean.Grind.Config
structure
/--
The configuration for `grind`.
Passed to `grind` using, for example, the `grind (config := { matchEqs := true })` syntax.
-/
structure Config where
/-- If `trace` is `true`, `grind` records used E-matching theorems and case-splits. -/
trace : Bool := false
/-- Maximum number of case-splits in a proof search branch. It does not include splits performed during normalization. -/
splits : Nat := 8
/-- Maximum number of E-matching (aka heuristic theorem instantiation) rounds before each case split. -/
ematch : Nat := 5
/--
Maximum term generation.
The input goal terms have generation 0. When we instantiate a theorem using a term from generation `n`,
the new terms have generation `n+1`. Thus, this parameter limits the length of an instantiation chain. -/
gen : Nat := 5
/-- Maximum number of theorem instances generated using E-matching in a proof search tree branch. -/
instances : Nat := 1000
/-- If `matchEqs` is `true`, `grind` uses `match`-equations as E-matching theorems. -/
matchEqs : Bool := true
/-- If `splitMatch` is `true`, `grind` performs case-splitting on `match`-expressions during the search. -/
splitMatch : Bool := true
/-- If `splitIte` is `true`, `grind` performs case-splitting on `if-then-else` expressions during the search. -/
splitIte : Bool := true
/--
If `splitIndPred` is `true`, `grind` performs case-splitting on inductive predicates.
Otherwise, it performs case-splitting only on types marked with `[grind cases]` attribute. -/
splitIndPred : Bool := false
/-- By default, `grind` halts as soon as it encounters a sub-goal where no further progress can be made. -/
failures : Nat := 1
/-- Maximum number of heartbeats (in thousands) the canonicalizer can spend per definitional equality test. -/
canonHeartbeats : Nat := 1000
/-- If `ext` is `true`, `grind` uses extensionality theorems available in the environment. -/
ext : Bool := true
/-- If `verbose` is `false`, additional diagnostics information is not collected. -/
verbose : Bool := true
/-- If `clean` is `true`, `grind` uses `expose_names` and only generates accessible names. -/
clean : Bool := true
/--
If `qlia` is `true`, `grind` may generate counterexamples for integer constraints
using rational numbers, and ignoring divisibility constraints.
This approach is cheaper but incomplete. -/
qlia : Bool := false
/--
If `mbtc` is `true`, `grind` will use model-based theory commbination for creating new case splits.
See paper "Model-based Theory Combination" for details.
-/
mbtc : Bool := true
/--
When set to `true` (default: `true`), local definitions are unfolded during normalization and internalization.
In other words, given a local context with an entry `x : t := e`, the free variable `x` is reduced to `e`.
Note that this behavior is also available in `simp`, but there its default is `false` because `simp` is not
always used as a terminal tactic, and it important to preserve the abstractions introduced by users.
Additionally, in `grind` we observed that `zetaDelta` is particularly important when combined with function induction.
In such scenarios, the same let-expressions can be introduced by function induction and also by unfolding the
corresponding definition. We want to avoid a situation in which `zetaDelta` is not applied to let-declarations
introduced by function induction while `zeta` unfolds the definition, causing a mismatch.
Finally, note that congruence closure is less effective on terms containing many binders such as
`lambda` and `let` expressions.
-/
zetaDelta := true
/--
When `true` (default: `true`), performs zeta reduction of let expressions during normalization.
That is, `let x := v; e[x]` reduces to `e[v]`. See also `zetaDelta`.
-/
zeta := true
deriving Inhabited, BEq
Lean.Grind.instInhabitedConfig
instance
: Inhabited✝ (@Lean.Grind.Config)
Lean.Grind.instBEqConfig
instance
: BEq✝ (@Lean.Grind.Config✝)
BEq
Lean.Parser.Tactic.grindErase
definition
: Lean.ParserDescr✝
syntax grindErase := "-" ident
Lean.Parser.Tactic.grindLemma
definition
: Lean.ParserDescr✝
syntax grindLemma := (Attr.grindMod)? ident
Lean.Parser.Tactic.grindParam
definition
: Lean.ParserDescr✝
syntax grindParam := grindErase <|> grindLemma
Lean.Parser.Tactic.grind
definition
: Lean.ParserDescr✝
Lean.Parser.Tactic.grindTrace
definition
: Lean.ParserDescr✝