Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
AlgStr / Библиотека / POSIBNIK / СТРУКТУРИ ТА ОРГАНИЗАЦИЯ ДАНИХ В ЕОМ.doc
Скачиваний:
37
Добавлен:
23.03.2015
Размер:
1.1 Mб
Скачать

5.15. Керування базою даних (кбд)

Метод оснований на використанні бази даних ПРОЛОГу для запису ходу розвитку обчислювального процесу й складається з таких елементів:

  1. предикати assert, asserta, assertz використовуються для внесення резуль-

татів у базу даних ПРОЛОГу. При керуванні базою даних порядок включення записів у базу даних може бути істотним. Для останніх двох випадків це може бути неважливо.

  1. предикати retract і retractall використовуються для видалення записів із

бази даних. Інші випадки не допускають довільної і безладної зміни бази даних ПРОЛОГу. Це досягається чітким поділом програми на два етапи:

  • внесення даних і наступний за ним етап;

  • збір результатів і вилучення внесених тверджень.

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

5.16. Глобальні змінні (гз)

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

Наприклад, якщо ми повертаємо результат через аргумент, то ціла серія викликуваних модулів (у тому числі й рекурсивних) повинна “нести” цей допоміжний аргумент. Замість цього ми можемо допустити, що процедура заносить результат у базу даних ПРОЛОГу за допомогою побічного ефекту. У такому випадку ми можемо трактувати базу даних ПРОЛОГу як глобальну змінну. Це дуже зручно: будь-яка процедура може записувати в неї свій результат, що буде доступний будь-якій іншій процедурі, яка б не була дистанція між ними при їх послідовних динамічних викликах.

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

Цей підхід можна реалізувати в такий спосіб:

анулююче_включення(Твердження) :-

assert(Твердження).

анулююче_включення(Твердження) :-

retract(Твердження),

!,

fail.

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

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

Розглянемо приклад використання глобальної змінної в програмі на ПРОЛОЗі.