sig
  module type SMALLSET =
    sig
      type t
      val is_empty : t -> bool
      val subset : t -> t -> bool option
      val inter : t -> t -> t
      val union : t -> t -> t
      val compare : t -> t -> int
      val string_of : t -> string
      val normalize : t -> t
      val diff : t -> t -> t
    end
  module type S =
    sig
      type elm
      type t =
          [ `Lower of LowerUpperNeg.S.elm
          | `LowerNeg of LowerUpperNeg.S.elm * LowerUpperNeg.S.elm
          | `LowerUpper of LowerUpperNeg.S.elm * LowerUpperNeg.S.elm
          | `Neg of LowerUpperNeg.S.elm
          | `Upper of LowerUpperNeg.S.elm ]
      val create_lower : LowerUpperNeg.S.elm -> LowerUpperNeg.S.t
      val create_upper : LowerUpperNeg.S.elm -> LowerUpperNeg.S.t
      val create_neg : LowerUpperNeg.S.elm -> LowerUpperNeg.S.t
      val create_lowerupper :
        LowerUpperNeg.S.elm -> LowerUpperNeg.S.elm -> LowerUpperNeg.S.t
      val create_lowerneg :
        LowerUpperNeg.S.elm -> LowerUpperNeg.S.elm -> LowerUpperNeg.S.t
      val compare : LowerUpperNeg.S.t -> LowerUpperNeg.S.t -> int
      val merge : LowerUpperNeg.S.t -> LowerUpperNeg.S.t -> LowerUpperNeg.S.t
      val get_exact : LowerUpperNeg.S.t -> LowerUpperNeg.S.elm option
      val string_of : LowerUpperNeg.S.t -> string
    end
  module Make :
    functor (Set : SMALLSET->
      sig
        type elm = Set.t
        type t =
            [ `Lower of elm
            | `LowerNeg of elm * elm
            | `LowerUpper of elm * elm
            | `Neg of elm
            | `Upper of elm ]
        val create_lower : elm -> t
        val create_upper : elm -> t
        val create_neg : elm -> t
        val create_lowerupper : elm -> elm -> t
        val create_lowerneg : elm -> elm -> t
        val compare : t -> t -> int
        val merge : t -> t -> t
        val get_exact : t -> elm option
        val string_of : t -> string
      end
end