Книга: ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ

not(X)

not(X)

Предполагается, что X конкретизирован термом, который может быть интерпретирован как целевое утверждение. Целевое утверждение not(X) считается согласованным с базой данных, если попытка доказать согласованность X заканчивается неудачей. Целевое утверждение not(X) считается несогласованным, если попытка доказать согласованность X успешно завершается. В этом плане предикат not очень похож на call, за тем исключением, что согласованность или несогласованность аргумента, рассматриваемого как целевое утверждение, приводит к противоположному результату.

Чем отличаются следующие два вопроса?

/* 1 */?- принадлежит(Х,[а,b,с]), write(X).

/* 2 */?- not(not(принадлежит(Х,[а,b,с]))), write(X).

Может показаться, что между ними нет никакой разницы, так как в запросе 2 принадлежит(Х,[а,b,с,]) согласуется, поэтому not(принадлежит(Х,[а,b,с,])) не согласуется и not(not(принадлежит(Х,[а,b,с]))) согласуется. Это правильно лишь отчасти. В результате первого вопроса будет напечатан атом 'а', а в результате второго – неконкретизированная переменная. Рассмотрим, что происходит при попытке доказать согласованность первого целевого утверждения из второго вопроса:

1. Целевое утверждение принадлежит согласуется, и X конкретизируется значением а.

2 Предпринимается попытка доказать согласованность первого целевого утверждения not, которая заканчивается неудачей, так как целевое утверждение принадлежит, являющееся его аргументом, согласуется с базой данных. Теперь вспомним, что, когда целевое утверждение не согласуется, все конкретизированные переменные, такие как X в нашем примере, должны теперь «забыть», что они обозначали до сих пор. Следовательно, X становится неконкретизированной.

3. Предпринимается попытка доказать второе целевое утверждение not, и эта попытка заканчивается успехом, так как его аргумент (not(принадлежит(…))) не согласован. Переменная X остается неконкретизированной.

4. Предпринимается попытка выполнить целевое утверждение write с неконкретизированным значением X. И, как описано в разд. 6.9, неконкретизированные переменные печатаются специальным образом.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.614. Запросов К БД/Cache: 2 / 0
поделиться
Вверх Вниз