показана на рис. 11.7.

        решить( Верш, Решение) :-

                вглубину( [ ], Верш, Решение).

        вглубину( Путь, Верш, [Верш | Путь] ) :-

                цель( Верш).

        вглубину( Путь, Верш, Реш) :-

                после( Верш, Верш1),

                not принадлежит( Верш1, Путь),                                         % Цикл ?

                вглубину( [Верш | Путь], Верш1, Реш).

Рис. 11. 7.  Программа поиска в глубину без зацикливания.

Теперь наметим один вариант этой программы. Аргументы Путь и Верш процедуры вглубину можно объединить в один список [Верш | Путь]. Тогда, вместо вершины-кандидата Верш, претендующей на то, что она находится на пути, ведущем к цели, мы будем иметь путь-кандидат П = [Верш | Путь], который претендует на то, что его можно продолжить вплоть до целевой вершины. Программирование соответствующего предиката

        вглубину( П, Решение)

оставим читателю в качестве упражнения.

Наша процедура поиска в глубину, снабженная механизмом обнаружения циклов, будет успешно находить решающие пути в пространствах состояний, подобных показанному на рис. 11.5. Существуют, однако, такие пространства состоянии, в которых наша процедура не дойдет до цели. Дело в том, что многие пространства состояний бесконечны. В таком пространстве алгоритм поиска в глубину может 'потерять' цель, двигаясь вдоль бесконечной ветви графа. Программа будет бесконечно долго обследовать эту бесконечную область пространства, так и не приблизившись к цели. Пространство состояний задачи о восьми ферзях, определенное так, как это сделано в настоящем разделе, на первый взгляд содержит ловушку именно такого рода. Но оказывается, что оно все-таки конечно, поскольку Y-координаты выбираются из ограниченного множества, и поэтому на доску можно поставить 'безопасным образом' не более восьми ферзей.

        вглубину2( Верш, [Верш], _ ) :-

                цель( Верш).

        вглубину2( Верш, [Верш | Реш], МаксГлуб) :-

                МаксГлуб > 0,

                после( Верш, Верш1),

                Maкс1 is МаксГлуб - 1,

                вглубину2( Верш1, Реш, Maкс1).

Рис. 11. 8.  Программа поиска в глубину с ограничением по глубине.

Для того, чтобы предотвратить бесцельное блуждание по бесконечным ветвям, мы можем добавить

в базовую процедуру поиска в глубину еще одно усовершенствование, а именно, ввести

ограничение на глубину поиска

. Процедура поиска в глубину будет тогда иметь следующие аргументы:

        вглубину2( Верш, Решение, МаксГлуб)

Вы читаете Prolog
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату