functor (Puzzle : PUZZLE->
  sig val solve : Puzzle.state -> Puzzle.move list option end