Evd
This file defines the pervasive unification state used everywhere in Coq tactic engine. It is very low-level and most of the functions exported here are irrelevant to the standard API user. Consider using Evarutil
or Proofview
instead.
A unification state (of type evar_map
) is primarily a finite mapping from existential variables to records containing the type of the evar (evar_concl
), the context under which it was introduced (evar_hyps
) and its definition (evar_body
). evar_extra
is used to add any other kind of information.
It also contains conversion constraints, debugging information and information about meta variables.
type etypes = econstr
module Filter : sig ... end
module Abstraction : sig ... end
val evar_context : 'a evar_info -> (econstr, etypes, erelevance) Context.Named.pt
Context of the evar.
val evar_hyps : 'a evar_info -> Environ.named_context_val
Context of the evar.
List of possible solutions when known that it is a finite list
val evar_source : 'a evar_info -> Evar_kinds.t Loc.located
Boolean mask over evar_hyps
. Should have the same length. When filtered out, the corresponding variable is not allowed to occur in the solution
val evar_abstract_arguments : undefined evar_info -> Abstraction.t
Boolean information over evar_hyps
, telling if an hypothesis instance can be imitated or should stay abstract in HO unification problems and inversion (see second_order_matching_with_args
for its use).
val evar_relevance : 'a evar_info -> erelevance
Relevance of the conclusion of the evar.
val evar_filtered_context : 'a evar_info -> (econstr, etypes, erelevance) Context.Named.pt
val evar_filtered_hyps : 'a evar_info -> Environ.named_context_val
val evar_env : Environ.env -> 'a evar_info -> Environ.env
val evar_filtered_env : Environ.env -> 'a evar_info -> Environ.env
*
Type of unification state. Essentially a bunch of state-passing data needed to handle incremental term construction.
val empty : evar_map
The empty evar map.
val from_env : ?binders:Names.lident list -> Environ.env -> evar_map
The empty evar map with given universe context, taking its initial universes from env, possibly with initial universe binders. This is the main entry point at the beginning of the process of interpreting a declaration (e.g. before entering the interpretation of a Theorem statement).
The empty evar map with given universe context. This is the main entry point when resuming from a already interpreted declaration (e.g. after having interpreted a Theorem statement and preparing to open a goal).
val is_empty : evar_map -> bool
Whether an evarmap is empty.
val has_undefined : evar_map -> bool
has_undefined sigma
is true
if and only if there are uninstantiated evars in sigma
.
val has_given_up : evar_map -> bool
has_given_up sigma
is true
if and only if there are given up evars in sigma
.
val has_shelved : evar_map -> bool
has_shelved sigma
is true
if and only if there are shelved evars in sigma
.
val new_pure_evar : ?src:Evar_kinds.t Loc.located -> ?filter:Filter.t -> ?relevance:erelevance -> ?abstract_arguments:Abstraction.t ->
?candidates:econstr list -> ?name:Names.Id.t -> ?typeclass_candidate:bool -> Environ.named_context_val -> evar_map -> etypes -> evar_map * Evar.t
Low-level interface to create an evar.
add sigma ev info
adds ev
with evar info info
in sigma. Precondition: ev must not preexist in sigma
.
val find : evar_map -> Evar.t -> any_evar_info
Recover the data associated to an evar.
Same as find
but restricted to undefined evars. For efficiency reasons.
Remove the body of an evar. Only there for backward compat, do not use.
val fold : (Evar.t -> any_evar_info -> 'a -> 'a) -> evar_map -> 'a -> 'a
Apply a function to all evars and their associated info in an evarmap.
Same as fold
, but restricted to undefined evars. For efficiency reasons.
Apply the given function to all evars in the map. Beware: this function expects the argument function to preserve the kind of evar_body
, i.e. it must send Evar_empty
to Evar_empty
and Evar_defined c
to some Evar_defined c'
.
val raw_map_undefined : (Evar.t -> undefined evar_info -> undefined evar_info) -> evar_map -> evar_map
Same as raw_map
, but restricted to undefined evars. For efficiency reasons.
Set the body of an evar to the given constr. It is expected that:
Same as define ev body evd
, except the body must be an existential variable ev'
. This additionally makes ev'
inherit the obligation
and typeclass
flags of ev
.
Map the function on all terms in the evar map.
val add_constraints : evar_map -> Univ.Constraints.t -> evar_map
Add universe constraints in an evar map.
val add_quconstraints : evar_map -> Sorts.QUConstraints.t -> evar_map
val undefined_map : evar_map -> undefined evar_info Evar.Map.t
Access the undefined evar mapping directly.
val defined_map : evar_map -> defined evar_info Evar.Map.t
Access the defined evar mapping directly.
Drop the defined evars in the second evar map which did not exist in the first.
val is_maybe_typeclass_hook : (evar_map -> Constr.constr -> bool) Hook.t
val existential_value : evar_map -> econstr Constr.pexistential -> econstr
existential_value sigma ev
raises NotInstantiatedEvar
if ev
has no body and Not_found
if it does not exist in sigma
val existential_type_opt : evar_map -> econstr Constr.pexistential -> etypes option
val existential_type : evar_map -> econstr Constr.pexistential -> etypes
val existential_opt_value : evar_map -> econstr Constr.pexistential -> econstr option
Same as existential_value
but returns an option instead of raising an exception.
val existential_opt_value0 : evar_map -> Constr.existential -> Constr.constr option
val evar_handler : evar_map -> CClosure.evar_handler
val existential_expand_value0 : evar_map -> Constr.existential -> Constr.constr CClosure.evar_expansion
val expand_existential : evar_map -> econstr Constr.pexistential -> econstr list
Returns the full evar instance with implicit default variables turned into explicit Var
nodes.
val expand_existential0 : evar_map -> Constr.constr Constr.pexistential -> Constr.constr list
val restrict : Evar.t -> Filter.t -> ?candidates:econstr list -> ?src:Evar_kinds.t Loc.located -> evar_map -> evar_map * Evar.t
Restrict an undefined evar into a new evar by filtering context and possibly limiting the instances to a set of candidates (candidates are filtered according to the filter)
val update_source : evar_map -> Evar.t -> Evar_kinds.t Loc.located -> evar_map
To update the source a posteriori, e.g. when an evar type of another evar has to refer to this other evar, with a mutual dependency
val get_aliased_evars : evar_map -> Evar.t Evar.Map.t
The map of aliased evars
Tell if an evar has been aliased to another evar, and if yes, which
If any, the evar with highest id with a non-empty list of candidates.
Mark the given set of evars as available for resolution. (The previous marked set is replaced, not added to.)
Precondition: they should indeed refer to undefined typeclass evars.
val get_typeclass_evars : evar_map -> Evar.Set.t
The set of undefined typeclass evars
Is the evar declared resolvable for typeclass resolution
val get_obligation_evars : evar_map -> Evar.Set.t
The set of obligation evars
val get_impossible_case_evars : evar_map -> Evar.Set.t
Set of undefined evars with ImpossibleCase evar source.
Change the type of an undefined evar to a new type assumed to be a subtype of its current type; subtyping must be ensured by caller
val evar_ident : Evar.t -> evar_map -> Names.Id.t option
val rename : Evar.t -> Names.Id.t -> evar_map -> evar_map
val evar_key : Names.Id.t -> evar_map -> Evar.t
val evar_names : evar_map -> Nameops.Fresh.t
val dependent_evar_ident : Evar.t -> evar_map -> Names.Id.t
type side_effects = {
seff_private : Safe_typing.private_constants; |
seff_roles : side_effect_role Names.Cmap.t; |
}
val empty_side_effects : side_effects
val concat_side_effects : side_effects -> side_effects -> side_effects
val emit_side_effects : side_effects -> evar_map -> evar_map
Push a side-effect into the evar map.
val eval_side_effects : evar_map -> side_effects
Return the effects contained in the evar map.
Adds an existential variable to the list of future goals. For internal uses only.
module FutureGoals : sig ... end
val pop_future_goals : evar_map -> FutureGoals.t * evar_map
val given_up : evar_map -> Evar.Set.t
Evar maps also keep track of the universe constraints defined at a given point. This section defines the relevant manipulation functions.
val add_universe_constraints : evar_map -> UnivProblem.Set.t -> evar_map
Add the given universe unification constraints to the evar map.
Evar maps can contain arbitrary data, allowing to use an extensible state. As evar maps are theoretically used in a strict state-passing style, such additional data should be passed along transparently. Some old and bug-prone code tends to drop them nonetheless, so you should keep cautious.
type conv_pb = Conversion.conv_pb
Unification constraints
type evar_constraint = conv_pb * Environ.env * econstr * econstr
val add_conv_pb : ?tail:bool -> evar_constraint -> evar_map -> evar_map
The following two functions are for internal use only, see Evarutil.add_unification_pb
for a safe interface.
val conv_pbs : evar_map -> evar_constraint list
val extract_conv_pbs : evar_map -> (evar_constraint -> bool) -> evar_map * evar_constraint list
val extract_changed_conv_pbs : evar_map -> evar_map * evar_constraint list
val extract_changed_conv_pbs_from : evar_map -> Evar.Set.t option -> evar_map * evar_constraint list
val extract_all_conv_pbs : evar_map -> evar_map * evar_constraint list
val loc_of_conv_pb : evar_map -> evar_constraint -> Loc.t option
The following functions return the set of undefined evars contained in the object.
val evars_of_named_context : evar_map -> (econstr, etypes, erelevance) Context.Named.pt -> Evar.Set.t
Rigid or flexible universe variables.
UnivRigid
variables are user-provided or come from an explicit Type
in the source, we do not minimize them or unify them eagerly.
UnivFlexible alg
variables are fresh universe variables of polymorphic constants or generated during refinement, sometimes in algebraic position (i.e. not appearing in the term at the moment of creation). They are the candidates for minimization (if alg, to an algebraic universe) and unified eagerly in the first-order unification heurstic.
type rigid = UState.rigid =
| UnivRigid | |
| UnivFlexible of bool | (* Is substitution by an algebraic ok? *) |
val univ_rigid : rigid
val univ_flexible : rigid
val univ_flexible_alg : rigid
type 'a in_ustate = 'a * UState.t
val restrict_universe_context : ?lbound:UGraph.Bound.t -> evar_map -> Univ.Level.Set.t -> evar_map
val universe_of_name : evar_map -> Names.Id.t -> Univ.Level.t
Raises Not_found if not a name for a universe in this map.
val quality_of_name : evar_map -> Names.Id.t -> Sorts.QVar.t
val is_relevance_irrelevant : evar_map -> erelevance -> bool
Whether the relevance is irrelevant modulo qstate
val universe_binders : evar_map -> UnivNames.universe_binders
val new_univ_level_variable : ?loc:Loc.t -> ?name:Names.Id.t -> rigid -> evar_map -> evar_map * Univ.Level.t
val new_quality_variable : ?loc:Loc.t -> ?name:Names.Id.t -> evar_map -> evar_map * Sorts.QVar.t
val add_forgotten_univ : evar_map -> Univ.Level.t -> evar_map
val universe_rigidity : evar_map -> Univ.Level.t -> rigid
val make_nonalgebraic_variable : evar_map -> Univ.Level.t -> evar_map
See UState.make_nonalgebraic_variable
.
val is_flexible_level : evar_map -> Univ.Level.t -> bool
val normalize_universe_instance : evar_map -> UVars.Instance.t -> UVars.Instance.t
val set_leq_sort : Environ.env -> evar_map -> esorts -> esorts -> evar_map
val set_eq_sort : Environ.env -> evar_map -> esorts -> esorts -> evar_map
val set_eq_level : evar_map -> Univ.Level.t -> Univ.Level.t -> evar_map
val set_leq_level : evar_map -> Univ.Level.t -> Univ.Level.t -> evar_map
val set_eq_instances : ?flex:bool -> evar_map -> UVars.Instance.t -> UVars.Instance.t -> evar_map
val check_constraints : evar_map -> Univ.Constraints.t -> bool
val check_qconstraints : evar_map -> Sorts.QConstraints.t -> bool
val check_quconstraints : evar_map -> Sorts.QUConstraints.t -> bool
val universe_context_set : evar_map -> Univ.ContextSet.t
val sort_context_set : evar_map -> UnivGen.sort_context_set
val universe_subst : evar_map -> UnivFlex.t
val to_universe_context : evar_map -> UVars.UContext.t
to_universe_context evm
extracts the local universes and constraints of evm
and orders the universes the same as Univ.ContextSet.to_context
.
val univ_entry : poly:bool -> evar_map -> UState.named_universes_entry
val check_univ_decl : poly:bool -> evar_map -> UState.universe_decl -> UState.named_universes_entry
val check_univ_decl_early : poly:bool -> with_obls:bool -> evar_map -> UState.universe_decl -> Constr.t list -> unit
An early check of compatibility of the universe declaration before starting to build a declaration interactively
val merge_context_set : ?loc:Loc.t -> ?sideff:bool -> rigid -> evar_map -> Univ.ContextSet.t -> evar_map
val merge_sort_context_set : ?loc:Loc.t -> ?sideff:bool -> rigid -> evar_map -> UnivGen.sort_context_set -> evar_map
val merge_sort_variables : ?loc:Loc.t -> ?sideff:bool -> evar_map -> Sorts.QVar.Set.t -> evar_map
val with_context_set : ?loc:Loc.t -> rigid -> evar_map -> 'a Univ.in_universe_context_set -> evar_map * 'a
val with_sort_context_set : ?loc:Loc.t -> rigid -> evar_map -> 'a UnivGen.in_sort_context_set -> evar_map * 'a
val minimize_universes : ?lbound:UGraph.Bound.t -> evar_map -> evar_map
Universe minimization
Polymorphic universes
val fresh_constant_instance : ?loc:Loc.t -> ?rigid:rigid -> Environ.env -> evar_map -> Names.Constant.t -> evar_map * Constr.pconstant
val fresh_inductive_instance : ?loc:Loc.t -> ?rigid:rigid -> Environ.env -> evar_map -> Names.inductive -> evar_map * Constr.pinductive
val fresh_constructor_instance : ?loc:Loc.t -> ?rigid:rigid -> Environ.env -> evar_map -> Names.constructor -> evar_map * Constr.pconstructor
val fresh_array_instance : ?loc:Loc.t -> ?rigid:rigid -> Environ.env -> evar_map -> evar_map * UVars.Instance.t
val fresh_global : ?loc:Loc.t -> ?rigid:rigid -> ?names:UVars.Instance.t -> Environ.env -> evar_map -> Names.GlobRef.t -> evar_map * econstr
Partially constructed constrs.
val evar_counter_summary_tag : int Summary.Dyn.tag
Create an evar_map
with empty meta map:
module MiniEConstr : sig ... end
Use this module only to bootstrap EConstr
module Expand : sig ... end
Only used as EConstr internals