sig
  module type S =
    sig
      type elt
      type t
      val empty : Ptset.S.t
      val is_empty : Ptset.S.t -> bool
      val mem : Ptset.S.elt -> Ptset.S.t -> bool
      val add : Ptset.S.elt -> Ptset.S.t -> Ptset.S.t
      val singleton : Ptset.S.elt -> Ptset.S.t
      val remove : Ptset.S.elt -> Ptset.S.t -> Ptset.S.t
      val union : Ptset.S.t -> Ptset.S.t -> Ptset.S.t
      val inter : Ptset.S.t -> Ptset.S.t -> Ptset.S.t
      val diff : Ptset.S.t -> Ptset.S.t -> Ptset.S.t
      val equal : Ptset.S.t -> Ptset.S.t -> bool
      val subset : Ptset.S.t -> Ptset.S.t -> bool
      val iter : (Ptset.S.elt -> unit) -> Ptset.S.t -> unit
      val fold : (Ptset.S.elt -> '-> 'a) -> Ptset.S.t -> '-> 'a
      val exists : (Ptset.S.elt -> bool) -> Ptset.S.t -> bool
      val filter : (Ptset.S.elt -> bool) -> Ptset.S.t -> Ptset.S.t
      val cardinal : Ptset.S.t -> int
    end
  module Make :
    functor
      (X : sig
             type t
             val id : Ptset.Make.t -> int
             val name : string
             val pretty : Format.formatter -> Ptset.Make.t -> unit
           end->
      sig
        type elt = X.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 equal : t -> t -> bool
        val subset : t -> t -> bool
        val iter : (elt -> unit) -> t -> unit
        val fold : (elt -> '-> 'a) -> t -> '-> 'a
        val exists : (elt -> bool) -> t -> bool
        val filter : (elt -> bool) -> t -> t
        val cardinal : t -> int
      end
end