sig
  module type SIG = sig val th : Th.t val f : Sym.t end
  module type TERM =
    sig
      val d_interp : Term.t -> Term.t * Term.t
      val is_interp : Term.t -> bool
      val make : Term.t -> Term.t -> Term.t
      val iterate : Term.t -> int -> Term.t
      val multiplicity : Term.t -> Term.t -> int
      val decompose : Term.t -> (Term.t * int) * Term.t option
      val fold : (Term.t -> int -> '-> 'a) -> Term.t -> '-> 'a
      val iter : (Term.t -> int -> unit) -> Term.t -> unit
      val sigma : Sym.t -> Term.t list -> Term.t
      val map : (Term.t -> Term.t) -> Term.t -> Term.t
    end
  module Ops : functor (Sig : SIG-> Can.OPS
  module Make : functor (Sig : SIG-> TERM
  module T : functor (Sig : SIG-> Can.T
  module Infsys :
    functor (Sig : SIG->
      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
end