package rocq-runtime
Install
dune-project
Dependency
Authors
Maintainers
Sources
sha256=3f0fc283e8644394aa9c7a6e3995b6d9ebbe1e6dda712bf431f9c372dcef95ad
doc/rocq-runtime.kernel/Mod_subst/index.html
Module Mod_substSource
Mod_subst
Delta resolver
A delta resolver is a renaming of kernames and modpaths. Objects on which the resolver acts non-trivially must share a common modpath prefix called the root of the resolver.
Given a root, build a resolver.
val add_mp_delta_resolver :
Names.ModPath.t ->
Names.ModPath.t ->
delta_resolver ->
delta_resolveradd_mp_delta_resolver mp v reso assumes that root(reso) ⊆ mp.
val add_kn_delta_resolver :
Names.KerName.t ->
Names.KerName.t ->
delta_resolver ->
delta_resolveradd_kn_delta_resolver kn v reso assumes that root(reso) ⊆ modpath(kn).
val add_inline_delta_resolver :
Names.KerName.t ->
(int * Constr.constr UVars.univ_abstracted option) ->
delta_resolver ->
delta_resolveradd_inline_delta_resolver kn v reso assumes that root(reso) ⊆ modpath(kn).
add_delta_resolver reso1 reso2 merges two renamings, assuming that root(reso2) ⊆ root(reso1). Note that this is asymmetrical. The root of the result is root(reso2).
Assuming mp ⊆ root(delta), upcast_delta_resolver mp delta allows seeing delta as a resolver with root = mp.
Effect of a delta_resolver on a module path, on a kernel name
mp_is_alias reso mp tells whether reso makes mp equivalent to some other modpath. Note that both this and mp_of_delta take prefixes into account: a module is equivalent to another one as soon as one of its ancestors is.
Build a constant whose canonical part is obtained via a resolver
Same for inductive names
Extract the set of inlined constant in the resolver
Substitution
val add_mbid :
Names.MBId.t ->
Names.ModPath.t ->
delta_resolver ->
substitution ->
substitutionadd_* add arg2/arg1{arg3} to the substitution with no sequential composition. Most often this is not what you want. For sequential composition, try join (map_mbid mp delta) subs *
val add_mp :
Names.ModPath.t ->
Names.ModPath.t ->
delta_resolver ->
substitution ->
substitutionmap_* create a new substitution arg2/arg1{arg3}
sequential composition: substitute (join sub1 sub2) t = substitute sub2 (substitute sub1 t)
val subst_dom_delta_resolver :
Names.ModPath.t ->
Names.ModPath.t ->
delta_resolver ->
delta_resolversubst_dom_delta_resolver mpfrom mpto delta substitutes the root of the resolver delta from mpfrom to mpto, i.e. performs α-equivalence.
Apply the substitution on the codomain of the resolver
subst_mp sub mp guarantees that whenever the result of the substitution is structutally equal mp, it is equal by pointers as well ==
val subst_con :
substitution ->
Names.Constant.t ->
Names.Constant.t * Constr.constr UVars.univ_abstracted optionval replace_mp_in_kn :
Names.ModPath.t ->
Names.ModPath.t ->
Names.KerName.t ->
Names.KerName.treplace_mp_in_con mp mp' con replaces mp with mp' in con
subst_mps sub c performs the substitution sub on all kernel names appearing in c