(defun find-all-goal-paths (graph start goal-p &optional (path-queue (list (list start)))) (let ((path (first path-queue))) (cond ((null path-queue) nil) ((funcall goal-p (first path)) (cons (reverse path) (find-all-goal-paths graph start goal-p (rest path-queue)))) (t (find-all-goal-paths graph start goal-p (append (new-paths (new-nodes path graph) path) (rest path-queue)))))))find-all-goal-pathsでは,goal-pという目標に達成したかどうかを判断する 述語関数を与えます.pathの先頭の頂点がその述語に与えられ目標状態かどう かが判断されます.ここでは,頂点はシンボルで表現されているため,目標頂 点とeqで等しいかどうかという関数を与えることになります.この目標が達成 されたらば,そのpathを返します. 目標が達成されていなくて,探索木の葉に来たところで,そこまでのpathは無 視して残りのpath-queueをfind-all-goal-pathsに渡します. 以下のように働きます.
<cl> (find-all-goal-paths *graph4* 's (is 'f)) ((S A B E F) (S A D E F) (S D A B E F) (S D E F)) <cl> (find-all-goal-paths *graph6* 's (is 'f)) ((S A B E F) (S A D E F) (S D A B E F) (S D E F)) <cl> (find-all-goal-paths *graph5* 'f (is 's)) ((F E D A S) (F E D S) (F E B A D S) (F E B A S)) <cl> (find-all-goal-paths *graph2* 's (is 'd)) ((S A B E D) (S A D) (S D))isは,
(defun is (x) #'(lambda (y) (eq x y)))関数を返す関数です.(is 'f)というのは f と等しいかどうかを判定する 関数を作ります.