Parameter Make.T
module Condition : Condition_map.CONDITIONRelation between terms, used for the union-find
module Id : sig ... endLoop nesting where the variable was defined. When feasible, we automatically compute it to be at the highest possible scope.
A unique identifier for the widening point, needed to detect when the fixpoint is reached.
type 'a complete_term = | Tuple_get : int * cfg_node -> 'res complete_term(*Phi arguments are represented using tuples (and
*)Tuple_getrepresents an element in this tuple). This encodes the fact that the different variables are updated in sync. Using these tuples and path predicates to represent conditions, we have a sound and complete translation to SSA or SMT without the need for a control flow graph.| Empty : 'res complete_term(*No value. Possibly should be only used as phi arguments.
*)| Unknown : level -> 'res complete_term(*A fresh value (i.e., a variable). TODO: Add an identifier for its scope, other than level.
*)| Mu_formal : {level : level;actual : 'res t * Operator.Function_symbol.boolean t;
} -> 'res complete_term| Inductive_var : {widening_id : widening_id;level : level;mutable definition : 'res t;
} -> 'res complete_term| T0 : {} -> 'res complete_term(*Term of arity 0.
*)| T1 : {tag : ('a Operator.Function_symbol.ar1, 'res) Operator.Function_symbol.function_symbol;a : 'a t;level : level;
} -> 'res complete_term(*Term of arity 1.
*)| T2 : {tag : (('a, 'b) Operator.Function_symbol.ar2, 'res) Operator.Function_symbol.function_symbol;a : 'a t;b : 'b t;level : level;
} -> 'res complete_term(*Term of arity 2.
*)
and 'a t = | Bool : {mutable superterms : superterms;id : Operator.Function_symbol.boolean Id.t;mutable parent : Operator.Function_symbol.boolean parent;term : Operator.Function_symbol.boolean complete_term;bdd : Condition.t;
} -> Operator.Function_symbol.boolean t| Integer : {mutable superterms : superterms;id : Operator.Function_symbol.integer Id.t;mutable parent : Operator.Function_symbol.integer parent;term : Operator.Function_symbol.integer complete_term;
} -> Operator.Function_symbol.integer t| Binary : {mutable superterms : superterms;id : Operator.Function_symbol.binary Id.t;mutable parent : Operator.Function_symbol.binary parent;term : Operator.Function_symbol.binary complete_term;size : Units.In_bits.t;
} -> Operator.Function_symbol.binary t| Enum : {mutable superterms : superterms;id : Operator.Function_symbol.enum Id.t;mutable parent : Operator.Function_symbol.enum parent;term : Operator.Function_symbol.enum complete_term;
} -> Operator.Function_symbol.enum t
and tuple = any Immutable_array.tand cfg_node = private | Nondet of {id : tuple Id.t;level : level;a : tuple;conda_bool : Operator.Function_symbol.boolean t;b : tuple;condb_bool : Operator.Function_symbol.boolean t;
}| Mu of {id : tuple Id.t;level : level;init : tuple;var : tuple;body : tuple;body_cond : Operator.Function_symbol.boolean t;
}| Inductive_vars of {id : tuple Id.t;widening_id : widening_id;level : int;mutable def : tuple;
}
Node in the SSA graph.
val polyeq : 'a t -> 'b t -> ('a, 'b) PatriciaTree.cmpPolymorphic term equality
module Any : sig ... endmodule CFG_Node : sig ... endmodule SUPER_TERMS : sig ... endval hash : 'a t -> intval pretty : Stdlib.Format.formatter -> 'a t -> unitPrint the constraint/tuple. The dependencies should have already been printed.
val level : 'a t -> intReturns the nesting level of a constraint. Constants are -1, topmost is 0.
val size_of : Operator.Function_symbol.binary t -> Units.In_bits.tmodule Build : sig ... endmodule Utils : sig ... endmodule UnionFind :
Union_Find.Signatures.IMPERATIVE_GENERIC_RELATIONAL
with type 'a t = 'a t
and type ('a, 'b) relation = ('a, 'b) Relation.tUnion find structure: some terms points to their parents through the set of relations, allowing for accurate representation of relations in the group and storing fewer independent terms.