Or_(N3, N4, Output)

Якщо ми задамо ціль :

goal: xor(Input1,Input2,Output)

Проінтерпретуємо отриманий результат як таблицю істинності, тоді ми можемо перевірити, чи наша програма вірно моделює потрібну лінію зв'язку.

 

9.5.Задача про ханойські башні.

Розглянемо класичну задачу про ханойські башні. Історія цієї задачі базується на старовинній легенді про буддійський монастир у В'єтнамі. Легенда говорить про наступне. В цьому храмі монахи постійно, з давніх часів, виконують таку роботу. Вони переміщують по спеціальному алгоритму шістдесят чотири диски на трьох сердечниках при певних обмеженнях. Як тільки вони закінчать переміщення дисків з першого сердечника на третій, наступить кінець світу.

Уточнимо постановку задачі. Нехай ми маємо три спеціальних сердечники, на яких проходить переміщення дисків. Висота сердечників достатня для того, щоб на ній могли розміститись всі n дисків. Всі диски різного діаметру, а внутрішній отвір більший за діаметр сердечників. Спочатку всі диски розміщені на першому сердечнику в спадному, згідно зовнішнього діаметра, порядку. Їх потрібно перенести на третій сердечник, використовуючи другий сердечник, так , щоб вони розмістились в такому ж порядку, як були на першому сердечнику. При переміщеннях потрібно дотримуватись такого обмеження: ніколи диск більшого диаметра не може знаходитись зверху хоча б над одним диском меншого діаметра.

Для переносу можна запропонувати наступний рекурсивний алгоритм.

* Один диск можна перенести прямо на потрібний сердечник.

* N дисків можна перемістить так:

1.Перемістить останній (N-ий) диск прямо на третій (правий) сердечник;

2.Перемістить N-1 диск на другий (середній) сердечник;

3.Перемістить прямо N-ий диск з третього сердечника на перший (лівий);

4.Перемістить N-1 диск з другого на третій;

5.Перемістить N-ий диск прямо з першого на третій сердечник;

 

Програма Прологу, яка вирішуз задачу про Ханойські Башні, буде використовувати три предикати:

1. hanoi з одним параметром, який характеризує загальну кількість дисків.

2. move, який описує переміщення N дисків з одного сердечника на інший, використовуючи третій сердечник, як тимчасове місцезнаходження дисків.

3. inform, відображає на екрані дисплею, як проходять переміщення.

 

Domains

loc = right;

Middle;

Left

Predicates

Hanoi(integer)

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),