Перебір в пролозі

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

Перебір в пролозі

Зв'язок між X і Y можна визначити за допомогою наступних трьох правил:

Правило 1: якщо X <3, то Y = 0

Правило 2: якщо 3<= X и X <6, то Y = 2

Правило 3: якщо 6 <= X, то Y = 4

На Пролозі це можна висловіть за допомогою бінарного відношення f (X, Y) так:

f (X, 0): - X <3. % Правило 1

f (X, 2): - 3 =

f (X, 4): - 6 =

У цій програмі передбачається, звичайно, що до моменту початку обчислення f (X, Y) X вже конкретизований будь-яким числом; це необхідно для виконання операторів порівняння.

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

write ( 'менше, ніж'), write (Y).

write ( 'менше, ніж'), write (X).

Цільове твердження? - менше (5, 2). зіставляється з головою першого твердження при Х = 5 і У = 2. Однак не вдається узгодити перший член кон'юнкції в тілі затвердження X

Такий процес узгодження цільового затвердження шляхом прямого просування по програмі ми називаємо прямий трасуванням (forward tracking).

Відсікання в пролозі, види відсікань.

Спеціальне цільове твердження «!,», Зване відсіканням. Відсікання реалізуетяс наступним чином: після узгодження ЦУ, що стоїть перед відсіканням, все припущення з тим же предикатом розташовані після відсікання не розглядаються.

Видалення відсікань з програми може привести до зміни її декларативного сенсу. Але бувають також такі випадки, коли відсікання на нього не впливало. Використання відсікань останнього типу вимагає меншої обережності, і тому такі відсікання іноді називають "зеленими відсіканнями". З точки зору наочності програми такі відсікання "невинні" і їх використання цілком прийнятно. При читанні програми їх можна просто ігнорувати. Навпаки, відсікання, що впливають на декларативний зміст, називаються "червоними". Червоні відсікання - це такі відсікання, які роблять програму важкою для розуміння, і їх потрібно застосовувати з особливою обережністю.

Приклади, які використовують відсікання:

1) Обчислення максимуму

2) Належність елемента списку

-add (a, Lst1, Lst2), Lst1 = [b, v, c], write (Lst2). % [A, b, v, c] Yes.

-add (a, Lst1, Lst2), Lst1 = [b, a, c], write (Lst2).% No

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

- op (600, xfx, батько).

Такий запис повідомить Прологу, що ми хочемо використовувати "батько" в якості оператора з пріоритетом 600 і типом 'xfx', що позначає одну з різновидів інфіксне оператора. Форма специфікатор 'xfx' вказує на те, що оператор, позначений через 'f', розташовується між аргументами, позначеними через 'х'.

Існують три групи типів операторів, що позначаються специфікаторами:

1) інфіксне оператори трьох типів: xfx xfy yfx

2) префіксние оператори двох типів: fx fy

3) постфіксні оператори двох типів: ХF yf

Специфікатори обрані з таким розрахунком, щоб наочніше відобразити структуру виразу, в якому 'f' відповідає оператору, а 'x' і 'y' представляють його аргументи.

Між 'x' і 'y' є різниця. Якщо аргумент укладений в дужки або не має структури (є простим об'єктом), тоді його пріоритет дорівнює 0; якщо ж він структурний, тоді його пріоритет дорівнює пріоритету його головного функтора. За допомогою 'x' позначається аргумент, чий пріоритет повинен бути строго вище пріоритету оператора (т e. Його номер строго менше номера пріоритету оператора); за допомогою 'y' позначається аргумент, чий пріоритет вище або дорівнює пріоритету оператора.

Типові предикати Прологу.

Типові предикати - дозволяють визначити до якого типу належить об'єкт.

1) var (X) - Ця мета успішна, якщо X в поточний момент - не конкретизована змінна.

2) nonvar (X) - Ця мета успішна, якщо X - терм, відмінний від змінної, або якщо X - вже конкретизована змінна.

3) atom (X) - Ця мета істинна, якщо X позначає атом.

4) integer (X) - Мета істинна, якщо X позначає ціле.

5) atomic (X) - Мета істинна, якщо X позначає ціле або атом.

Схожі статті