anchor.diff:  
   (defun scene-facts (init-scene goal-scene
                       &key
  +                      object-alist
  +                      moveable-types
                         max-locations
                         (encoding :linear)
                         (resolution 0.2d0)
  
positive.code: 
  (defun scene-state (scene resolution
                      &key
                        (encoding :linear)
                        goal)
    (labels ((location-predicate (object parent i j)
               (let ((parent-frame (scene-graph-find scene parent)))
                 (cond
                   ((robray::scene-frame-geometry-isa parent-frame "surface")
                    (ecase encoding
                      (:quadratic (list 'at object (itmp-encode-location parent i j)))
                      (:linear `(= (position ,object) ,(itmp-encode-location parent i j)))))
                   ((robray::scene-frame-geometry-isa parent-frame "stackable")
                    (assert (eq encoding :linear))
                    `(= (position ,object) ,parent))
  
negative.code:                (if (or goal (eq encoding :linear))
                     (list loc)
                     (list loc (occupied-predicate parent i j))))))
      (append (loop for object in moveable-objects
                 for f = (scene-graph-find scene object)
                 when f
                 collect (parent-location object (scene-graph-parent-name scene object)))
              (loop for (name parent i j) in (scene-state-pairs scene :resolution resolution)
                 nconc
                   (frame-predicates name parent i j)))))
  
  
  
  