Книга: ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ ПРОЛОГ
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, неконкретизированные переменные печатаются специальным образом.
- NOTRACK target
- Battle for Wesnoth
- What This Book Is Not
- GPL Copyright Notice
- 2.1. Embedded or Not?
- Your Modem Does Not Dial
- 5.3. Презентация Keynote
- Notifying secondaries of changes
- Enabling print job error notification
- 14.4 Schedulability Analysis-Rate Monotonic Analysis
- 15.6.2 Asynchronous Event Notification Using Signals
- Notssid.inf