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