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->
      functor
        (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->
        functor
          (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