Module Relations.LinearTwoVarEquality
type (_, _) 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) t(*Linear_Equality{f1; f2; offset}represents the relationf1*x + f2*y = offset. For instance{f1=1; f2=-2; offset=8}representsx - 2y = 8orx = 2y+8Bothf1andf2should be non-zero. The upside of storing it this way instead ofx = q*y + ris that it avoids having to use rational numbers.Invariants:
f1 > 0gcd f1 f2 offset = 1- We never have
f1 = -f2andoffset = 0. That case is represented byIdentity.
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
val f1 : ('a, 'b) t -> Z.tval f2 : ('a, 'b) t -> Z.tval offset : ('a, 'b) t -> Z.tinclude Union_Find.Parameters.GENERIC_GROUP with type ('a, 'b) t := ('a, 'b) t
include Union_Find.Parameters.GENERIC_MONOID with type ('a, 'b) t := ('a, 'b) t
val pretty : Stdlib.Format.formatter -> ('a, 'b) t -> unitPretty printer for relations
val pretty_with_terms :
(Stdlib.Format.formatter -> 'tl -> unit) ->
'tl ->
(Stdlib.Format.formatter -> 'tr -> unit) ->
'tr ->
Stdlib.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
val identity : ('a, 'a) tThe identity relation
Monoid composition, written using the functional convention compose f g is f \circ g. Should be associative, and compatible with identity:
- For all x,
G.compose x G.identity = G.compose G.identity x = x - For all x y z,
G.compose x (G.compose y z) = G.compose (G.compose x y) z
module 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