anchor.diff:    (thing ?thing name ?chest)
     -->
     ((format t "Monkey throws the ~A off the ~A onto the floor.~%" ?chest ?on))
  -  (assert ?monkey holding blank)
  -  (assert ?thing location ?place on-top-of floor))
  +  (assert (monkey ?monkey holding blank))
  +  (assert (thing ?thing location ?place on-top-of floor)))
   
   (defrule get-key-to-unlock :forward :context mab
     (goal-is-to ? action unlock argument-1 ?obj)
     (thing ? name ?obj on-top-of floor)
     (chest ? name ?obj unlocked-by ?key)
  -  (not (monkey ? holding ?key))
  +  (monkey ? holding ?hold)
  +  (test (not (eql ?hold ?key)))
     (not (goal-is-to ? action hold argument-1 ?key))
     -->
     (assert (goal-is-to ? action hold argument-1 ?key)))
  
positive.code:   (goal-is-to ? action on argument-1 ?obj)
    (thing ? name ?obj location ?place)
    (monkey ? location ?place holding ?hold)
    (test (not (eql ?hold blank)))
    (not (goal-is-to ? action hold argument-1 blank))
    -->
    (assert (goal-is-to ? action hold argument-1 blank)))
  
negative.code:   (erase ?goal))
  
  (defrule drop-object :forward :context mab
    (goal-is-to ?goal action hold argument-1 blank)
    (monkey ?monkey location ?place on-top-of ?on
            holding ?name)
    (test (not (eql ?name 'blank)))
    (thing ?thing name ?name)
    -->
    ((format t "Monkey drops the ~A.~%" ?name))
  