Динамічна база даних
Динамічна база даних - розділ програми, в якому факти можуть додаватися або завантажуватися з файлу на диску під час виконання програми або віддалятися з неї. Факти, що описують предикат бази даних, можуть також оброблятися як звичайні предикати Прологу.
З іншого боку, можна трактувати базу даних Прологу як якусь глобальну змінну. Таке трактування дуже зручна: будь-яка процедура може записувати в неї свій результат, який буде доступний будь-який інший процедурі, яка б дистанція між ними не була при їх послідовних динамічних виклики.
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" у відповідь на запит, а запам'ятовує правило занесе інформацію в базу даних за допомогою одного з двох предикатів:
Тому якщо ви хочете перезапустити програму, то спочатку треба очистити базу даних від відповідей на питання, задані при веденні останнього діалогу. Вони продовжують перебувати в базі даних і будуть впливати на наступні результати, якщо їх не видалити.