sig
  module type S =
    sig
      type elt
      type t
      val size : LogtkMultiset.S.t -> int
      val cardinal : LogtkMultiset.S.t -> Z.t
      val empty : LogtkMultiset.S.t
      val is_empty : LogtkMultiset.S.t -> bool
      val mem : LogtkMultiset.S.t -> LogtkMultiset.S.elt -> bool
      val find : LogtkMultiset.S.t -> LogtkMultiset.S.elt -> Z.t
      val singleton : LogtkMultiset.S.elt -> LogtkMultiset.S.t
      val doubleton :
        LogtkMultiset.S.elt -> LogtkMultiset.S.elt -> LogtkMultiset.S.t
      val add : LogtkMultiset.S.t -> LogtkMultiset.S.elt -> LogtkMultiset.S.t
      val add_coeff :
        LogtkMultiset.S.t -> LogtkMultiset.S.elt -> Z.t -> LogtkMultiset.S.t
      val union : LogtkMultiset.S.t -> LogtkMultiset.S.t -> LogtkMultiset.S.t
      val intersection :
        LogtkMultiset.S.t -> LogtkMultiset.S.t -> LogtkMultiset.S.t
      val sum : LogtkMultiset.S.t -> LogtkMultiset.S.t -> LogtkMultiset.S.t
      val difference :
        LogtkMultiset.S.t -> LogtkMultiset.S.t -> LogtkMultiset.S.t
      val product : Z.t -> LogtkMultiset.S.t -> LogtkMultiset.S.t
      val filter :
        (LogtkMultiset.S.elt -> Z.t -> bool) ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t
      val map :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.elt) ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t
      val map_coeff :
        (LogtkMultiset.S.elt -> Z.t -> Z.t) ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t
      val filter_map :
        (LogtkMultiset.S.elt -> Z.t -> (LogtkMultiset.S.elt * Z.t) option) ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t
      val flat_map :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.t) ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t
      module Seq :
        sig
          val of_seq :
            LogtkMultiset.S.t ->
            LogtkMultiset.S.elt Sequence.t -> LogtkMultiset.S.t
          val to_seq : LogtkMultiset.S.t -> LogtkMultiset.S.elt Sequence.t
          val of_coeffs :
            LogtkMultiset.S.t ->
            (LogtkMultiset.S.elt * Z.t) Sequence.t -> LogtkMultiset.S.t
          val to_coeffs :
            LogtkMultiset.S.t -> (LogtkMultiset.S.elt * Z.t) Sequence.t
        end
      val iter : (LogtkMultiset.S.elt -> unit) -> LogtkMultiset.S.t -> unit
      val fold :
        ('-> LogtkMultiset.S.elt -> 'a) -> '-> LogtkMultiset.S.t -> 'a
      val iter_coeffs :
        (LogtkMultiset.S.elt -> Z.t -> unit) -> LogtkMultiset.S.t -> unit
      val fold_coeffs :
        ('-> LogtkMultiset.S.elt -> Z.t -> 'a) ->
        '-> LogtkMultiset.S.t -> 'a
      val for_all :
        (LogtkMultiset.S.elt -> bool) -> LogtkMultiset.S.t -> bool
      val exists : (LogtkMultiset.S.elt -> bool) -> LogtkMultiset.S.t -> bool
      val choose : LogtkMultiset.S.t -> LogtkMultiset.S.elt
      val of_list : LogtkMultiset.S.elt list -> LogtkMultiset.S.t
      val of_coeffs : (LogtkMultiset.S.elt * Z.t) list -> LogtkMultiset.S.t
      val of_iarray : LogtkMultiset.S.elt LogtkIArray.t -> LogtkMultiset.S.t
      val of_array : LogtkMultiset.S.elt array -> LogtkMultiset.S.t
      val to_list : LogtkMultiset.S.t -> (LogtkMultiset.S.elt * Z.t) list
      val eq : LogtkMultiset.S.t -> LogtkMultiset.S.t -> bool
      val cancel :
        LogtkMultiset.S.t ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t * LogtkMultiset.S.t
      val compare : LogtkMultiset.S.t -> LogtkMultiset.S.t -> int
      val compare_partial :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.elt -> LogtkComparison.t) ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t -> LogtkComparison.t
      val is_max :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.elt -> LogtkComparison.t) ->
        LogtkMultiset.S.elt -> LogtkMultiset.S.t -> bool
      val max :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.elt -> LogtkComparison.t) ->
        LogtkMultiset.S.t -> LogtkMultiset.S.t
      val max_seq :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.elt -> LogtkComparison.t) ->
        LogtkMultiset.S.t -> (LogtkMultiset.S.elt, Z.t) Sequence.t2
      val max_l :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.elt -> LogtkComparison.t) ->
        LogtkMultiset.S.elt list -> LogtkMultiset.S.elt list
      val compare_partial_l :
        (LogtkMultiset.S.elt -> LogtkMultiset.S.elt -> LogtkComparison.t) ->
        LogtkMultiset.S.elt list ->
        LogtkMultiset.S.elt list -> LogtkComparison.t
      val pp :
        (Buffer.t -> LogtkMultiset.S.elt -> unit) ->
        Buffer.t -> LogtkMultiset.S.t -> unit
    end
  module Make :
    functor (X : Map.OrderedType->
      sig
        type elt = X.t
        type t
        val size : t -> int
        val cardinal : t -> Z.t
        val empty : t
        val is_empty : t -> bool
        val mem : t -> elt -> bool
        val find : t -> elt -> Z.t
        val singleton : elt -> t
        val doubleton : elt -> elt -> t
        val add : t -> elt -> t
        val add_coeff : t -> elt -> Z.t -> t
        val union : t -> t -> t
        val intersection : t -> t -> t
        val sum : t -> t -> t
        val difference : t -> t -> t
        val product : Z.t -> t -> t
        val filter : (elt -> Z.t -> bool) -> t -> t
        val map : (elt -> elt) -> t -> t
        val map_coeff : (elt -> Z.t -> Z.t) -> t -> t
        val filter_map : (elt -> Z.t -> (elt * Z.t) option) -> t -> t
        val flat_map : (elt -> t) -> t -> t
        module Seq :
          sig
            val of_seq : t -> elt Sequence.t -> t
            val to_seq : t -> elt Sequence.t
            val of_coeffs : t -> (elt * Z.t) Sequence.t -> t
            val to_coeffs : t -> (elt * Z.t) Sequence.t
          end
        val iter : (elt -> unit) -> t -> unit
        val fold : ('-> elt -> 'a) -> '-> t -> 'a
        val iter_coeffs : (elt -> Z.t -> unit) -> t -> unit
        val fold_coeffs : ('-> elt -> Z.t -> 'a) -> '-> t -> 'a
        val for_all : (elt -> bool) -> t -> bool
        val exists : (elt -> bool) -> t -> bool
        val choose : t -> elt
        val of_list : elt list -> t
        val of_coeffs : (elt * Z.t) list -> t
        val of_iarray : elt LogtkIArray.t -> t
        val of_array : elt array -> t
        val to_list : t -> (elt * Z.t) list
        val eq : t -> t -> bool
        val cancel : t -> t -> t * t
        val compare : t -> t -> int
        val compare_partial :
          (elt -> elt -> LogtkComparison.t) -> t -> t -> LogtkComparison.t
        val is_max : (elt -> elt -> LogtkComparison.t) -> elt -> t -> bool
        val max : (elt -> elt -> LogtkComparison.t) -> t -> t
        val max_seq :
          (elt -> elt -> LogtkComparison.t) -> t -> (elt, Z.t) Sequence.t2
        val max_l : (elt -> elt -> LogtkComparison.t) -> elt list -> elt list
        val compare_partial_l :
          (elt -> elt -> LogtkComparison.t) ->
          elt list -> elt list -> LogtkComparison.t
        val pp : (Buffer.t -> elt -> unit) -> Buffer.t -> t -> unit
      end
end