module Make (
T
:
TERM
)
: S
with type term = T.t
type
term
type
t
Represents a congruence
val create : ?size:int -> unit -> t
New congruence.
size
: a hint for the initial size of the hashtable.
val clear : t -> unit
Clear the content of the congruence. It is now equivalent to
the empty congruence.
val push : t -> unit
Push a checkpoint on the stack of the congruence. An equivalent call
to
Congruence.S.pop
will restore the congruence to its current state.
val pop : t -> unit
Restore to the previous checkpoint.
Raises Invalid_argument
if there is no checkpoint to restore to
(ie if no call to
Congruence.S.push
matches this call to
Congruence.S.pop
)
val stack_size : t -> int
val find : t -> term -> term
Current representative of this term
val iter : t ->
(mem:term -> repr:term -> unit) -> unit
Iterate on terms that are explicitely present in the congruence.
The callback is given
mem
, the term itself, and
repr
,
the current representative of the term
mem
.
Invariant: when calling iter cc f
, if f ~mem ~repr
is called,
then find cc mem == repr
holds.
val iter_roots : t -> (term -> unit) -> unit
Iterate on the congruence classes' representative elements.
Exactly one term per congruence class will be passed to the
function.
val mk_eq : t -> term -> term -> unit
mk_eq congruence t1 t2
asserts that t1 = t2
belongs to
the congruence
val mk_less : t -> term -> term -> unit
mk_less congruence t1 t2
asserts that t1 < t2
belongs to
the congruence
val is_eq : t -> term -> term -> bool
Returns true if the two terms are equal in the congruence. This
updates the congruence, because the two terms need to be added.
val is_less : t -> term -> term -> bool
Returns true if the first term is strictly lower than the second
one in the congruence
val cycles : t -> bool
Checks whether there are cycles in inequalities.
Returns true if calls to mk_eq
and mk_less
entail a cycle in
the ordering (hence contradicting irreflexivity/transitivity of less)