Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методические указания по ИИС.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
3.88 Mб
Скачать

Описания Факты, объявленные с ключевым словом nondeterm

Ключевое слово nondeterm - тип по умолчанию для фактов (предикатов базы данных), объявленных в секциях фактов. Если ни одно из ключевых слов determ или single не используется при описании факта, компилятор применяет ключевое слово nondeterm. Обычно, предикаты базы данных недетерминированы. Поскольку факты можно добавлять в любое время выполнения программы, компилятор должен всегда предполагать, что возможно найти альтернативные решения в течение бэктрэкинга.

Если вы имеете предикат базы данных, для которого вы никогда не будете иметь больше, чем один факт, вы можете описать его, как determ или single.

Факты, объявленные с ключевым словом determ

Ключевое слово determ определяет, что база данных фактов может содержать только один факт данного типа. Так, если вы попробуете добавить один, а затем второй, такой факт в базу данных, Visual Prolog выдаст ошибку (1041 Assert to a fact declared as determ, but fact already exists). В таких случаях, программист должен проявлять особую осторожность.

Предыдущий факт с determ позволяет компилятору произвести лучший код, и вы не будете получать предупреждения о недетерминированности при вызове определенных предикатов. Это полезно при использовании флагов, счётчиков и других объектов, которые являются сильно глобализированными переменными.

Особенно обратите внимание, что при удалении факта, который объявляется как determ, запрос к недетерминированным предикатам retract/1 и retract/2, будет детерминирован. Так, если вы знаете, что в любой момент секция фактов содержит не более одного экземпляра факта counter() тогда, вы можете написать:

FACTS

determ counter(integer CounterValue)

GOAL

...

retract(counter(CurrentCount)),

/* here Prolog will not set backtracking point */

Count= CurrentCount + 1,

assert(counter(Count)),

...

Вместо

FACTS

counter(integer CounterValue)

PREDICATES

determ my_retract(dbasedom)

CLAUSES

my_retract(X): - retract(X), !. % deterministic predicate

GOAL

...

my_retract(counter(CurrentCount)),

/* here Prolog will not set backtracking point */

Count= CurrentCount + 1,

asserta(counter(Count)),

...

Факты, объявленные с ключевым словом single

Ключевое слово single перед фактом fact_N объявляет, что один и только один случай факта должен всегда существовать.

Факты single должны существовать уже, когда программа вызывает соответствующую цель; поэтому, факты single должны инициализироваться в разделе предложений в исходном коде программы. Например:

FACTS

single singleFact(string, string)

CLAUSES

singleFact("", "").

Single-факты нельзя удалять. Если будет попытка применить retract к single-факту, то компилятор выдаст ошибку 249 "Attempt to retract a fact declared as single".·С момента, когда один случай single-факта существует, обращение к этому факту никогда не будет неудачным, если его вызывают со свободными аргументами. Например, следующий запрос:

singleFact(X,Y).

никогда не терпит неудачу, если X и Y - свободные переменные. Поэтому, удобно использовать single-факты в процедурах. Предикаты assert, asserta, assertz и consult применяются к single-фактам подобно предикатам retract и assert. То есть предикаты assert (consult) заменяют существующий случай факта на указанный.

Предыдущий single-факт позволяет компилятору произвести оптимизированный код для того, чтобы обеспечить оптимальное обращение к факту и обновление факта. Например, для предиката assert, примененного к single-факту, компилятор производит код, который работает более эффективно, чем, например, предикаты retract и assert, примененные к determ-факту (и тем более эффективнее, чем предикаты retract и assert, примененные к nondeterm-факту).