Page 56 - 4800
P. 56
дійсним числом, що визначає, де даний факт зберігається щодо початку файлу бази
даних.
Кожний з трьох предикатів, що призначений для створення інтерфейсу бази
даних, викликає свій модуль, який виконує задані дії щодо вводу, додавання або
видалення фактів. Модуль є набором процедур і правил, які включають звернення як до
стандартних предикатів по роботі з файлами, так і до визначених усередині програми
предикатів. Всі визначенні для кожного з модулів предикати описуються в секції
predicates.
У модулі вводу процедура dbass() приєднує терм до файлу даних і модифікує
індексний файл, використовуючи звернення до предикатів new_rec() і new_ind(). Перше
правило процедури dbass() призначено для запису даних у вже існуючий файл, тобто
для додавання даних. Друге правило використовується для новостворюваного файлу
БД.
Слід звернути увагу на використання в правилі new_ind() предиката
writef("%7.0\n", Pos). Цей предикат призначений для запису значення індексу, що
задається змінній Pos. Для запису індексу відводиться поле, що складається з семи
позицій. Значення, привласнене змінній Рос, визначає положення запису у файлі БД.
У модулі виводу предикат dbrd() повертає терм з бази даних, забезпечуючи його
пошук і читання з файлу, а також закриває файли після того, як відбулося зчитування з
бази даних. У даному використовується допоміжна процедура dbaccess(), яка і служить
безпосередньо для пошуку і вибірки потрібних даних з файлу. Перше правило
процедури використовується для читання даних, логічно пов'язаних із значенням
індексу, що задається змінною Pos. Відповідне значення індексу шукається в
індексному файлі другим правилом цієї процедури. Це правило намагається знайти в
базі такий запис, індекс якого наявний в індексному файлі. Якщо індекс знаходиться, то
правило закінчується успіхом, якщо не знаходиться – то правило закінчується
невдачею. У разі успіху змінна Term набуває потрібні користувачу значення.
У модулі видалення предикат dbdel() проводить операцію видалення після
відкриття файлу БД та індексного файлу, забезпечуючи виключення терма з бази. Терм
віддаляється за допомогою запису негативного числа в індексний файл. Цей модуль
використовує допоміжну процедуру dbdel1(), яка здійснює пошук потрібного запису і її
видалення.
Особливу увагу слід звернути на предикат flush(). Цей предикат викликає запис
на диск вмісту внутрішнього буфера індексного файлу. Таким чином, dbdel1() запобігає
можливості роботи з даними, які вже були видалені до цього. Дана процедура за своєю
структурою близька до процедури dbaccess(). У ній друге правило також призначене
для пошуку потрібного індексу в індексному файлі.
6.6. Особливості представлення динамічних баз даних у Visual Prolog
Для опису внутрішньої бази даних у Visual Prolog використовується ключове
слово facts, яке визначає початок оголошення розділу facts. Розділ facts складається з
послідовності оголошень предикатів, що описують відповідну внутрішню базу фактів.
Під час виконання можна за допомогою предикатів стандартних asserta і assertz
додавати факти (але не правила) в базу фактів. Або, викликавши стандартний предикат
consult, ви можете витягнути факти, що додаються, з файлу на диску.
Слід зазначити такі два обмеження на предикати, оголошені в розділі фактів:
– дозволяється додавати в базу даних тільки факти, але не правила;
– факти бази не можуть містити вільні змінні.
Допускається наявність декількох розділів facts, але для цього потрібно явно
вказати ім'я кожного розділу facts.
facts — mydatabase
myFirstRelation(integer) mySecondRelation(real, string) myThirdRelation(string)
Опис розділу facts з ім'ям mydatabase створює базу даних фактів з ім'ям
mydatabase. Якщо не задати ім’я динамічної базі фактів, то за замовчуванням їй
привласнюється стандартне ім'я dbasedom. Програма може містити локальні безіменні
розділи фактів, тільки якщо вона складається з одного модуля, який не оголошений як
частина проекту. Візуальне середовище розробки (VDE) компілює програмний файл як
єдиний модуль тільки при використанні утиліти Test Goal. Інакше, безіменний розділ
56