;; This is an iterative breadth-first search example from the book (setf (get 's 'neighbors) '(a d) (get 'a 'neighbors) '(s b d) (get 'b 'neighbors) '(a c e) (get 'c 'neighbors) '(b) (get 'd 'neighbors) '(s a e) (get 'e 'neighbors) '(b d f) (get 'f 'neighbors) '(e)) (setf goal 'f) (defun bsolve (initial) (do ((queue (list (list initial initial)) ; first parameter (append (cdr queue) new-paths)) (new-paths nil nil)) ; second parameter ((null queue)) ; termination test (when (goal-recognizer (caar queue)) (return (values (caar queue) (cdar queue)))) (setq new-paths (expand-path (car queue))))) (defun goal-recognizer (state) (if (eql state goal) t nil)) (defun expand-path (path) (print path) (mapcar #'(lambda (new-node) (cons new-node path)) (remove-if #'(lambda (neighbor) (member neighbor path)) (get (first path) 'neighbors))))