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