anchor.diff:     goal-zdd
      terminal-zdd
      next-zdd
  +   percept-zdds
      possible-forest
      happens-forest))
   
  
positive.code: (defparameter *i* (initial-iset *r*))
  (defparameter *j* (initial-iset *r*))
  
  (with-zdd
    (-<> *r*
      (make-iset <>
                 '(
                   (true (control xplayer))
                   (true (cell 1 1 B)) (true (cell 1 2 x)) (true (cell 1 3 o))
                   (true (cell 2 1 B)) (true (cell 2 2 o)) (true (cell 2 3 o))
                   (true (cell 3 1 x)) (true (cell 3 2 x)) (true (cell 3 3 x))
                   ))
      (apply-rule-forest *r* <> (zr-possible-forest *r*))
      (draw-zdd *r* <>)
      (dump-iset *r* <>)
      (no <>)
      ))
  
  
  (defun test ()
  
negative.code:              (list r)))
            rules))
  
  (defun make-predicate-zdd (predicate-prefix term->number)
    "Make a ZDD with a single member: the set of all terms for a single predicate.
  
    For example:
  
      (make-predicate-zdd '(ggp-rules::legal) ...)
      (make-predicate-zdd '(ggp-rules::true) ...)
      (make-predicate-zdd '(ggp-rules::sees ggp-rules::white) ...)
  
    "
    (let ((prefix-length (length predicate-prefix)))
      (-<> term->number
        hash-table-alist
        (mapcar (lambda (rule-mapping)
                  (destructuring-bind (term . number) rule-mapping
                    (if (equal predicate-prefix
                               (take prefix-length term))
                      number
                      nil)))
                <>)
        (remove nil <>)
        (zdd-set <>))))
  
  
  (defun make-zdd-reasoner (rules)
  