Relations.LinearTwoVarEqualitySourcetype (_, _) t = private | Identity : ('a, 'a) t| Linear_Equality : {size : Units.In_bits.t;f1 : Z.t;f2 : Z.t;offset : Z.t;} -> (Operator.Function_symbol.bitvector, Operator.Function_symbol.bitvector) tLinear_Equality{f1; f2; offset} represents the relation f1*x + f2*y = offset. For instance {f1=1; f2=-2; offset=8} represents x - 2y = 8 or x = 2y+8 Both f1 and f2 should be non-zero. The upside of storing it this way instead of x = q*y + r is that it avoids having to use rational numbers.
Invariants:
f1 > 0gcd f1 f2 offset = 1f1 = -f2 and offset = 0. That case is represented by Identity.val make :
size:Units.In_bits.t ->
f1:Z.t ->
f2:Z.t ->
Z.t ->
(Operator.Function_symbol.bitvector, Operator.Function_symbol.bitvector) tSmart constructor, normalizes terms to respect invariants
Destructors for easy access
include 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