Легко видеть, что использование setarg/3
нарушает самые основные декларативные свойства, которые мы ожидаем от предикатов.
Например, рассмотрим запрос:
?- T = f(a), T = f(b).
<b>false.</b>
Заявительно, мы ожидаем, что добавление ограничения (т. Е. цель ) может максимально уменьшить , конечно, никогда не расширять набор решений. Правильно?
правый ??
Хорошо, рассмотрим:
?- T = f(a), <b>setarg(1, T, b)</b>, T = f(b).
<b>T = f(b).</b>
Итак, добавление ограничения привело к обобщению запроса : раньше он не выполнялся и теперь успешно ( безусловно ).
В повседневных задачах это аналогично ситуации, такой как:
A: Я бы хотел заказать десерт, пожалуйста.
Б: Извините, у нас нет десертов.
A: Хорошо, тогда я бы хотел заказать десерт и кофе, пожалуйста.
B: Вот вы: десерт и кофе.
Конечно, большинство людей находили бы такой разговор, если бы он происходил в реальном ресторане, весьма необычным.
Следовательно, setarg/3
называется нечистым предикатом: монотонные рассуждения первого порядка не могут быть применены к нему.