module type S = sig .. end
type ty 
type term 
val bind : Unif_intf.subst ->
       ty HVar.t Scoped.t ->
       term Scoped.t -> Unif_intf.subst
bind subst v t binds v to t, but fails if v occurs in t
      (performs an occur-check first)
Raises Fail if occurs-check fires
val unification : ?subst:Unif_intf.subst ->
       term Scoped.t -> term Scoped.t -> Unif_intf.subst
Unify terms, returns a subst or
Raises Fail if the terms are not unifiable
val matching : ?subst:Unif_intf.subst ->
       pattern:term Scoped.t ->
       term Scoped.t -> Unif_intf.subst
matching ~pattern scope_p b scope_b returns
      
sigma such that 
sigma pattern = b, or fails.
      Only variables from the scope of 
pattern can  be bound in the subst.
RaisesFail if the terms do not match. 
Invalid_argument if the two scopes are equal 
 
subst : initial substitution (default empty)
val matching_same_scope : ?protect:ty HVar.t Sequence.t ->
       ?subst:Unif_intf.subst ->
       scope:int -> pattern:term -> term -> Unif_intf.subst
matches pattern (more general) with the other term.
      The two terms live in the same scope, which is passed as the
      scope argument. It needs to gather the variables of the
      other term to make sure they are not bound.
protect : a sequence of variables to protect (they cannot
        be bound during matching!). Variables of the second term
        are automatically protected.
scope : the common scope of both terms
val matching_adapt_scope : ?protect:ty HVar.t Sequence.t ->
       ?subst:Unif_intf.subst ->
       pattern:term Scoped.t ->
       term Scoped.t -> Unif_intf.subst
val variant : ?subst:Unif_intf.subst ->
       term Scoped.t -> term Scoped.t -> Unif_intf.subst
Succeeds iff the first term is a variant of the second, ie
      if they are alpha-equivalent
val equal : subst:Unif_intf.subst ->
       term Scoped.t -> term Scoped.t -> bool
equal subst t1 s1 t2 s2 returns true iff the two terms
      are equal under the given substitution, i.e. if applying the
      substitution will return the same term.
val are_unifiable : term -> term -> bool
val matches : pattern:term -> term -> bool
val are_variant : term -> term -> bool