sig
  type config = Partition.t * Solution.Set.t
  module type T =
    sig
      val th : Th.t
      val map : (Term.t -> Term.t) -> Term.t -> Term.t
      val sigma : Sym.t -> Term.t list -> Term.t
      val of_equal : Fact.Equal.t -> Can.config -> Fact.Equal.t list
      val of_var_equal : Fact.Equal.t -> Can.config -> Fact.Equal.t list
      val of_var_diseq : Fact.Diseq.t -> Can.config -> Fact.Equal.t list
      val disjunction : Can.config -> Clause.t
    end
  module Make :
    functor (Can : T->
      sig
        type e = Solution.Set.t
        val current : unit -> e
        val initialize : e -> unit
        val finalize : unit -> e
        val abstract : Term.t -> unit
        val merge : Fact.Equal.t -> unit
        val propagate : Fact.Equal.t -> unit
        val dismerge : Fact.Diseq.t -> unit
        val propagate_diseq : Fact.Diseq.t -> unit
        val branch : unit -> unit
        val normalize : unit -> unit
      end
  module type OPS =
    sig
      val is_flat : Term.t -> bool
      val is_pure : Term.t -> bool
      val find : Partition.t * Solution.Set.t -> Jst.Eqtrans.t
      val inv : Partition.t * Solution.Set.t -> Jst.Eqtrans.t
    end
  module Ops : functor (Can : T-> OPS
end