Page 50 - 4800
P. 50
Або сформувати на їх основі будь-які інші, прості або складові, запити.
Якщо потрібно буде видалити з динамічної БД який-небудь факт, то для цього
слід скористатися предикатом retract(). Наприклад, для видалення відомостей про
„Світлану” слід ввести наступну ціль:
Goal: retract(реrson(„Світлана”, _, _))
При необхідності скоректувати який-небудь елемент динамічної БД його слід
видалити з бази даних, а потім додати в динамічну БД новий модифікований елемент.
Зокрема, для того, щоб змінити вік „Миколи” на один рік, треба ввести таку складну
ціль:
Goal: реrson(„Микола”, OldAge, Sex, Person), retract(реrson(„Микола, _ ,_)),
NewAge = OldAge + 1, !, asserta(реrson(„Микола”, NewAge, Sex, Person)),
яка видалить старий факт і додасть в динамічну БД модифікований факт. Результат
проведених перетворень БД можна одержати, як відповідь на наступний запит:
Goal: реrson(Name,Age,Sex)
Name = „Микола” Age=21 Sex=m
Name = „Ольга” Age=8 Sex=f
Name = „Степан” Age=10 Sеx=m
Динамічна БД може бути збережена в текстовому файлі за допомогою виклику
предиката save() з ім'ям текстового файлу, в якості параметру. Наприклад, після
виконання цілі:
Goal: save(„person.dba”)
файл „person.dba” буде схожий на звичайну програму на Пролозі з фактами у кожному
рядку. Такий файл може бути пізніше знову завантажений в пам'ять, за допомогою
предикату consult():
Goal: consult(„person.dba”).
Завантаження виконається успішно лише в тому випадку, якщо програма у файлі
не містить помилок. За наявності помилок зчитування даних із файлу до динамічної БД
не відбудеться.
Раніше вже не раз наголошувалося, що будь-яка програма на Пролозі – це набір
фактів і правил, які є своєрідною базою даних, на якій Пролог виконує логічний
висновок. У свою чергу, динамічні бази даних – це набір фактів, який може
змінюватися при роботі програми.
З цих двох умов випливає найважливіший висновок: Пролог допускає зміну
програм під час їх виконання! І ці зміни можна виконувати, використовуючи динамічні
бази даних.
6.3 Зв’язок статичних і динамічних баз даних
Для того щоб почати працювати з динамічною БД, потрібен або доступний для
завантаження динамічної БД файл на диску, або початкове завантаження динамічної
бази вручну. Викликано це тим, що Пролог формує динамічну базу в оперативній
пам’яті. Виключення комп’ютера або просто вихід з програми можуть привести до
втрати даних. У цих умовах найцінніші дані можна представити фактами статичної
бази даних безпосередньо в тілі програми.
При застосуванні такого підходу, для можливості зміни даних у процесі роботи
програми або додавання нових фактів, слід перезаписати дані із статичної до
динамічної БД.
У програмі 6_2 використовуються дві бази даних однакової структури
Адреса(Організація, Вулиця, Будинок, Группа_Організацій)
Одна з них є динамічною і описана предикатом address() у секції database, друга
– статичною і описана предикатом adres() у секції predicates.
/* Програма 6_2 */
domains
firm, street, group = symbol
house = integer
database
address(firm, street, house, grup)
predicates
adres(firm, street, house, group )
50