Legend:
Library
Module
Module type
Parameter
Class
Class type
Substitutions
Substitutions map variables to terms/types. They work on free variables (within a scope, so that the same variable can live within several scopes).
The concept of scope is to allow the same free variable to be used in several contexts without being renamed. A scope is kind of a namespace, where variables from distinct namespaces are always distinct.
type scope = int
A scope is an integer. Variables can only be bound in one scope, and variables from distinct scopes are distinct too.
A renaming is used to disambiguate variables that come from distinct scopes but have the same index. It is used to merge together several scopes, in a sound way, by ensuring variables from those scopes are mapped to distinct variables of the new scope. For instance, a given renaming applied to (X,0) and (X,1) will return two different variables, as if one of the X had been renamed prior to unification/binding.
Apply the substitution to the given term. This function assumes that all terms in the substitution are closed, and it will not perform De Bruijn indices shifting. For instance, applying {X -> f(db0)} (with db0 the De Bruijn index 0) to the term forall. p(X) will yield forall. p(f(db0)) (capturing) and not forall. p(f(db1)).
parameterrenaming
used to desambiguate free variables from distinct scopes