Page 50 - 4800
P. 50

Або сформувати на їх основі будь-які інші, прості або складові, запити.
                   Якщо потрібно буде видалити з динамічної БД який-небудь факт, то для цього
            слід  скористатися  предикатом  retract().  Наприклад,  для  видалення  відомостей  про
            „Світлану” слід ввести наступну ціль:
                   Goal: retract(реrson(„Світлана”, _, _))
                   При  необхідності  скоректувати  який-небудь  елемент  динамічної  БД  його  слід
            видалити з бази даних, а потім додати в динамічну БД новий модифікований елемент.
            Зокрема, для того, щоб змінити вік „Миколи” на один рік, треба ввести таку складну
            ціль:
                   Goal: реrson(„Микола”, OldAge, Sex, Person), retract(реrson(„Микола, _ ,_)),
            NewAge = OldAge + 1, !, asserta(реrson(„Микола”, NewAge, Sex, Person)),
            яка  видалить  старий  факт  і  додасть  в  динамічну  БД  модифікований  факт.  Результат
            проведених перетворень БД можна одержати, як відповідь на наступний запит:
                   Goal: реrson(Name,Age,Sex)
                   Name = „Микола”  Age=21                Sex=m
                   Name = „Ольга”       Age=8             Sex=f
                   Name = „Степан”  Age=10                Sеx=m
                   Динамічна БД може бути збережена в текстовому файлі за допомогою виклику
            предиката  save()  з  ім'ям  текстового  файлу,  в  якості  параметру.  Наприклад,  після
            виконання цілі:
                   Goal: save(„person.dba”)
            файл „person.dba” буде схожий на звичайну програму на Пролозі з фактами у кожному
            рядку.  Такий  файл  може  бути  пізніше  знову  завантажений  в  пам'ять,  за  допомогою
            предикату consult():
                   Goal: consult(„person.dba”).
                   Завантаження виконається успішно лише в тому випадку, якщо програма у файлі
            не містить помилок. За наявності помилок зчитування даних із файлу до динамічної БД
            не відбудеться.
                   Раніше вже не раз наголошувалося, що будь-яка програма на Пролозі – це набір
            фактів  і  правил,  які  є  своєрідною  базою  даних,  на  якій  Пролог  виконує  логічний
            висновок.  У  свою  чергу,  динамічні  бази  даних  –  це  набір  фактів,  який  може
            змінюватися при роботі програми.
                   З  цих  двох  умов  випливає  найважливіший  висновок:  Пролог  допускає  зміну
            програм під час їх виконання! І ці зміни можна виконувати, використовуючи динамічні
            бази даних.

                    6.3 Зв’язок статичних і динамічних баз даних

                   Для того щоб почати працювати з динамічною БД, потрібен або доступний для
            завантаження  динамічної  БД  файл  на  диску,  або  початкове  завантаження  динамічної
            бази  вручну.  Викликано  це  тим,  що  Пролог  формує  динамічну  базу  в  оперативній
            пам’яті.  Виключення  комп’ютера  або  просто  вихід  з  програми  можуть  привести  до
            втрати  даних.  У  цих  умовах  найцінніші  дані  можна  представити  фактами  статичної
            бази даних безпосередньо в тілі програми.
                   При застосуванні такого підходу, для можливості зміни даних у процесі роботи
            програми  або  додавання  нових  фактів,  слід  перезаписати  дані  із  статичної  до
            динамічної БД.
                   У програмі 6_2 використовуються дві бази даних однакової структури
                   Адреса(Організація, Вулиця, Будинок, Группа_Організацій)
                   Одна з них є динамічною і описана предикатом address() у секції database, друга
            – статичною і описана предикатом adres() у секції predicates.
                   /* Програма 6_2 */
            domains
                   firm, street, group = symbol
                   house = integer
            database
                   address(firm, street, house, grup)
            predicates
                   adres(firm, street, house, group )





                                                         50
   45   46   47   48   49   50   51   52   53   54   55