sig
  module I : ItemEq
  module D : Domain
  type item
  and domain
  and assign = Solve.Solver.item -> Solve.Solver.domain
  and system =
    Solve.Solver.item -> Solve.Solver.assign -> Solve.Solver.domain
  and equation =
    Solve.Solver.item * (Solve.Solver.assign -> Solve.Solver.domain)
  val solve :
    Solve.Solver.system ->
    Solve.Solver.item list ->
    (Solve.Solver.item, Solve.Solver.domain) Hashtbl.t
end