Mod_substMod_substA 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.
Resolvers come in three flavours, statically distinguished by their parameter. All of them map names to other names; they differ in the inlining information they may carry.
Parameter Inline. Only a module type may declare parameters, hence only a module type resolver may carry such information.Since a name and the way a field is to be inlined are independent statements, casting between flavours drops the latter and preserves the former in full.
val forget_inline_delta_resolver : 'a delta_resolver -> 'b delta_resolverTurn a resolver of any kind into a resolver of any other kind by dropping all inlining information.
val of_body_delta_resolver : mod_body delta_resolver -> 'a delta_resolverA module body's resolver carries no inlining information by construction, so it can be read at any other kind without losing anything.
val empty_delta_resolver : Names.ModPath.t -> 'a delta_resolverGiven a root, build a resolver.
val has_root_delta_resolver : Names.ModPath.t -> 'a delta_resolver -> boolval add_mp_delta_resolver :
Names.ModPath.t ->
Names.ModPath.t ->
'a delta_resolver ->
'a delta_resolveradd_mp_delta_resolver mp v reso assumes that root(reso) ⊆ mp and mp ≠ v.
val lift_mp_delta_resolver :
Names.ModPath.t ->
'a delta_resolver ->
'a delta_resolverlift_mp_delta_resolver mp reso marks mp as being a bound name that must be left untouched by substitution. This is the semantics of delayed resolvers for functors and module types. Assumes that root(reso) ⊆ mp.
val add_kn_delta_resolver :
Names.KerName.t ->
Names.KerName.t ->
'a delta_resolver ->
'a delta_resolveradd_kn_delta_resolver kn v reso assumes that root(reso) ⊆ modpath(kn).
val add_inline_delta_resolver :
Names.KerName.t ->
int ->
mod_type delta_resolver ->
mod_type delta_resolveradd_inline_delta_resolver kn v reso assumes that root(reso) ⊆ modpath(kn).
val add_inline_body_delta_resolver :
Names.KerName.t ->
Constr.constr UVars.univ_abstracted ->
mod_subst delta_resolver ->
mod_subst delta_resolveradd_inline_body_delta_resolver kn v reso assumes that root(reso) ⊆ modpath(kn).
val add_delta_resolver :
'a delta_resolver ->
'a delta_resolver ->
'a delta_resolveradd_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).
val upcast_delta_resolver :
Names.ModPath.t ->
'a delta_resolver ->
'a delta_resolverAssuming 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
val mp_of_delta : 'a delta_resolver -> Names.ModPath.t -> Names.ModPath.tval kn_of_delta : 'a delta_resolver -> Names.KerName.t -> Names.KerName.tval mp_is_alias : 'a delta_resolver -> Names.ModPath.t -> boolmp_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
val constant_of_delta_kn :
'a delta_resolver ->
Names.KerName.t ->
Names.Constant.tSame for inductive names
val mind_of_delta_kn : 'a delta_resolver -> Names.KerName.t -> Names.MutInd.tval fold_inline_body_delta_resolver :
(Names.KerName.t -> Constr.constr UVars.univ_abstracted -> 'b -> 'b) ->
mod_subst delta_resolver ->
'b ->
'bval inline_of_delta :
int option ->
mod_type delta_resolver ->
Names.KerName.t listThe fields the resolver declared inlinable, up to the given level
val empty_subst : substitutionval is_empty_subst : substitution -> boolval add_mbid :
Names.MBId.t ->
Names.ModPath.t ->
mod_subst 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 ->
mod_subst delta_resolver ->
substitution ->
substitutionval map_mbid :
Names.MBId.t ->
Names.ModPath.t ->
mod_subst delta_resolver ->
substitutionmap_* create a new substitution arg2/arg1{arg3}
val map_mp :
Names.ModPath.t ->
Names.ModPath.t ->
mod_subst delta_resolver ->
substitutionval join : substitution -> substitution -> substitutionsequential composition: substitute (join sub1 sub2) t = substitute sub2 (substitute sub1 t)
val subst_dom_delta_resolver :
Names.ModPath.t ->
Names.ModPath.t ->
'a delta_resolver ->
'a delta_resolversubst_dom_delta_resolver mpfrom mpto delta substitutes the root of the resolver delta from mpfrom to mpto, i.e. performs α-equivalence.
val subst_codom_delta_resolver :
substitution ->
'a delta_resolver ->
'a delta_resolverApply the substitution on the codomain of the resolver
val subst_dom_codom_delta_resolver :
substitution ->
'a delta_resolver ->
'a delta_resolversubst_mp sub mp guarantees that whenever the result of the substitution is structutally equal mp, it is equal by pointers as well ==
val subst_mp : substitution -> Names.ModPath.t -> Names.ModPath.tval subst_mind : substitution -> Names.MutInd.t -> Names.MutInd.tval subst_ind : substitution -> Names.inductive -> Names.inductiveval subst_constructor : substitution -> Names.constructor -> Names.constructorval subst_pind : substitution -> Constr.pinductive -> Constr.pinductiveval subst_kn : substitution -> Names.KerName.t -> Names.KerName.tval subst_con :
substitution ->
Names.Constant.t ->
Names.Constant.t * Constr.constr UVars.univ_abstracted optionval subst_pcon : substitution -> Constr.pconstant -> Constr.pconstantval subst_constant : substitution -> Names.Constant.t -> Names.Constant.tval subst_proj_repr :
substitution ->
Names.Projection.Repr.t ->
Names.Projection.Repr.tval subst_proj : substitution -> Names.Projection.t -> Names.Projection.tval subst_retro_action :
substitution ->
Retroknowledge.action ->
Retroknowledge.actionval 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
val subst_mps : substitution -> Constr.constr -> Constr.constrsubst_mps sub c performs the substitution sub on all kernel names appearing in c
val subst_mps_list : substitution list -> Constr.constr -> Constr.constr