Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МЕТОДИЧКА_PROLOG_new.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
600.58 Кб
Скачать

3.5.1.Бектрекінг з внутрішньою ціллю.

Бектерінг з внутрішньою ціллю ілюструється програмою:

predicates

type(symbol, symbol)

is_a(symbol, symbol)

lives(symbol, symbol)

can_swim(symbol)

goal

can_swim(What) ,

write("A ", What, " can swim.").

clauses

type(ungulate, animal).

type(fish, animal).

is_a(zebra, ungulate).

is_a(herring, fish).

is_a(shark,fish).

lives(zebra, on_land).

lives(frog, on_land).

lives(frog,in_water).

lives(shark, in_water).

can_swim(Y) :-

type(X, animal) ,

is_a(Y, X) , lives(Y,in_water).

Вправи.

3.1.Наберіть останню програму і, використовуючи директиву trace, розгляньте послідовність задоволення вмонтованої цілі.

3.2.Напишіть предикат Прологу, який буде визначати позицію букви в алфавіті:

alphabet-position (Letter, Position).

Наприклад Position=1 якщо Letter=a т.д.

3.3.Напишіть програму Пролога, яка б визначала і друкувала значення n!. Значення n вводиться з клавіатури і є цілим.

3.4.Напишіть програму, яка знаходить найменше спільне кратне двох цілих чисел a i b (значення яких вводяться з клавіатури) НСК(a,b) , скориставшись формулою:

, де НСД(a,b) позначає найбільший спільний дільник. Для знаходження НСД(a,b) використайте окремий предикат, який підключіть до вашої програми за допомогою директиви include.

Лабораторна робота № 4 контроль пошуку рішень

Пролог має два спеціальні предикати, які дозволяють вам контролювать механізм бектрекінгу: предикат fail, котрий примушує запускати механізм бектрекінгу, і cut (позначається !), який використовується для відміни бектрекінгу.

4.1.Використання предикату fail.

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

domains

name = symbol

predicates

father(name, name)

everybody

clauses

father(leonard, katherine).

father(carl, jason).

father(carl, marilyn).

everybody :-

father(X, Y),

write(X, " is ", Y, "'s father\n"),

fail.

Зазначимо, що даремно використовувати підціль в тілі правила після fail . Враховуючи те, що значення fail є “хибність” (невдача), тому не має шляхів, які досягають підціль, яка знаходиться після предикату fail.

4.2.Відміна бектрекінгу.

Предикат cut виробляє значеня істина, яке позначає успіх і позначається “!”. Він розміщується в тілі правила в якості підцілі. Коли обробка досягає cut, він є завжди успішним і тому викликається наступна за ним ціль. Тому що cut був пройдений, не можливо провести бектрекінг підцілей, які розміщені перед cut в оброблюваному пункті і тому не можливо перейти до інших пунктів, які визначають поточний предикат.

Існує два основних правила використання cut:

1.Коли ви знаєте попередньо, що певні варіанти ніколи не дадуть поштовху в знаходженні розв'язку, тоді використання cut(зелений cut) відкидає перегляд альтернативних шляхів.