(* -------------------------------------------------------------------------- *)(* A universal, concrete type of single-name abstractions. *)(* We wish to represent all kinds of abstractions -- e.g. in nominal style, in de Bruijn style, etc. -- so we parameterize the abstraction over the type ['bn] of the bound name and over the type ['term] of the body. This makes this type definition almost trivial -- it is just a pair -- but it still serves as a syntactic marker of where abstractions are located. *)type('bn,'term)abs='bn*'term(* -------------------------------------------------------------------------- *)(* The main effect of a binding construct is to cause the environment to be enriched when the abstraction is traversed. The following visitor methods define where the environment is enriched. *)(* These methods do not know the type of the environment, and do not know how

(* We need several varieties of visitors, which is a bit painful. As of now, [iter], [map], [endo], [iter2] are required: see [ToolboxInput]. *)(* The visitor methods are polymorphic in the type of terms. This is important, as it means that one can use several instances of a binding construct in a single type definition and still be able to construct well-typed visitors. *)