Module Nonrelational.MakeUF
Make the reduced product of a non-relational domain and a labeled union-find. This should then be passed to one of the functions in Union_find, as these are the ones that create relation
Parameters
module T : Terms.Sig.TERMSmodule _ :
Terms.Relations.GROUP_ACTION
with type bitvector = SVA.bitvector
and type integer = SVA.integer
and type boolean = SVA.boolean
and type enum = SVA.enum
and type ('a, 'b) relation = ('a, 'b) T.Relation.tSignature
include Term_based_sig.Domain_S
with module Query.Boolean_Lattice = SVA.Boolean_Lattice
with module Query.Integer_Lattice = SVA.Integer_Lattice
with module Terms = T
module Terms = TType for elements of the abstract domain. The interface is persistent but the implementation can be imperative.
type binary = Operator.Function_symbol.binary Terms.tRepresent binary, integer and boolean dimensions/variables in the abstract domain.
type integer = Operator.Function_symbol.integer Terms.ttype boolean = Operator.Function_symbol.boolean Terms.ttype enum = Operator.Function_symbol.enum Terms.tval top : tmodule Integer_Query : sig ... endProjection to a non-relational basis.
module Query : sig ... endval nondet :
doma:t ->
tupa:Terms.any Immutable_array.t ->
domb:t ->
tupb:Terms.any Immutable_array.t ->
tupres:Terms.any Immutable_array.t ->
tval widened_fixpoint_step :
previous:t ->
previous_tup:Terms.any Immutable_array.t ->
next:t ->
next_tup:Terms.any Immutable_array.t ->
bool ->
res_tup:Terms.any Immutable_array.t ->
t * boolwidened_fixpoint_step ~previous ~previous_tup ~next ~next_tup bool ~res_tup where:
previousis the previous domain state andprevious_tupthe tuple of phi arguments;nextis the next domain state obtained by joining execution of the function body and initial state andnext_tupthe phi arguments;boolis false if we know that the fixpoint is not reached yet, and true otherwise;res_tupis the terms corresponding to the phi function;
returns a triple (context,bool) where:
contextis the new domain state;boolis true if the fixpoint is reached, and false if not reached or we don't know.
val binary_empty : size:Units.In_bits.t -> t -> binary -> tval binary_unknown : size:Units.In_bits.t -> t -> binary -> tmodule Domain_Arity : sig ... endmodule Boolean_Forward :
Operator.BOOLEAN_FORWARD
with module Arity := Domain_Arity
and type boolean := booleanmodule Integer_Forward :
Operator.INTEGER_FORWARD
with module Arity := Domain_Arity
and type boolean := boolean
and type integer := integermodule Binary_Forward :
Operator.BINARY_FORWARD
with module Arity := Domain_Arity
and type boolean := boolean
and type binary := binarymodule Enum_Forward :
Operator.ENUM_FORWARD
with module Arity := Domain_Arity
and type boolean := boolean
and type enum := enumval binary_pretty :
size:Units.In_bits.t ->
t ->
Stdlib.Format.formatter ->
binary ->
unitval pretty : Stdlib.Format.formatter -> t -> unitval fixpoint_step :
lvl:int ->
iteration:int ->
t ->
actuals:Terms.any Immutable_array.t ->
t ->
args:Terms.any Immutable_array.t ->
t ->
finals:Terms.any Immutable_array.t ->
bool * (close:bool -> Terms.any Immutable_array.t -> t)Tells if fixpoint is reached, and prepare to write the new values. The returned pair (bool,function) allows to decide whether we should end the fixpoint computation; the function represents a continuation, and the boolean tells whether the fixpoint is reached (if yes, we can close, but we don't have to).
val union : t -> 'a Terms.t -> 'b Terms.t -> ('a, 'b) Terms.Relation.t -> t