to_tvar t returns x if t is of the form Vari x and fails otherwise.
NOTE the Array.map to_tvar function is useful when working with multiple binders. For example, this is the case when manipulating pattern variables (Patt constructor) or metatavariables (Meta constructor). Remark that it is important for these constructors to hold an array of terms, rather than an array of variables: a variable can only be substituted when if it is injected in a term (using the Vari constructor).
NOTE the result of to_tvar can generally NOT be precomputed. A first reason is that we cannot know in advance what variable identifier is going to arise when working under binders, for which fresh variables will often be generated. A second reason is that free variables should never be “marshaled” (e.g., by the Sign module), as this would break the freshness invariant of new variables.
unbind_name b s is like Bindlib.unbind b but returns a valid variable name when b binds no variable. The string s is the prefix of the variable's name.
unbind2_name b1 b2 s is like Bindlib.unbind2 b1 b2 but returns a valid variable name when b1 or b2 binds no variable. The string s is the prefix of the variable's name.
If ts is not made of variables or function symbols prefixed by '$' only, then nl_distinct_vars ctx ts returns None. Otherwise, it returns a pair (vs, map) where vs is an array of variables made of the linear variables of ts and fresh variables for the non-linear variables and the symbols prefixed by '$', and map records by which variable each linear symbol prefixed by '$' is replaced.
Variables defined in ctx are unfolded.
The symbols prefixed by '$' are introduced by infer.ml which converts metavariables into fresh symbols, and those metavariables are introduced by sr.ml which replaces pattern variables by metavariables.
term_of_rhs r converts the RHS (right hand side) of the rewriting rule r into a term. The bound higher-order variables of the original RHS are substituted using Patt constructors. They are thus represented as their LHS counterparts. This is a more convenient way of representing terms when analysing confluence or termination.