;; This is a recursive 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) (bsolve1 (list (list initial initial)))) (defun bsolve1 (queue) (if (goal-recognizer (caar queue)) (values (caar queue) (cdar queue)) (bsolve1 (append (cdr queue) (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))))