8.6. Configuring Simplification

simp is primarily configured via a configuration parameter, passed as a named argument called config.

structure
Lean.Meta.Simp.Config : Type

The configuration for simp. Passed to simp using, for example, the simp (config := {contextual := true}) syntax.

See also Lean.Meta.Simp.neutralConfig and Lean.Meta.DSimp.Config.

Constructor

Lean.Meta.Simp.Config.mk (maxSteps maxDischargeDepth : Nat) (contextual memoize singlePass zeta beta eta : Bool) (etaStruct : Lean.Meta.EtaStructMode) (iota proj decide arith autoUnfold dsimp failIfUnchanged ground unfoldPartialApp zetaDelta index implicitDefEqProofs : Bool) : Lean.Meta.Simp.Config

Fields

zetaDelta:Bool

When true (default: false), local definitions are unfolded. That is, given a local context containing entry x : t := e, the free variable x reduces to e.

etaStruct:Lean.Meta.EtaStructMode

Configures how to determine definitional equality between two structure instances. See documentation for Lean.Meta.EtaStructMode.

contextual:Bool

When contextual is true (default: false) and simplification encounters an implication p → q it includes p as an additional simp lemma when simplifying q.

index:Bool

When index (default : true) is false, simp will only use the root symbol to find candidate simp theorems. It approximates Lean 3 simp behavior.

singlePass:Bool

When singlePass is true (default: false), the simplifier runs through a single round of simplification, which consists of running pre-methods, recursing using congruence lemmas, and then running post-methods. Otherwise, when it is false, it iteratively applies this simplification procedure.

eta:Bool

TODO (currently unimplemented). When true (default: true), performs eta reduction for fun expressions. That is, (fun x => f x) reduces to f.

arith:Bool

When true (default: false), simplifies simple arithmetic expressions.

maxSteps:Nat

The maximum number of subexpressions to visit when performing simplification. The default is 100000.

failIfUnchanged:Bool

If failIfUnchanged is true (default: true), then calls to simp, dsimp, or simp_all will fail if they do not make progress.

iota:Bool

When true (default: true), reduces match expressions applied to constructors.

memoize:Bool

When true (default: true) then the simplifier caches the result of simplifying each subexpression, if possible.

zeta:Bool

When true (default: true), performs zeta reduction of let expressions. That is, let x := v; e[x] reduces to e[v]. See also zetaDelta.

ground:Bool

If ground is true (default: false), then ground terms are reduced. A term is ground when it does not contain free or meta variables. Reduction is interrupted at a function application f ... if f is marked to not be unfolded. Ground term reduction applies @[seval] lemmas.

decide:Bool

When true (default: false), rewrites a proposition p to True or False by inferring a Decidable p instance and reducing it.

maxDischargeDepth:Nat

When simp discharges side conditions for conditional lemmas, it can recursively apply simplification. The maxDischargeDepth (default: 2) is the maximum recursion depth when recursively applying simplification to side conditions.

implicitDefEqProofs:Bool

When true (default: true), simp will not create a proof for a rewriting rule associated with an rfl-theorem. Rewriting rules are provided by users by annotating theorems with the attribute @[simp]. If the proof of the theorem is just rfl (reflexivity), and implicitDefEqProofs := true, simp will not create a proof term which is an application of the annotated theorem.

autoUnfold:Bool

When true (default: false), unfolds definitions. This can be enabled using the simp! syntax.

beta:Bool

When true (default: true), performs beta reduction of applications of fun expressions. That is, (fun x => e[x]) v reduces to e[v].

proj:Bool

When true (default: true), reduces projections of structure constructors.

unfoldPartialApp:Bool

If unfoldPartialApp is true (default: false), then calls to simp, dsimp, or simp_all will unfold even partial applications of f when we request f to be unfolded.

dsimp:Bool

When true (default: true) then switches to dsimp on dependent arguments if there is no congruence theorem that would allow simp to visit them. When dsimp is false, then the argument is not visited.

def
Lean.Meta.Simp.neutralConfig
    : Lean.Meta.Simp.Config

A neutral configuration for simp, turning off all reductions and other built-in simplifications.

structure
Lean.Meta.DSimp.Config : Type

The configuration for dsimp. Passed to dsimp using, for example, the dsimp (config := {zeta := false}) syntax.

Implementation note: this structure is only used for processing the (config := ...) syntax, and it is not used internally. It is immediately converted to Lean.Meta.Simp.Config by Lean.Elab.Tactic.elabSimpConfig.

Constructor

Lean.Meta.DSimp.Config.mk (zeta beta eta : Bool) (etaStruct : Lean.Meta.EtaStructMode) (iota proj decide autoUnfold failIfUnchanged unfoldPartialApp zetaDelta index : Bool) : Lean.Meta.DSimp.Config

Fields

zetaDelta:Bool

When true (default: false), local definitions are unfolded. That is, given a local context containing entry x : t := e, the free variable x reduces to e.

etaStruct:Lean.Meta.EtaStructMode

Configures how to determine definitional equality between two structure instances. See documentation for Lean.Meta.EtaStructMode.

index:Bool

When index (default : true) is false, simp will only use the root symbol to find candidate simp theorems. It approximates Lean 3 simp behavior.

eta:Bool

TODO (currently unimplemented). When true (default: true), performs eta reduction for fun expressions. That is, (fun x => f x) reduces to f.

failIfUnchanged:Bool

If failIfUnchanged is true (default: true), then calls to simp, dsimp, or simp_all will fail if they do not make progress.

iota:Bool

When true (default: true), reduces match expressions applied to constructors.

zeta:Bool

When true (default: true), performs zeta reduction of let expressions. That is, let x := v; e[x] reduces to e[v]. See also zetaDelta.

decide:Bool

When true (default: false), rewrites a proposition p to True or False by inferring a Decidable p instance and reducing it.

autoUnfold:Bool

When true (default: false), unfolds definitions. This can be enabled using the simp! syntax.

beta:Bool

When true (default: true), performs beta reduction of applications of fun expressions. That is, (fun x => e[x]) v reduces to e[v].

proj:Bool

When true (default: true), reduces projections of structure constructors.

unfoldPartialApp:Bool

If unfoldPartialApp is true (default: false), then calls to simp, dsimp, or simp_all will unfold even partial applications of f when we request f to be unfolded.

8.6.1. Options

Some global options affect simp:

option
simprocs

Default value: true

Enable/disable simprocs (simplification procedures).

option
tactic.simp.trace

Default value: false

When tracing is enabled, calls to simp or dsimp will print an equivalent simp only call.

option
linter.unnecessarySimpa

Default value: true

enable the 'unnecessary simpa' linter

option
trace.Meta.Tactic.simp.rewrite

Default value: false

enable/disable tracing for the given module and submodules

option
trace.Meta.Tactic.simp.discharge

Default value: false

enable/disable tracing for the given module and submodules