sig
  module type G =
    sig
      type t
      module V : Sig.COMPARABLE
      val succ : Minsep.G.t -> V.t -> V.t list
      val iter_succ : (V.t -> unit) -> Minsep.G.t -> V.t -> unit
      val fold_succ : (V.t -> '-> 'a) -> Minsep.G.t -> V.t -> '-> 'a
      val iter_vertex : (V.t -> unit) -> Minsep.G.t -> unit
      val fold_vertex : (V.t -> '-> 'a) -> Minsep.G.t -> '-> 'a
    end
  module type MINSEP =
    sig
      module G : G
      module Vertex_Set :
        sig
          type elt = G.V.t
          type t
          val empty : t
          val is_empty : t -> bool
          val mem : elt -> t -> bool
          val add : elt -> t -> t
          val singleton : elt -> t
          val remove : elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val partition : (elt -> bool) -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val min_elt : t -> elt
          val max_elt : t -> elt
          val choose : t -> elt
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
          val of_list : elt list -> t
        end
      module VSetset :
        sig
          type elt = Vertex_Set.t
          type t
          val empty : t
          val is_empty : t -> bool
          val mem : elt -> t -> bool
          val add : elt -> t -> t
          val singleton : elt -> t
          val remove : elt -> t -> t
          val union : t -> t -> t
          val inter : t -> t -> t
          val diff : t -> t -> t
          val compare : t -> t -> int
          val equal : t -> t -> bool
          val subset : t -> t -> bool
          val iter : (elt -> unit) -> t -> unit
          val fold : (elt -> '-> 'a) -> t -> '-> 'a
          val for_all : (elt -> bool) -> t -> bool
          val exists : (elt -> bool) -> t -> bool
          val filter : (elt -> bool) -> t -> t
          val partition : (elt -> bool) -> t -> t * t
          val cardinal : t -> int
          val elements : t -> elt list
          val min_elt : t -> elt
          val max_elt : t -> elt
          val choose : t -> elt
          val split : elt -> t -> t * bool * t
          val find : elt -> t -> elt
          val of_list : elt list -> t
        end
      val allminsep : Minsep.G.t -> Minsep.MINSEP.Vertex_Set.t list
      val list_of_allminsep : Minsep.G.t -> G.V.t list list
      val set_of_allminsep : Minsep.G.t -> Minsep.MINSEP.VSetset.t
    end
  module P :
    functor
      (G : sig
             type t
             module V : Sig.COMPARABLE
             val succ : t -> V.t -> V.t list
             val iter_succ : (V.t -> unit) -> t -> V.t -> unit
             val fold_succ : (V.t -> '-> 'a) -> t -> V.t -> '-> 'a
             val iter_vertex : (V.t -> unit) -> t -> unit
             val fold_vertex : (V.t -> '-> 'a) -> t -> '-> 'a
             val remove_vertex : t -> V.t -> t
           end->
      sig
        module G :
          sig
            type t = G.t
            module V :
              sig
                type t = G.V.t
                val compare : t -> t -> int
                val hash : t -> int
                val equal : t -> t -> bool
              end
            val succ : t -> V.t -> V.t list
            val iter_succ : (V.t -> unit) -> t -> V.t -> unit
            val fold_succ : (V.t -> '-> 'a) -> t -> V.t -> '-> 'a
            val iter_vertex : (V.t -> unit) -> t -> unit
            val fold_vertex : (V.t -> '-> 'a) -> t -> '-> 'a
            val remove_vertex : t -> V.t -> t
          end
        module Vertex_Set :
          sig
            type elt = G.V.t
            type t
            val empty : t
            val is_empty : t -> bool
            val mem : elt -> t -> bool
            val add : elt -> t -> t
            val singleton : elt -> t
            val remove : elt -> t -> t
            val union : t -> t -> t
            val inter : t -> t -> t
            val diff : t -> t -> t
            val compare : t -> t -> int
            val equal : t -> t -> bool
            val subset : t -> t -> bool
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val for_all : (elt -> bool) -> t -> bool
            val exists : (elt -> bool) -> t -> bool
            val filter : (elt -> bool) -> t -> t
            val partition : (elt -> bool) -> t -> t * t
            val cardinal : t -> int
            val elements : t -> elt list
            val min_elt : t -> elt
            val max_elt : t -> elt
            val choose : t -> elt
            val split : elt -> t -> t * bool * t
            val find : elt -> t -> elt
            val of_list : elt list -> t
          end
        module VSetset :
          sig
            type elt = Vertex_Set.t
            type t
            val empty : t
            val is_empty : t -> bool
            val mem : elt -> t -> bool
            val add : elt -> t -> t
            val singleton : elt -> t
            val remove : elt -> t -> t
            val union : t -> t -> t
            val inter : t -> t -> t
            val diff : t -> t -> t
            val compare : t -> t -> int
            val equal : t -> t -> bool
            val subset : t -> t -> bool
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val for_all : (elt -> bool) -> t -> bool
            val exists : (elt -> bool) -> t -> bool
            val filter : (elt -> bool) -> t -> t
            val partition : (elt -> bool) -> t -> t * t
            val cardinal : t -> int
            val elements : t -> elt list
            val min_elt : t -> elt
            val max_elt : t -> elt
            val choose : t -> elt
            val split : elt -> t -> t * bool * t
            val find : elt -> t -> elt
            val of_list : elt list -> t
          end
        val allminsep : G.t -> Vertex_Set.t list
        val list_of_allminsep : G.t -> G.V.t list list
        val set_of_allminsep : G.t -> VSetset.t
      end
  module I :
    functor
      (G : sig
             type t
             module V : Sig.COMPARABLE
             val succ : t -> V.t -> V.t list
             val iter_succ : (V.t -> unit) -> t -> V.t -> unit
             val fold_succ : (V.t -> '-> 'a) -> t -> V.t -> '-> 'a
             val iter_vertex : (V.t -> unit) -> t -> unit
             val fold_vertex : (V.t -> '-> 'a) -> t -> '-> 'a
             module Mark :
               sig
                 type graph = t
                 type vertex = V.t
                 val clear : graph -> unit
                 val get : vertex -> int
                 val set : vertex -> int -> unit
               end
           end->
      sig
        module G :
          sig
            type t = G.t
            module V :
              sig
                type t = G.V.t
                val compare : t -> t -> int
                val hash : t -> int
                val equal : t -> t -> bool
              end
            val succ : t -> V.t -> V.t list
            val iter_succ : (V.t -> unit) -> t -> V.t -> unit
            val fold_succ : (V.t -> '-> 'a) -> t -> V.t -> '-> 'a
            val iter_vertex : (V.t -> unit) -> t -> unit
            val fold_vertex : (V.t -> '-> 'a) -> t -> '-> 'a
            module Mark :
              sig
                type graph = t
                type vertex = V.t
                val clear : graph -> unit
                val get : vertex -> int
                val set : vertex -> int -> unit
              end
          end
        module Vertex_Set :
          sig
            type elt = G.V.t
            type t
            val empty : t
            val is_empty : t -> bool
            val mem : elt -> t -> bool
            val add : elt -> t -> t
            val singleton : elt -> t
            val remove : elt -> t -> t
            val union : t -> t -> t
            val inter : t -> t -> t
            val diff : t -> t -> t
            val compare : t -> t -> int
            val equal : t -> t -> bool
            val subset : t -> t -> bool
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val for_all : (elt -> bool) -> t -> bool
            val exists : (elt -> bool) -> t -> bool
            val filter : (elt -> bool) -> t -> t
            val partition : (elt -> bool) -> t -> t * t
            val cardinal : t -> int
            val elements : t -> elt list
            val min_elt : t -> elt
            val max_elt : t -> elt
            val choose : t -> elt
            val split : elt -> t -> t * bool * t
            val find : elt -> t -> elt
            val of_list : elt list -> t
          end
        module VSetset :
          sig
            type elt = Vertex_Set.t
            type t
            val empty : t
            val is_empty : t -> bool
            val mem : elt -> t -> bool
            val add : elt -> t -> t
            val singleton : elt -> t
            val remove : elt -> t -> t
            val union : t -> t -> t
            val inter : t -> t -> t
            val diff : t -> t -> t
            val compare : t -> t -> int
            val equal : t -> t -> bool
            val subset : t -> t -> bool
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val for_all : (elt -> bool) -> t -> bool
            val exists : (elt -> bool) -> t -> bool
            val filter : (elt -> bool) -> t -> t
            val partition : (elt -> bool) -> t -> t * t
            val cardinal : t -> int
            val elements : t -> elt list
            val min_elt : t -> elt
            val max_elt : t -> elt
            val choose : t -> elt
            val split : elt -> t -> t * bool * t
            val find : elt -> t -> elt
            val of_list : elt list -> t
          end
        val allminsep : G.t -> Vertex_Set.t list
        val list_of_allminsep : G.t -> G.V.t list list
        val set_of_allminsep : G.t -> VSetset.t
      end
end