An API for premise selection algorithms. #
This module provides a basic API for premise selection algorithms, which are used to suggest identifiers that should be introduced in a proof.
The core interface is the Selector type, which is a function from a metavariable
and a configuration to a list of suggestions.
The Selector is registered as an environment extension, and the trivial (no suggestions) implementation
is Lean.PremiseSelection.empty.
Lean does not provide a default premise selector, so this module is intended to be used in conjunction with a downstream package which registers a premise selector.
A Suggestion is essentially just an identifier and a confidence score that the identifier is relevant.
If the premise selection request included information about the intended use (e.g. in the simplifier, in grind, etc.)
the score may be adjusted for that application.
- name : Name
- score : Float
The score of the suggestion, as a probability that this suggestion should be used.
Optional flag associated with the suggestion, e.g. "←" or "=", if the premise selection algorithm is aware of the tactic consuming the results, and wants to suggest modifiers for this suggestion. E.g. this supports calling
simpin the reverse direction, or tellinggrindoraesopto use the theorem in a particular way.
Instances For
The maximum number of suggestions to return.
The tactic that is calling the premise selection, e.g.
simp,grind, oraesop. This may be used to adjust the score of the suggestionsA filter on suggestions; only suggestions returning
trueshould be returned. (It can be better to filter on the premise selection side, to ensure that enough suggestions are returned.)An optional arbitrary "hint" to the premise selection algorithm. There is no guarantee that the algorithm will make any use of the hint.
Potential use cases include a natural language comment provided by the user (e.g. allowing use of the premise selector as a search engine) or including context from the current proof and/or file.
We may later split these use cases into separate fields if necessary.
Instances For
Equations
- c.maxSuggestions = c.maxSuggestions?.getD 100
Instances For
Equations
Instances For
Construct a Selector (which acts on an MVarId)
from a function which takes the pretty printed goal.
Equations
- Lean.PremiseSelection.ppSelector selector g c = do let __do_lift ← Lean.Meta.ppGoal g selector (toString __do_lift) c
Instances For
Respect the Config.filter option by implementing it as a post-filter.
If a premise selection implementation does not natively handle the filter,
it should be wrapped with this function.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Wrapper for Selector that ensures
the maxSuggestions field in Config is respected, post-hoc.
Equations
- selector.maxSuggestions g c = do let suggestions ← selector g c match c.maxSuggestions? with | none => pure suggestions | some max => pure (suggestions.take max)
Instances For
Combine two premise selectors, returning the best suggestions.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Premises from a module whose name has one of the following components are not retrieved.
A premise whose name has one of the following components is not retrieved.
A premise whose type.getForallBody.getAppFn is a constant that has one of these prefixes is not retrieved.
Equations
- Lean.PremiseSelection.isDeniedModule env moduleName = (Lean.PremiseSelection.moduleDenyListExt.getState env).any fun (p : String) => moduleName.anyS fun (x : String) => x == p
Instances For
Equations
- One or more equations did not get rendered due to their size.
Instances For
The trivial premise selector, which returns no suggestions.
Equations
- Lean.PremiseSelection.empty x✝¹ x✝ = pure #[]
Instances For
Generate premise suggestions for the given metavariable, using the currently registered premise selector.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Currently the registration mechanism is just global state. This means that if multiple modules register premise selectors, the behaviour will be dependent on the order of loading modules.
We should replace this with a mechanism so that
premise selectors are configured via options in the lakefile, and
commands are only used to override in a single declaration or file.
Set the current premise selector.
Equations
- Lean.PremiseSelection.registerPremiseSelector selector = Lean.modifyEnv fun (env : Lean.Environment) => Lean.PremiseSelection.premiseSelectorExt.setState env (some selector)
Instances For
Specify a premise selection engine. Note that Lean does not ship a default premise selection engine, so this is only useful in conjunction with a downstream package which provides one.
Equations
- One or more equations did not get rendered due to their size.
Instances For
Equations
- One or more equations did not get rendered due to their size.