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