sig
  module type PUZZLE =
    sig
      type state
      type move
      val apply :
        Solver.PUZZLE.state -> Solver.PUZZLE.move -> Solver.PUZZLE.state
      val moves : Solver.PUZZLE.state -> Solver.PUZZLE.move list
      val is_goal : Solver.PUZZLE.state -> bool
      val equal : Solver.PUZZLE.state -> Solver.PUZZLE.state -> bool
      val goodness : Solver.PUZZLE.state Util.comparator
    end
  module type S =
    functor (Puzzle : PUZZLE->
      sig val solve : Puzzle.state -> Puzzle.move list option end
  module MakeUnguided : S
  module Make : S
end