Логическое программирование на языке Visual Prolog. Солдатова О.П - 65 стр.

UptoLike

65
оказывается непрактичным, если пространство состояний является
достаточно сложным. Поэтому отношение следования after обычно
определяется неявно, при помощи правил вычисления вершин, следующих за
некоторой заданной вершиной.
Другой проблемой при описании пространства состояний является
способ представления самих вершин, то есть самих состояний.
В качестве первого примера решения таких задач рассмотрим задачу о
ханойских башнях. Есть три стержня и набор дисков разного диаметра. В
начале игры все диски надеты на левый стержень. Цель игры заключается в
переносе всех дисков на правый стержень по одному стержню за раз, при
этом нельзя ставить диск большего диаметра на диск меньшего диаметра.
Для этой игры есть простая стратегия
:
1. Один диск перемещается непосредственно;
2. N дисков переносятся в 3 этапа:
Перенести N-1 диск на средний стержень;
Перенести последний диск на правый стержень;
Перенести N-1 диск со среднего на правый стержень.
В программе на языке Пролог есть 3 предиката:
hanoi запускающий предикат, указывает сколько дисков надо
переместить;
move описывает правила перемещения дисков с одного стержня
на другой;
informуказывает на действие с конкретным диском.
Пример 74: решение задачи о ханойских башнях.
domains
loc=right;middle;left
% описывает состояние стержней
predicates
hanoi(integert)
% определяет размерность задачи
move(integer,loc,loc,loc)
% определяет переход из одной вершины пространства состояния в
другую, то есть описывает правила перекладывания дисков
inform(loc,loc)
% распечатывает
действия с дисками
clauses
hanoi(N):-move(N,left,middle,right).
move(1,A,_,C):-inform(A,C),!.
move(N,A,B,C):-N1=N-1, move(N1,A,C,B),
inform(A,C), move(N1,B,A,C).
inform(Loc1,Loc2):-nl, write(“Move a disk from “,Loc1,” to “, Loc2).
goal
hanoi(3).