sig
  module type S =
    sig
      type elt
      type t
      val is_empty : Collection.Set.S.t -> bool
      val mem : Collection.Set.S.t -> Collection.Set.S.elt -> bool
      val cardinal : Collection.Set.S.t -> int
      val iter : (Collection.Set.S.elt -> unit) -> Collection.Set.S.t -> unit
      val fold :
        (Collection.Set.S.elt -> '-> 'a) -> Collection.Set.S.t -> '-> 'a
      val elements : Collection.Set.S.t -> Collection.Set.S.elt list
      val equal : Collection.Set.S.t -> Collection.Set.S.t -> bool
    end
  module type IS =
    sig
      type elt
      type t
      val is_empty : t -> bool
      val mem : t -> elt -> bool
      val cardinal : t -> int
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val elements : t -> elt list
      val equal : t -> t -> bool
      val create : int -> t
      val clear : t -> unit
      val copy : t -> t
      val add : t -> elt -> unit
      val remove : t -> elt -> unit
    end
  module type PS =
    sig
      type elt
      type t
      val is_empty : t -> bool
      val mem : t -> elt -> bool
      val cardinal : t -> int
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val elements : t -> elt list
      val equal : t -> t -> bool
      val empty : t
      val add : t -> elt -> t
      val remove : t -> elt -> t
      val filter : (elt -> bool) -> t -> t
    end
  module Imperative :
    sig
      module MakeHashSet :
        functor (T : Hashtbl.HashedType->
          sig
            type elt = T.t
            type t
            val is_empty : t -> bool
            val mem : t -> elt -> bool
            val cardinal : t -> int
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val elements : t -> elt list
            val equal : t -> t -> bool
            val create : int -> t
            val clear : t -> unit
            val copy : t -> t
            val add : t -> elt -> unit
            val remove : t -> elt -> unit
          end
      module MakeMutable :
        functor (Set : PS->
          sig
            type elt = Set.elt
            type t
            val is_empty : t -> bool
            val mem : t -> elt -> bool
            val cardinal : t -> int
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val elements : t -> elt list
            val equal : t -> t -> bool
            val create : int -> t
            val clear : t -> unit
            val copy : t -> t
            val add : t -> elt -> unit
            val remove : t -> elt -> unit
          end
    end
  module Persistent :
    sig
      module MakeTreeSet :
        functor (T : Set.OrderedType->
          sig
            type elt = T.t
            type t
            val is_empty : t -> bool
            val mem : t -> elt -> bool
            val cardinal : t -> int
            val iter : (elt -> unit) -> t -> unit
            val fold : (elt -> '-> 'a) -> t -> '-> 'a
            val elements : t -> elt list
            val equal : t -> t -> bool
            val empty : t
            val add : t -> elt -> t
            val remove : t -> elt -> t
            val filter : (elt -> bool) -> t -> t
          end
    end
end