Начальная установка третьего аргумента пустым списком означает, что мы начинаем поиск, имея чистый лист бумаги. Изменяя эту начальную установку, можно получить разные варианты поиска. Вопрос «найти телефону не заходя в комнаты d и f» можно выразить на Прологе так:
?- есть_телефон(X), переход (a,X,[d,f]).
В разд. 7.9 мы рассмотрим некоторые общие процедуры поиска по графу, в том числе программу, находящую кратчайший путь.
Упражнение 7.2.Допишите вышеприведенную программу так, чтобы она печатала такие сообщения, как «входим в комнату X» и «телефон найден в комнате Y», подставляя в них соответствующие номера комнат.
Упражнение 7.3.Может ли эта программа находить альтернативные пути? Если да, то где нужно «отсечь», чтобы избежать нахождения более чем одного пути?
Упражнение7.4. Чем определяется порядок, в котором просматриваются комнаты?
Ханойские башни - это игра, в которой используются три штыря и набор дисков. Все диски различаются диаметром и нанизываются на штыри через отверстие в центре каждого диска. Первоначально все диски находятся на левом штыре. Цель игры состоит в том, чтобы переместить все диски на центральный штырь. Правый штырь можно использовать как «запасной» для временного размещения дисков. При каждом перемещении диска с одного штыря на другой должны соблюдаться два ограничения: перемещать можно только самый верхний диск на штыре, и, кроме того, нельзя ставить диск на другой диск меньшего размера.
Многим из тех людей, которые играют в эту игру, практически никогда не удается обнаружить весьма простую стратегию, позволяющую успешно играть в Ханойские башни с тремя штырями и Nдисками. Чтобы не утомлять вас поисками решения этой задачи, мы откроем его:
• Граничное условие выполняется в случае, когда на исходном (левом) штыре нет дисков.
• Переместить N-1 дисков с исходного штыря на запасной (правый) штырь, используя итоговый штырь как запасной; отметим, что это перемещение осуществляется рекурсивно.
• Переместить один диск с исходного штыря на итоговый штырь. В этом месте наша программа будет выдавать сообщение об этом перемещении.
• Наконец, переместить N-1 дисков с запасного на итоговый, используя исходный штырь в качестве запасного.
Пролог-программа, реализующая данную стратегию, определяется следующим образом. Определяется предикат ханойс одним аргументом, такой, что xaной(N)означает выдачу сообщений о последовательности перемещений, когда на исходном штыре находится Nдисков. Из двух утверждений предиката переместитьодин задает граничное условие, которое сформулировано выше, а второй – реализует рекурсивные случаи. Предикат переместитьимеет четыре аргумента. Первый аргумент – это число дисков, которые нужно переместить. Три другие представляют исходный, итоговый и запасной штыри для перемещения дисков. Предикат сообщитьиспользует предикат writeдля печати названий штырей, участвующих в перемещении диска.
xaной(N):- переместить(N, левый,средний,правый).
переместить(О,_,_,_):-!.
переместить(N, А,В,С):-М is N-1,переместить(М,А,С,В),сообщить(А,В), переместить(М,С,В,А).
сообщить(Х,Y):-write([переместили,диск,со,штыря,Х,на, штырь,Y]),nl.
7.4. Справочник комплектующих деталей
В главе 3 мы рассматривали программу, выдающую на печать список деталей, необходимых при сборке некоторого узла на основе справочника комплектующих деталей. В данном разделе мы усовершенствуем эту программу, будем учитывать количество деталей путем суммирования числа требуемых деталей по мере перехода от узлов к их составляющим. Кроме того, усовершенствованная программа правильно обрабатывает повторения; процедура собратьустраняет повторения при суммировании для каждой из требуемых деталей перед тем, как ответ выдается на печать.
Организация базы данных справочника сходна с тем, что описано в гл. 3. Сборочный узел представлен в виде списка структур вида чис(X, Y), где X– это имя некоторой детали (простой детали или узла), a Y– необходимое количество таких деталей. Ниже перечислены все предикаты измененной программы с указанием их назначения:
Деталиузла(А):выдает на печать список всех простых деталей, требующихся для сборки узла А, и количество каждой детали.
Читать дальше