sig
  type t = Zdd.t
  val create : ?primary:int -> bool array array -> t
  val create_sparse : ?primary:int -> columns:int -> int list array -> t
  val find_solution : t -> solution
  val iter_solution : (solution -> unit) -> t -> unit
  val count_solutions : t -> int
  module type ARITH =
    sig type t val zero : t val one : t val add : t -> t -> t end
  module Count :
    functor (A : ARITH-> sig val count_solutions : t -> A.t end
end