Динамічна база даних

Динамічна база даних - розділ програми, в якому факти можуть додаватися або завантажуватися з файлу на диску під час виконання програми або віддалятися з неї. Факти, що описують предикат бази даних, можуть також оброблятися як звичайні предикати Прологу.

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

22. Приклад роботи з динамічної базою даних.

Database - db1% База даних з ім'ям db1

Database - db2% База даних з ім'ям db2

Goal rettactall (fact1 (X, Y, [_, 2 | Z]))% видалити факти за зразком

Goal retractall (db2)% видалити пойменовану базу даних

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

Основою бази даних такої програми є дерево рішень деякої предметної області. У нашому випадку таким деревом буде система класифікації тварин. Всі тварини діляться на ссавців, птахів і риб. Серед ссавців можуть бути хижаки і копитні. До хижакам, зокрема, відносяться тигр і гепард.

Наведемо тут приклад версії програми зі зворотним ланцюжком міркувань, тому що вона ближче до вбудованого в Пролог механізму виведення. Програму з прямою ланцюжком міркувань можна подивитися в [1].

Структура версії зі зворотним ланцюжком міркувань проектується введенням групи правил високого рівня. Кожне таке правило описує одну тварину, наприклад:

positive ( "має", "чорні плями").

positive ( "має", "рудий колір"),

positive ( "має", "чорні смуги").

positive ( "має", "чорно-білий колір").

Подібні правила повинні бути для всіх тварин, яких належить класифікувати програмі.

Всі правила підтримуються на наступному, більш низькому рівні деякими супідрядними предикатами:

positive ( "має", "очі, спрямовані вперед").

Свою роботу програма починає з використання правила

write ( "Задумане вами тварина", X).

Далі система намагається по черзі встановити істинність або хибність правил високого рівня, тобто знайти кандидата, якого вона зможе перевірити на відповідність предикату animal_is.

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

Тут задіяний механізм питань-відповідей, тому нам необхідно детально розглянути ці правила. Нижче слід відповідна частина програми.

positive (X, Y): -% Позитивна відповідь виявлений

xpositive (X, Y). % В базі даних

positive (X, Y): - xnegative (X, Y). fail. % Негативна відповідь виявлений

positive (X, Y): -% Задається питання, для якого

not (xnegative (X, Y)),% очікується позитивна відповідь

write (X, "воно", Y, '\ n'),

ans_pos (X, Y, Reply).

ans_pos (X, Y, 'n'): - assertz (xnegative (X, Y)). fail.

Коли механізм виведення доходить до місця, де потрібно дізнатися, чи був встановлений певний атрибут тваринного, він використовує правила positive і negative. (Тут у нас наведено предикат positive, відповідний позитивному значенню атрибута. Подібний по роботі з ним предикат negative записується симетрично.)

Все, що програма поміщає в базу даних, завжди має вигляд пари, що складається з дієслова та властивості, наприклад:

Тому легко створити граматично правильна пропозиція для пред'явлення його користувачеві, поставивши слово "воно" між дієсловом і властивістю. Користувач, ймовірно, введе символи "y" або "n" у відповідь на запит, а запам'ятовує правило занесе інформацію в базу даних за допомогою одного з двох предикатів:

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