sig
  type label = {
    lb_rule : string;
    time_in : float * float;
    parameters_in : (string * (float * float)) list;
  }
  type player_loc = {
    payoff : Formula.real_expr;
    moves : (Arena.label * int) list;
    view : Formula.formula * (string * Formula.formula) list;
    heur : float list;
  }
  type game = {
    rules : (string * ContinuousRule.rule) list;
    patterns : Formula.real_expr list;
    graph : (Arena.player_loc array * string list) array;
    num_players : int;
    player_names : (string * int) list;
    data : (string * string) list;
    defined_rels : (string * (string list * Formula.formula)) list;
    starting_struc : Structure.structure;
  }
  type move = {
    mv_time : float;
    parameters : (string * float) list;
    rule : string;
    next_loc : int;
    matching : (string * string) list;
  }
  type game_state = {
    struc : Structure.structure;
    time : float;
    cur_loc : int;
    history : (Arena.move * float option) list;
  }
  val empty_state : Arena.game * Arena.game_state
  val equal_state : Arena.game_state -> Arena.game_state -> bool
  val make_move :
    Arena.move ->
    Arena.game * Arena.game_state -> Arena.game * Arena.game_state
  val matching_of_names :
    Arena.game * Arena.game_state ->
    string -> (string * string) list -> (string * int) list
  val rules_for_player : int -> Arena.game -> string list
  val label_str : Arena.label -> string
  val move_str : Arena.label * int -> string
  val str : Arena.game -> string
  val state_str : Arena.game * Arena.game_state -> string
  val equational_def_style : bool Pervasives.ref
  val fprint_state_full :
    ?ext_struct:bool ->
    bool -> Format.formatter -> Arena.game * Arena.game_state -> unit
  val fprint_state :
    Format.formatter -> Arena.game * Arena.game_state -> unit
  val print_state : Arena.game * Arena.game_state -> unit
  val sprint_state : Arena.game * Arena.game_state -> string
  val sprint_state_ext : Arena.game * Arena.game_state -> string
  val sprint_state_full : Arena.game * Arena.game_state -> string
  val sprint_game_move : Arena.move * float option -> string
  val game_move_str : Arena.move -> string
  type definition =
      DefRule of string *
        ((string * int) list ->
         (string * (string list * Formula.formula)) list ->
         string -> ContinuousRule.rule)
    | DefLoc of
        ((string * int) list -> int * (Arena.player_loc array * string list))
    | DefPlayers of string list
    | DefRel of string * string list * Formula.formula
    | DefPattern of Formula.real_expr
    | StartStruc of Structure.structure
    | CurrentStruc of Structure.structure
    | History of (Arena.move * float option) list
    | StateTime of float
    | StateLoc of int
    | StateData of (string * string) list
  exception Arena_definition_error of string
  val array_of_players :
    '-> (string * int) list -> (string * 'a) list -> 'a array
  val make_move_arena :
    string -> (string * (float * float)) list -> int -> Arena.label * int
  val make_location :
    int ->
    (string *
     [< `Heurs of float list
      | `Moves of (Arena.label * int) list
      | `Payoff of Formula.real_expr ]
     list)
    list ->
    string list ->
    (string * int) list -> int * (Arena.player_loc array * string list)
  val process_definition :
    ?extend_state:Arena.game * Arena.game_state ->
    Arena.definition list -> Arena.game * Arena.game_state
  val map_to_formulas :
    (Formula.formula -> Formula.formula) -> Arena.game -> Arena.game
  val fold_over_formulas :
    include_defined_rels:bool ->
    (Formula.formula -> '-> 'a) -> Arena.game -> '-> 'a
  val map_to_structures :
    (Structure.structure -> Structure.structure) -> Arena.game -> Arena.game
  val map_to_discrete :
    (DiscreteRule.rule -> DiscreteRule.rule) -> Arena.game -> Arena.game
  val all_fluents :
    Arena.game -> Aux.Strings.t * Aux.Strings.t * Aux.Strings.t
  val compare_diff :
    ?cmp_funs:(float -> float -> bool) ->
    Arena.game * Arena.game_state ->
    Arena.game * Arena.game_state -> bool * string
  val cGRID_SIZE : int
  val list_moves :
    Arena.game ->
    Arena.game_state -> (int * Arena.move * Arena.game_state) array
  val list_moves_shifts :
    Arena.game ->
    Arena.game_state ->
    (int * (Arena.move * ((string * string) * float list) list) *
     Arena.game_state)
    array
  val apply_rule_int :
    Arena.game * Arena.game_state ->
    string * (string * int) list * float * (string * float) list ->
    (Arena.game * Arena.game_state) * string
  val apply_rewrite :
    Arena.game * Arena.game_state ->
    int * (string * DiscreteRule.matching) -> Arena.game * Arena.game_state
  val win_so_formula :
    ?inv:bool ->
    ?start0:bool ->
    ?subst:(string * string) list -> Arena.game -> int -> Formula.formula
end