(defun addbranches (location branches) (setf (get location 'branch) branches)) (addbranches 'denton '(acity bcity)) (addbranches 'acity '(city dcity)) (addbranches 'bcity '(ecity)) (addbranches 'city '(fcity)) (addbranches 'ecity '(gcity hcity icity)) (addbranches 'gcity '(jcity kcity)) (addbranches 'hcity '(lcity mcity)) (addbranches 'icity '(ncity ocity)) (defun match (element pattern) (equal element pattern)) (defun morepaths (path) (mapcar (lambda (nextpath) (cons nextpath path)) (get (car path) 'branch))) (defun depth-first (tree pattern) (let* ((paths (list (list tree))) (current paths)) (loop (setq current (car paths)) (cond ((null paths) (return nil)) ((match (car current) pattern) (return (reverse current))) (t (setq paths (append (morepaths current) (cdr paths))))))))