sidekick/src/cc/Mini_cc.mli
2019-04-02 21:30:14 -05:00

42 lines
957 B
OCaml

(** {1 Mini congruence closure}
This implementation is as simple as possible, and doesn't provide
backtracking, theories, or explanations.
It just decides the satisfiability of a set of (dis)equations.
*)
open Congruence_closure_intf
type res =
| Sat
| Unsat
module type TERM = Congruence_closure_intf.TERM
module type S = sig
type term
type fun_
type term_state
type t
val create : term_state -> t
val add_lit : t -> term -> bool -> unit
(** [add_lit cc p sign] asserts that [p=sign] *)
val distinct : t -> term list -> unit
(** [distinct cc l] asserts that all terms in [l] are distinct *)
val check : t -> res
val classes : t -> term Iter.t Iter.t
(** Traverse the set of classes in the congruence closure.
This should be called only if {!check} returned [Sat]. *)
end
module Make(A: TERM)
: S with type term = A.Term.t
and type fun_ = A.Fun.t
and type term_state = A.Term.state