использования not проведем на таком примере:
r( а).
g( b).
р( X) :- not r( X).
Если спросить теперь
?- g( X), р( Х).
система ответит
Х = b
Если же задать тот же вопрос, но в такой форме
?- р( X), g( X).
система ответит
nо (нет)
Читателю предлагается проследить работу программы по шагам, чтобы понять, почему получились разные ответы. Основная разница между вопросами состоит в том, что переменная Х к моменту вычисления р( X) в первом случае была уже конкретизирована, в то время как во втором случае этого еще не произошло.
Мы детально обсудили аспекты применения отсечения, которое неявно присутствует в not. При этом нами руководило желание предупредить пользователей о соблюдении необходимой осторожности, а вовсе не желание убедить их совсем не пользоваться этим оператором. Отсечение полезно, а часто и необходимо. А что касается трудностей Пролога, порождаемых отсечением, то подобные неудобства часто возникают и при программировании на других языках.
Резюме
Отсечение подавляет перебор. Его применяют как для повышения эффективности программ, так и для повышения выразительности языка.
Эффективность повышается путем прямого указания (при помощи отсечения) пролог - системе не проверять альтернативы, про которые нам заранее известно, что они должны потерпеть неудачу.
Отсечение дает возможность сформулировать взаимно исключающие утверждения при помощи правил вида:
Отсечение дает возможность ввести
Иногда бывают полезными две особые цели true и fail. true - всегда успешна и fail - всегда терпит неудачу.
Существуют ограничения в применении отсечения: его появление может нарушить, соответствие между декларативным и процедурным смыслами программы. Поэтому хороший стиль программирования предполагает осторожное применение отсечений и отказ от их применения без достаточных оснований.
Оператор not, определенный через неуспех, не полностью соответствует отрицанию в математической логике. Поэтому not тоже нужно применять с осторожностью.
Литература
Различать 'зеленые и 'красные' отсечения предложил ван Эмден (1982).
van Emden M. (1982). Red and green cuts.
Назад | Содержание | Вперёд
Назад | Содержание | Вперёд
Глава 6
ВВОД И ВЫВОД