Здавалка
Главная | Обратная связь

Пример на использование предиката звука.



 

9.1. Комбинаторные задачи, реализация задачи "Ханойская башня".

Рассмотрим задачу «Ханойская башня» которую, как говорят, придумал в 1883 г. французский математик Люка. Имеются три стержня, на одном из которых помещены N колец разного диаметра, при этом, чем меньше диаметр кольца, тем выше оно

лежит. Требуется переместить диски с первого на третий стержень за некоторую последовательность ходов, каждый из которых заключается в перекладывания верхнего диска с одного из стержней на другой стержень. При этом больший диск никогда нельзя ставить на меньший диск. Если ввести обозначения:

<a,b> элементарная операция-перемещение диска со стержня с номером a на стержень b,

(m,a,b) программа перемещения m дисков с a на b.

(1,a,b) → <a,b> перемещение одного диска – элементарная операция.

Очевидно можно записать:

(m,a,b) → (m-1,a,c) <a,b> (m-1,c,b)

Т. е. для перемещения m-дисков с a на b нужно:

1) Переместить m-1 – диск с a на c (с – вспомогательный стержень).

2) Переместить нижний диск с номером m с a на b.

3) Переместить m-1 – диск с c на b (с – вспомогательный стержень).

Здесь возникает рекурсия – целевое действие определяется через промежуточные действия того же вида.

Например, пусть m = 3, т. е. имеется три кольца. Тогда:

(3,1,3)→(2,1,2)<1,3>(2,2,3)

Можно переписать в виде

(3,1,3)→ (2,1,2) <1,3> (2,2,3)

→ (1,1,3)<1,2>(1,3,2) <1,3> (1,2,1)<2,3>(1,1,3)

Окончательно:

<1,3><1,2><3,2><1,3><2,1><2,3><1,3>

Программа 12 решает задачу «Ханойская башня» на ПРОЛОГе:

DOMAINS

loc =right;middle;left

PREDICATES

hanoi(integer)

move(integer,loc,loc,loc)

inform(loc,loc)

GOAL

hanoi(5).

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(“Диск с”, Loc1, “ на “, Loc2).

 

9.2Другие примеры комбинаторики.

Классическим примером использования алгоритма поиска с возвратом является задача о восьми ферзях. Её формулировка такова: «Расставить на стандартной 64-клеточной шахматной доске 8 ферзей так, чтобы ни один из них не находился под боем другого». Сперва на доску ставят одного ферзя, а потом пытаются поставить каждого следующего ферзя так, чтобы его не били уже установленные ферзи. Если на очередном шаге такую установку сделать нельзя — возвращаются на шаг назад и пытаются поставить ранее установленного ферзя на другое место.

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.