Page 58 - 4800
P. 58

ефективніший код, і при виклику таких предикатів не буде генеруватися повідомлення
            про  можливий  недетермінований  виклик.  Це  корисно  для  прапорців,  лічильників  і
            інших подібних об’єктів.
                    Особливу увагу слід звернути на те, що при видаленні факту, який оголошений
            determ,  виклик  недетермінованих  предикатів  retract/1  і  retract/2  (де  1,  2  означає
            кількість аргументів в предикаті) буде детермінованим. Тому, якщо відомо, що у будь-
            який момент часу база фактів містить не більше одного факту counter, можна написати:
            facts
                    determ counter(integer CounterValue)
            goal
                    retract(counter(CurrentCount)), % Пролог не встановить точку відкату Count=
            CurrentCount + 1, assert(counter(Count))
                    замість
            facts
                    counter(integer CounterValue)
            predicates
                    determ retract_d(dbasedom)
            clauses
                    retract_d(X): — retract(X)!. % детермінований предикат
            goal
                   retract_d(counter(CurrentCount)), % Пролог не встановить точку відкату Count=
            CurrentCount + 1, asserta(counter(Count))
                    Ключове слово single визначає, що база фактів завжди містить один і лише один
            факт для  предиката бази фактів, оголошеного з ключовим словом  single. Тому  single
            (одноразові) факти повинні бути вже відомі, коли програма викликає мету; отже, вони
            повинні ініціалізуватися в розділах clauses в початковому коді програми. Наприклад:
            facts – properties
                    single numberWindows_s(integer)
            clauses
                    nuraberWindows_s(0).
                    Одноразові  факти  не  можуть  бути  видалені.  Якщо  спробувати  видалити
            одноразовий  факт,  компілятор  згенерує  помилку.  У  більшості  випадків  компілятор
            може  визначити  спробу  видалення  одноразового  факту  на  етапі  компіляції.  Оскільки
            один екземпляр одноразового факту завжди існує, виклик одноразового факту ніколи
            не завершується неуспіхом, якщо він викликаний з вільними аргументами.
                    Наприклад, наступний виклик:
                    numberWindows_s(Num)
            ніколи  не  завершується  неуспіхом,  якщо  Num  –  вільна  змінна.  Таким  чином,  зручно
            використовувати  одноразові  факти  в  предикатах,  оголошених  з  типом  детермінізму
            procedure.
                    Предикати  assert,  asserta,  assertz  і  consult,  застосовані  до  факту  single,  діють
            аналогічно парі предикатів retract і assert. А саме предикати assert (consult) змінюють
            існуючий екземпляр факту на вказаний новий.
                    Використання  ключового  слова  single  перед  декларацією  факту  дозволяє
            компілятору  отримати  оптимізований  код  для  доступу  до  одноразового  факту  і  його
            модифікації.  Наприклад,  для  предикатів  assert,  застосованих  до  одноразового  факту,
            компілятор генерує код, який працює ефективніше, ніж пара предикатів retract і assert,
            застосованих  до  детермінованого  факту  (і  тим  більше,  чим  пара  предикатів  retract  і
            assert, при використанні із звичайним (не детермінованим) фактом).

                   6.7 Зміст звіту з лабораторної роботи

                   1. Вказати номер, тему й мету лабораторної роботи.
                   2.  Перетворити  розроблену  в  лабораторній  роботі  № 5  статичну  базу  даних  в
            динамічну.
                   3. Розглянути різні способи організації збереження даних у файли.
                   4. Результати досліджень навести в звіті.








                                                         58
   53   54   55   56   57   58   59   60   61   62   63