sig
  module type G =
    sig
      type t
      module V : Sig.ORDERED_TYPE
      type vertex = V.t
      val mem_vertex : Strat.G.t -> Strat.G.vertex -> bool
      val succ : Strat.G.t -> Strat.G.vertex -> Strat.G.vertex list
      val fold_vertex : (Strat.G.vertex -> '-> 'a) -> Strat.G.t -> '-> 'a
      val fold_succ :
        (Strat.G.vertex -> '-> 'a) ->
        Strat.G.t -> Strat.G.vertex -> '-> 'a
    end
  module type PLAYER =
    sig
      type t
      type vertex
      val get_initial : Strat.PLAYER.t -> Strat.PLAYER.vertex
      val is_final : Strat.PLAYER.t -> Strat.PLAYER.vertex -> bool
      val turn : Strat.PLAYER.t -> Strat.PLAYER.vertex -> bool
    end
  module type STRAT =
    sig
      type t
      type vertex
      val empty : Strat.STRAT.t
      val add :
        Strat.STRAT.t ->
        Strat.STRAT.vertex -> Strat.STRAT.vertex -> Strat.STRAT.t
      val next : Strat.STRAT.t -> Strat.STRAT.vertex -> Strat.STRAT.vertex
    end
  module Algo :
    functor
      (G : G) (P : sig
                     type t
                     type vertex = G.vertex
                     val get_initial : t -> vertex
                     val is_final : t -> vertex -> bool
                     val turn : t -> vertex -> bool
                   end) (S : sig
                               type t
                               type vertex = G.vertex
                               val empty : t
                               val add : t -> vertex -> vertex -> t
                               val next : t -> vertex -> vertex
                             end->
      sig
        val coherent_player : Strat.G.t -> P.t -> bool
        val coherent_strat : Strat.G.t -> S.t -> bool
        val game : Strat.G.t -> P.t -> S.t -> S.t -> bool
        val strategy : Strat.G.t -> P.t -> S.t -> bool
        val strategyA : Strat.G.t -> P.t -> bool * S.t
      end
end