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