`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 -> 'a) -> Strat.G.t -> 'a -> 'a
val fold_succ :
(Strat.G.vertex -> 'a -> 'a) ->
Strat.G.t -> Strat.G.vertex -> 'a -> '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`