anchor.diff:       (when (plusp run-size)
          (push run-size runs))
        (nreverse runs))))
  +
  +(defun puzzle-prefix-ok-p (puzzle rows)
  +  (loop
  +     for j below (width puzzle)
  +     for line = (get-col puzzle j)
  +     if (not (constraint-match-prefix-p line (svref (verti puzzle) j) rows))
  +     return nil
  +     finally (return t)))
   
   (defun puzzle-ok-p (puzzle)
     (loop
  
positive.code:                    for j below (width puzzle)
                     for cell in candidate
                     do (setf (aref (cells puzzle) row j) cell))
               if (solve-aux (1+ row))
               do (return-from solve-aux puzzle))
            (loop for j below (width puzzle)
               for cell in original-row
  
negative.code: 
  ;;; FIXME add pruning to solve-puzzle
  ;;; FIXME set package
  ;;; TODO add constraints to puzzle printout
  
  (defclass puzzle ()
    ((height :reader height :initarg :height :documentation "number of rows"
             :initform (error "must specify height")
             :type 'fixnum)
     (width :reader width :initarg :width :documentation "number of columns"
            :initform (error "must specify width")
            :type 'fixnum)
     (cells :accessor cells :documentation "array of cells"
            :type '(simple-array (or (eql :unknown) (eql :black) (eql :white)) 2))
     (horiz :accessor horiz :documentation "horizonal constraints"
            :type '(simple-array list))
     (verti :accessor verti :documentation "vertical constraints"
            :type '(simple-array list))))
  
  (defmethod initialize-instance :after ((puzzle puzzle) &key)
    (setf (cells puzzle)
  