sig
  type unique = int
  type t = private Bottom | Top | Node of Zdd.unique * int * Zdd.t * Zdd.t
  val bottom : Zdd.t
  val top : Zdd.t
  val construct : int -> Zdd.t -> Zdd.t -> Zdd.t
  val unique : Zdd.t -> int
  module S :
    sig
      type elt = int
      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 compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
    end
  type elt = Zdd.S.t
  val empty : Zdd.t
  val is_empty : Zdd.t -> bool
  val mem : Zdd.elt -> Zdd.t -> bool
  val add : Zdd.elt -> Zdd.t -> Zdd.t
  val singleton : Zdd.elt -> Zdd.t
  val remove : Zdd.elt -> Zdd.t -> Zdd.t
  val union : Zdd.t -> Zdd.t -> Zdd.t
  val inter : Zdd.t -> Zdd.t -> Zdd.t
  val diff : Zdd.t -> Zdd.t -> Zdd.t
  val compare : Zdd.t -> Zdd.t -> int
  val equal : Zdd.t -> Zdd.t -> bool
  val subset : Zdd.t -> Zdd.t -> bool
  val iter : (Zdd.elt -> unit) -> Zdd.t -> unit
  val fold : (Zdd.elt -> '-> 'a) -> Zdd.t -> '-> 'a
  val for_all : (Zdd.elt -> bool) -> Zdd.t -> bool
  val exists : (Zdd.elt -> bool) -> Zdd.t -> bool
  val filter : (Zdd.elt -> bool) -> Zdd.t -> Zdd.t
  val partition : (Zdd.elt -> bool) -> Zdd.t -> Zdd.t * Zdd.t
  val cardinal : Zdd.t -> int
  val elements : Zdd.t -> Zdd.elt list
  val min_elt : Zdd.t -> Zdd.elt
  val max_elt : Zdd.t -> Zdd.elt
  val choose : Zdd.t -> Zdd.elt
  val split : Zdd.elt -> Zdd.t -> Zdd.t * bool * Zdd.t
  val choose_list : Zdd.t -> int list
  val iter_list : (int list -> unit) -> Zdd.t -> unit
  val memo_rec1 : ((Zdd.t -> 'a) -> Zdd.t -> 'a) -> Zdd.t -> 'a
  val memo_rec2 :
    ((Zdd.t * Zdd.t -> 'a) -> Zdd.t * Zdd.t -> 'a) -> Zdd.t * Zdd.t -> 'a
  module type ARITH =
    sig
      type t
      val zero : Zdd.ARITH.t
      val one : Zdd.ARITH.t
      val add : Zdd.ARITH.t -> Zdd.ARITH.t -> Zdd.ARITH.t
    end
  module Cardinal :
    functor (A : ARITH-> sig val cardinal : Zdd.t -> A.t end
  val size : Zdd.t -> int
  val print : Format.formatter -> Zdd.t -> unit
  val print_to_dot : Format.formatter -> Zdd.t -> unit
  val print_to_dot_file : string -> Zdd.t -> unit
  val stat : unit -> int
end