package coq
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=3cbfc1e1a72b16d4744f5b64ede59586071e31d9c11c811a0372060727bfd9c3
doc/coq-core.engine/Evarutil/index.html
Module Evarutil
Source
This module provides useful higher-level functions for evar manipulation.
Metas
new_meta
is a generator of unique meta variables
Creating a fresh evar given their type and context
val new_evar :
?src:Evar_kinds.t Loc.located ->
?filter:Evd.Filter.t ->
?abstract_arguments:Evd.Abstraction.t ->
?candidates:EConstr.constr list ->
?naming:Namegen.intro_pattern_naming_expr ->
?typeclass_candidate:bool ->
?principal:bool ->
?hypnaming:naming_mode ->
Environ.env ->
Evd.evar_map ->
EConstr.types ->
Evd.evar_map * EConstr.t
val new_pure_evar :
?src:Evar_kinds.t Loc.located ->
?filter:Evd.Filter.t ->
?identity:EConstr.t list ->
?abstract_arguments:Evd.Abstraction.t ->
?candidates:EConstr.constr list ->
?naming:Namegen.intro_pattern_naming_expr ->
?typeclass_candidate:bool ->
?principal:bool ->
Environ.named_context_val ->
Evd.evar_map ->
EConstr.types ->
Evd.evar_map * Evar.t
Low-level interface to create an evar.
val new_type_evar :
?src:Evar_kinds.t Loc.located ->
?filter:Evd.Filter.t ->
?naming:Namegen.intro_pattern_naming_expr ->
?principal:bool ->
?hypnaming:naming_mode ->
Environ.env ->
Evd.evar_map ->
Evd.rigid ->
Evd.evar_map * (EConstr.constr * Sorts.t)
Create a new Type existential variable, as we keep track of them during type-checking and unification.
Polymorphic constants
Evars/Metas switching...
Unification utils
head_evar c
returns the head evar of c
if any
may raise NoHeadEvar
gather_dependent_evars evm seeds
classifies the evars in evm
as dependent_evars and goals (these may overlap). A goal is an evar in seeds
or an evar appearing in the (partial) definition of a goal. A dependent evar is an evar appearing in the type (hypotheses and conclusion) of a goal, or in the type or (partial) definition of a dependent evar. The value return is a map associating to each dependent evar None
if it has no (partial) definition or Some s
if s
is the list of evars appearing in its (partial) definition.
advance sigma g
returns Some g'
if g'
is undefined and is the current avatar of g
(for instance g
was changed by clear
into g'
). It returns None
if g
has been (partially) solved.
reachable_from_evars sigma seeds
computes the descendents of evars in seeds
by restriction or evar-evar unifications in sigma
.
The following functions return the set of undefined evars contained in the object, the defined evars being traversed. This is roughly a combination of the previous functions and nf_evar
.
val filtered_undefined_evars_of_evar_info :
?cache:undefined_evars_cache ->
Evd.evar_map ->
Evd.evar_info ->
Evar.Set.t
occur_evar_upto sigma k c
returns true
if k
appears in c
. It looks up recursively in sigma
for the value of existential variables.
Value/Type constraints
flush_and_check_evars
raise Uninstantiated_evar
if an evar remains uninstantiated; nf_evar
leaves uninstantiated evars as is
val jv_nf_evar :
Evd.evar_map ->
EConstr.unsafe_judgment array ->
EConstr.unsafe_judgment array
Presenting terms without solved evars
Replacing all evars, possibly raising Uninstantiated_evar
val finalize :
?abort_on_undefined_evars:bool ->
Evd.evar_map ->
((EConstr.t -> Constr.t) -> 'a) ->
Evd.evar_map * 'a
finalize env sigma f
combines universe minimisation, evar-and-universe normalisation and universe restriction.
It minimizes universes in sigma
, calls f
a normalisation function with respect to the updated sigma
and restricts the local universes of sigma
to those encountered while running f
.
Note that the normalizer passed to f
holds some imperative state in its closure.
Term manipulation up to instantiation
val kind_of_term_upto :
Evd.evar_map ->
Constr.constr ->
(Constr.constr, Constr.types, Sorts.t, Univ.Instance.t) Constr.kind_of_term
Like Constr.kind
except that kind_of_term sigma t
exposes t
as an evar e
only if e
is uninstantiated in sigma
. Otherwise the value of e
in sigma
is (recursively) used.
val eq_constr_univs_test :
evd:Evd.evar_map ->
extended_evd:Evd.evar_map ->
EConstr.constr ->
EConstr.constr ->
bool
eq_constr_univs_test ~evd ~extended_evd t u
tests equality of t
and u
up to existential variable instantiation and equalisable universes. The term t
is interpreted in evd
while u
is interpreted in extended_evd
. The universe constraints in extended_evd
are assumed to be an extension of those in evd
.
val compare_cumulative_instances :
Reduction.conv_pb ->
Univ.Variance.t array ->
Univ.Instance.t ->
Univ.Instance.t ->
Evd.evar_map ->
(Evd.evar_map, Univ.univ_inconsistency) Util.union
compare_cumulative_instances cv_pb variance u1 u2 sigma
Returns Inl sigma'
where sigma'
is sigma
augmented with universe constraints such that u1 cv_pb? u2
according to variance
. Additionally flexible universes in irrelevant positions are unified if possible. Returns Inr p
when the former is impossible.
val compare_constructor_instances :
Evd.evar_map ->
Univ.Instance.t ->
Univ.Instance.t ->
Evd.evar_map
We should only compare constructors at convertible types, so this is only an opportunity to unify universes.
Unification problems
add_unification_pb ?tail pb sigma
Add a unification problem pb
to sigma
, if not already present. Put it at the end of the list if tail
is true, by default it is false.
Removing hyps in evars'context
raise OccurHypInSimpleClause if the removal breaks dependencies
type clear_dependency_error =
| OccurHypInSimpleClause of Names.Id.t option
| EvarTypingBreak of Constr.existential
| NoCandidatesLeft of Evar.t
exception ClearDependencyError of Names.Id.t
* clear_dependency_error
* Names.GlobRef.t option
Restrict an undefined evar according to a (sub)filter and candidates. The evar will be defined if there is only one candidate left,
val restrict_evar :
Evd.evar_map ->
Evar.t ->
Evd.Filter.t ->
?src:Evar_kinds.t Loc.located ->
EConstr.constr list option ->
Evd.evar_map * Evar.t
val clear_hyps_in_evi :
Environ.env ->
Evd.evar_map ->
Environ.named_context_val ->
EConstr.types ->
Names.Id.Set.t ->
Evd.evar_map * Environ.named_context_val * EConstr.types
val clear_hyps2_in_evi :
Environ.env ->
Evd.evar_map ->
Environ.named_context_val ->
EConstr.types ->
EConstr.types ->
Names.Id.Set.t ->
Evd.evar_map * Environ.named_context_val * EConstr.types * EConstr.types
val push_rel_decl_to_named_context :
?hypnaming:naming_mode ->
Evd.evar_map ->
EConstr.rel_declaration ->
ext_named_context ->
ext_named_context
val push_rel_context_to_named_context :
?hypnaming:naming_mode ->
Environ.env ->
Evd.evar_map ->
EConstr.types ->
Environ.named_context_val * EConstr.types * EConstr.constr list * csubst
val generalize_evar_over_rels :
Evd.evar_map ->
EConstr.existential ->
EConstr.types * EConstr.constr list
val subterm_source :
Evar.t ->
?where:Evar_kinds.subevar_kind ->
Evar_kinds.t Loc.located ->
Evar_kinds.t Loc.located