Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / ЛЕКЦИИ / POSIBNIK / ПРОГР НА ПРОЛОГЕ.doc
Скачиваний:
42
Добавлен:
23.03.2015
Размер:
669.7 Кб
Скачать

5.12. Предикат fail-if (not)

Для виразу інверсних умов у ПРОЛОЗі передбачений убудований предикат fail_if (або not). З урахуванням недоліків відсікання застосування цього предиката може виявитися більш доцільним.

Визначення предиката fail-if(not). Аргументом виклику повинна бути структура. Ця структура викликається як ціль. Предикат дає відмову, якщо ця ціль успішно узгоджується, і успішно узгоджуєься, якщо ця ціль дає відмову. При відкотах цей предикат може бути узгоджений повторно.

Приклад. Об'єднання двох множин.

Варіант 1. Без застосування відсікання – інверсна сторожова ціль виражена явно за допомогою предиката not.

об'єднання([ ], S, S).

об'єднання([H | T], S1, S2):-

належить(H, S1),

об'єднання(T, S1, S2).

об'єднання([H | T], S1, [H | S2]):-

not(належить(H, S1)), % сторожува ціль

об'єднання(T, S1, S2).

Варіант 2. З використанням відсікання – інверсна сторожова ціль виражена неявно за допомогою предиката “!”.

об'єднання([ ], S, S).

об'єднання([H|T], S1, S2):-

належить(H, S1), !,

об'єднання(T, S1, S2).

об'єднання([H|T], S1, [H|S2]):-

%not(належить(H, S1)), - тепер ця сторожова ціль є зайвою

об'єднання(T, S1, S2).

У кожній версії три твердження виражають три взаємно виключні стани:

1) перший список порожній;

2) голова першого списку міститься в другому;

3) голова першого списку не міститься в другому.

У першому розв’язку твердження можуть бути розташовані в довільному порядку. Але другий розв’язок є більш ефективним, завдяки тому, що не має повторної перевірки на належність множині.

5.13. Предикат true

Іноді має сенс застосовування нульарного предиката true, при якому ціль завжди узгоджується і не робить ніякої дії. При поверненні ніколи не узгоджується повторно.

5.14. Модифікація бази даних (мбд)

Убудовані предикати, asserta, assert і assertz дозволяють програмісту додавати нові й переводити існуючі твердження в базу даних ПРОЛОГу.

Визначення предикатів asserta, assert і assertz (аргументом цілі повинна бути структура). Ціль завжди узгоджується і при відкотах не може бути узгоджена повторно. Побічним ефектом узгодження цілі є додавання цієї структури в базу даних ПРОЛОГу. Структура трактується як твердження процедури й міститься перед (предикати assert, asserta) чи після (assertz) уже наявних тверджень цієї процедури.

Визначення предиката retract (аргументом цілі повинна бути структура). У базі даних шукається перше таке твердження, що узгоджується з цією структурою. Якщо таке узгодження проведене, ціль уважається успішною. Побічний ефект узгодження цілі полягає в усуненні твердження з бази даних. У противному разі ціль дає відмову. При відкотах ціль здатна узгоджуватися повторно з видаленням наступних знайдених тверджень.

Оскільки ці предикати додають нове твердження в базу даних за допомогою побічного ефекту, твердження буде збережене (чи вилучене), навіть якщо ПРОЛОГ зробить відкіт через зазначені цілі.

Визначення предиката retractall (аргументом цілі повинна бути структура). Ціль завжди узгоджується. Побічний ефект узгодження цілі полягає у видаленні усіх тверджень, заголовки яких зіставляються з цією структурою. При поверненнях ціль не може узгоджуватися повторно.

Предикат retractall можна задати за допомогою такого визначення:

retractall(Заголовок) :-

retract(Заголовок), /* видаляються усі факти */

fail.

retractall(Заголовок) :-

retract((Заголовок :- Тіло)), /* видаляються всі правила */

fail.

Синтаксис ПРОЛОГу вимагає виводу в дужки структури, поданої у формі Терм1 :- Терм2, якщо ця структура виступає в ролі компонента іншої структури.

ПРИМІТКА. У реалізації TP аргументами предикатів asserta, assert, assertz і retract можуть виступати тільки факти (тобто можуть додаватися і вилучатися тільки факти). Отже, у середовищі TP предикат retractall у такому вигляді не може бути реалізованим.

У наступних розділах будуть продемонстровані області застосування запропонованих предикатів. Модифікація бази даних може знадобитися в таких випадках:

  1. керування базою даних;

  2. запобігання втраті результатів виконання процедури при відкотах;

  3. забезпечення взаємодії окремих частин програми через глобальні змінні.