Створення динамічних баз даних

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

Розділ програми facts в Visual Prolog призначений для опису предикатів динамічної (внутрішньої) бази даних. База даних називається динамічної, так як під час роботи програми з неї можна видаляти будь-які факти, а також додавати нові факти. У цьому полягає її відмінність від статичних баз даних. де факти є частиною коду програми і не можуть бути змінені під час виконання.

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

Слід зазначити два обмеження, оголошені в розділі facts:

· В динамічної бази даних Прологу можуть міститися тільки факти;

· Факти бази даних не можуть містити вільні змінні.

Допускається наявність кількох розділів facts. тоді в описі кожного розділу facts потрібно явно вказати його ім'я, наприклад facts - mydatabase. У двох різних розділах facts не можна використовувати однакові імена предикатів. Також не можна використовувати однакові імена предикатів в розділах facts і predicates. Якщо ім'я бази даних не вказується, то їй присвоюється стандартне ім'я dbasedom. Програма може містити локальні безіменні розділи фактів, якщо вона складається з єдиного модуля, який не оголошений як частина проекту. Середовище розробки компілює програмний файл як єдиний модуль тільки при використанні утиліти TestGoal. Інакше безіменний розділ фактів повинен бути оголошений глобальною, тобто як global facts.

У передмові є спеціальні вбудовані предикати для роботи з динамічною базою даних:

* Предикати assert, asserta, assertz, - дозволяють занести факт в БД, а предикати retract, retractall - видалити з неї вже наявний факт.

Предикат assert заносить новий факт в БД в довільне місце, предикат asserta додає новий факт перед усіма вже внесеними фактами даного предиката, assertz додає новий факт після всіх фактів даного предиката.

Предикат retract видаляє з БД перший факт, який зіставляється з заданим фактом, предикат retractall видаляє з БД всі факти, які зіставляються з заданим фактом.

Предикат save записує всі факти динамічної БД в текстовий файл на диск, причому в кожен рядок файлу заноситься один факт. Якщо файл з заданим ім'ям вже існує, то старий файл буде затертий.

Предикат consult записує в динамічну БД факти, лічені з текстового файлу, при цьому факти з файлу дописують в наявну БД. Факти, що містяться в текстовому файлі повинні бути описані в розділі domains.

Приклад 55: Написати програму, яка генерує безліч 4-розрядних двійкових чисел і записуючих їх в динамічну БД.

dbin (byte, byte, byte, byte)

bin (byte, byte, byte, byte)

bin (A, B, C, D): - cifra (A), cifra (B), cifra (C), cifra (D),

assert (bin (A, B, C, D)).