anchor.diff:    (:unix "libcryptominisat5.so")
     (t (:default "libcryptominisat5.so")))
   (load-foreign-library 'libcryptominisat)
  +
  +; TODO: add_xor_clause?
   
   ; Describe the C interface.
   
  
positive.code: (defcstruct slice-lbool- (vals (:pointer c-lbool)) (num-vals :uint))
  (defctype slice-lbool (:struct slice-lbool-))
  
  (defcfun "cmsat_new" (:pointer (:struct SATSolver)))
  
  (defcfun "cmsat_set_num_threads"
    :void
    (self (:pointer (:struct SATSolver))) (n :unsigned-int))
  
  (defcfun "cmsat_new_vars"
    :void
  
negative.code:   "Call the solution routine."
    (getf (cmsat-solve solver) 'x))
  
  (defun solve-with-assumptions (solver assumptions)
    "Call the solution routine, providing the assumptions.
  
     Assumptions are represented by a list of literals.
  
     Literals are represented by lists of the form '(<literal_id>, <is_inverted>), where:
  
     <literal_id> is a non-negative integer
     <is_inverted> is an optional argument; if True, the literal is considered negative,
          otherwise it is positive.
    "
    ; TODO: rename "create-c-clause" to something else
    (getf (cmsat-solve-with-assumptions solver (create-c-clause assumptions) (length clause)) 'x))
  
  (defun get-model (solver)
    "Get model satysfying the problem.
  
  