Распространенные проблемы с Лиспом
(setq vecinos '((a . (b c d)) ...)
Используйте *earmuffs*
, то есть звездочки вокруг глобальных (специальных) переменных.Также не используйте setq
с неопределенными переменными.См. Разница между `set`,` setq` и `setf` в Common Lisp? .
(defun primero-en-profundidad-aux (inicial final abierta)
(cond ((eq inicial final)
(print (list inicial)))
;; dead code
;; ((member (list inicial final) (extiende (list inicial)))
;; (print (list inicial final)))
((member final (first abierta))
(print (first abierta)))
(t (primero-en-profundidad-aux inicial final (append (extiende (first abierta)) (rest abierta))))))
Часть, помеченная как мертвый код , мертва, потому чтоmember
по умолчанию проверяет с помощью eql
, который проверяет "то же несоставное значение".Если разные списки содержат одинаковые элементы, возвращается ноль.Кроме того, насколько я знаю, код на самом деле не нужен, потому что он включен в последний тест.
Для справки приведу переписанную реализацию CL.Основное отличие состоит в том, что каждый путь используется в качестве стека: исходная реализация продолжала добавляться в конец списка, что требует большого количества обходов и выделения большого количества ресурсов (текущая реализация все еще далека от оптимальной с точки зрения ресурсовиспользование, но оно близко к оригиналу).В конце путь меняется на обратный, только когда это необходимо.
(defpackage :vecinos (:use :cl))
(in-package :vecinos)
(defparameter *graph*
'((a . (b c d))
(b . (a h))
(c . (a g))
(d . (g))
(g . (c d k))
(h . (b))
(g . (k))))
;; might as well be a function
(defmacro adjacent-nodes (node graph)
`(cdr (assoc ,node ,graph)))
(defun unvisited-neighbours (node path graph)
(remove-if (lambda (neighbour)
(member neighbour path))
(adjacent-nodes node graph)))
(defun extend-path (path graph)
(mapcar (lambda (new-node)
(cons new-node path))
(unvisited-neighbours (first path) path graph)))
;; use a local auxiliary function (with labels)
(defun depth-first-search (initial final graph)
(labels ((dfs (paths)
(cond
((not paths) nil)
((eq initial final) (list initial))
((member final (first paths))
(reverse (first paths)))
(t (dfs (append (extend-path (first paths) graph)
(rest paths)))))))
(dfs (list (list initial)))))
(depth-first-search 'a 'k *graph*)
Подсказки по ракетке
Ракетка определяет функцию filter
, которую поддерживает элементы, удовлетворяющие предикату.Вам нужно использовать дополнение (not?
) вашего предиката.