sig
  type t = Domain.t
  val empty : SetDomain.S.t
  val is_empty : SetDomain.S.t -> bool
  val mem : int -> SetDomain.S.t -> bool
  val add : int -> SetDomain.S.t -> SetDomain.S.t
  val singleton : int -> SetDomain.S.t
  val remove : int -> SetDomain.S.t -> SetDomain.S.t
  val union : SetDomain.S.t -> SetDomain.S.t -> SetDomain.S.t
  val inter : SetDomain.S.t -> SetDomain.S.t -> SetDomain.S.t
  val diff : SetDomain.S.t -> SetDomain.S.t -> SetDomain.S.t
  val compare : SetDomain.S.t -> SetDomain.S.t -> int
  val equal : SetDomain.S.t -> SetDomain.S.t -> bool
  val subset : SetDomain.S.t -> SetDomain.S.t -> bool
  val iter : (int -> unit) -> SetDomain.S.t -> unit
  val cardinal : SetDomain.S.t -> int
  val elements : SetDomain.S.t -> int list
  val min_elt : SetDomain.S.t -> int
  val max_elt : SetDomain.S.t -> int
  val choose : SetDomain.S.t -> int
  val remove_up : int -> SetDomain.S.t -> SetDomain.S.t
  val remove_low : int -> SetDomain.S.t -> SetDomain.S.t
end