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
     	
