Relations.AdditiveSourceSimple additive relation: y = delta*x + b where delta is +/- 1 (indicated by a boolean with true -> positive)
integer is is the usual unbounded additionbitvector it is modulo additionboolean is is simply negationtype (_, _) t = private | Identity : ('a, 'a) t| Add_Modulo : {factor : delta;size : Units.In_bits.t;amount : Z.t;} -> (Operator.Function_symbol.bitvector, Operator.Function_symbol.bitvector) tInvariant: is not identity either factor is MinusOne or amount is non-zero (modulo 2^size) amount is in -2^(size-1) .. 2^(size-1)-1
| Add_Unbounded : delta
* Z.t -> (Operator.Function_symbol.integer, Operator.Function_symbol.integer)
tInvariant: is not identity either the delta is MinusOne (negation) or the value is non-zero
| Bool_Not : (Operator.Function_symbol.boolean, Operator.Function_symbol.boolean)
tsee Additive for description of this relation
The type is made private to ensure invariant are respected, use the constructors below to build terms
*)val additive_bitvector :
size:Units.In_bits.t ->
delta ->
Z.t ->
(Operator.Function_symbol.bitvector, Operator.Function_symbol.bitvector) tval additive_integer :
delta ->
Z.t ->
(Operator.Function_symbol.integer, Operator.Function_symbol.integer) tinclude Union_Find.Parameters.GENERIC_GROUP with type ('a, 'b) t := ('a, 'b) tinclude Union_Find.Parameters.GENERIC_MONOID with type ('a, 'b) t := ('a, 'b) tPretty printer for relations
val pretty_with_terms :
(Format.formatter -> 'tl -> unit) ->
'tl ->
(Format.formatter -> 'tr -> unit) ->
'tr ->
Format.formatter ->
('a, 'b) t ->
unitpretty_with_terms pp_x x pp_y y rel pretty-prints the relation rel between terms x and y (respectively printed with pp_x and pp_y).
For placeholder variables, use pretty
Monoid composition, written using the functional convention compose f g is f \circ g. Should be associative, and compatible with identity:
G.compose x G.identity = G.compose G.identity x = xG.compose x (G.compose y z) = G.compose (G.compose x y) zmodule Action
(B : Single_value_abstraction.Sig.NUMERIC_ENUM) :
GROUP_ACTION
with type bitvector = B.bitvector
and type integer = B.integer
and type boolean = B.boolean
and type enum = B.enum
and type ('a, 'b) relation = ('a, 'b) t