(defun tree-paths (tree) (cond ((null (cdr tree)) (list tree)) (t (mapcar #'(lambda (x) (cons (car tree) x)) (apply #'append (mapcar #'(lambda (p) (tree-paths p)) (cdr tree)))))))これを走らせると,下のようになります.
<cl> (tree-paths (graph-tree *graph2* 's)) ((S A B C) (S A B E D) (S A B E F) (S A D E B C) (S A D E F) (S D A B C) (S D A B E F) (S D E B A) (S D E B C) (S D E F)) <cl> (find-all-paths *graph2* 's) ((S A B C) (S A B E D) (S A B E F) (S A D E B C) (S A D E F) (S D A B C) (S D A B E F) (S D E B A) (S D E B C) (S D E F))逆に*tree1*から*tree2*へ変換する関数を考えると,ひとつの解決方法として, pathからedge-listを作り,それをグラフとみなして,graph-treeを呼ぶとい う方法が考えられます.
(defun paths-tree (paths) (graph-tree (list 'elist (paths-to-edge-list paths)) (caar paths))) (defun paths-to-edge-list (paths) (let ((result nil)) (dolist (path paths) (setq result (union (mapcar #'list (butlast path) (cdr path)) result :test #'edge-equal))) result))butlastというのは,リストの最後の要素を取り除く組み込み関数です.
<cl> (butlast '(1 2 3)) (1 2)butlastの定義はどのようになるでしょうか.