module Variant:sig..end
Variants
The types of symbols (when they are enumerated data types) can be refined to substypes of their original type (i.e. a subset of their constructors).
val init : (Smt_sig.S.Symbol.t * Smt_sig.S.Type.t) list -> unitinit l where l is a list of pairs (s, ty) initializes the
type (and associated constructors) of each s to its original type ty.
This function must be called with a list of all symbols before attempting to refine the types.
val close : unit -> unitclose () will compute the smallest type possible for each symbol.
This function must be called when all information has been added.
val assign_constr : Smt_sig.S.Symbol.t -> Hstring.t -> unitassign_constr s cstr will add the constraint that the constructor
cstr must be in the type of s
val assign_var : Smt_sig.S.Symbol.t -> Smt_sig.S.Symbol.t -> unitassign_var x y will add the constraint that the type of y is a
subtype of x (use this function when x := y appear in your
program
val print : unit -> unitprint () will output the computed refined types on std_err. This
function is here only for debugging purposes. Use it afer close ().
val get_variants : Smt_sig.S.Symbol.t -> Hstring.HSet.tget_variants s returns a set of constructors, which is the refined
type of s.