На этом шаге мы приведем общие сведения по организации поиска на графах в языке LISP.
Одной из самых распространенных задач, связанных с графами, является поиск на графах.
Под поиском на графах мы будем понимать процесс систематического просмотра всех вершин графа с целью отыскания вершин, удовлетворяющих некоторому условию.
Для организации простейшего поиска в графе, заданном с помощью неизвестной (!) списочной структуры, используется инкапсулированный тип данных множество. Идея алгоритма ясна из приведенной ниже программы.
Программа.
(DEFUN WALK (LAMBDA (GRAPH) (COND ( (NULL GRAPH) NIL ) ( T (LIST-SET (ONE-RANGE GRAPH)) ) ) )) ; ------------------------- ; (DEFUN LIST-SET (LAMBDA (LST) ; Функция LIST-SET преобразует список LST в множество ; (COND ( (NULL LST) NIL ) ( (MEMBER (CAR LST) (CDR LST)) (LIST-SET (CDR LST)) ) ( T (CONS (CAR LST) (LIST-SET (CDR LST))) ) ) )) ; -------------------------- ; (DEFUN ONE-RANGE (LAMBDA (LST) ; Списочная структура LST "ужимается" в ; ; одноуровневый список ; ( (NULL LST) NIL ) ( (ATOM LST) (CONS (CAR LST) NIL) ) ( APPEND (ONE-RANGE (CAR LST)) (ONE-RANGE (CDR LST)) ) ))
Тестовый пример:
$ (WALK '((1 . (2 3 4)) (2 . (3)) (3 . (4)))) (1 2 3 4)
На следующем шаге мы рассмотрим поиск в глубину.