sig
  module type PUZZLE =
    sig
      type state
      type move
      val apply : state -> move -> state
      val moves : state -> move list
      val is_goal : state -> bool
      val equal : state -> state -> bool
      val goodness : state Util.comparator
      type animstate
      val init : state -> Animation.PUZZLE.animstate
      val render :
        Animation.PUZZLE.animstate -> state -> (float * move) option -> unit
    end
  module Make :
    functor (Puzzle : PUZZLE->
      sig val run : Puzzle.state -> Puzzle.move list -> unit end
end