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
   51   52   53   54   55   56   57   58   59   60   61