functor (Item : ItemEq->
  functor (Domain : Domain->
    sig
      module I : ItemEq
      module D : Domain
      type item = Item.t
      and domain = Domain.t
      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