Что насчет setarg / 3 "экстралогично"? - PullRequest
0 голосов
/ 04 июля 2018

Документы SWI-prolog настоятельно рекомендуются против с использованием setarg/3:

Этот предикат может использоваться для деструктивного назначения терминов, используя их в качестве дополнительного логического хранилища. Всегда старайтесь избегать использования setarg / 3, так как он не поддерживается многими системами Prolog, и нужно быть очень осторожным при неожиданном копировании, а также при неожиданном не копировании терминов.

Я не уверен, что понимаю, что "экстралогического" в setarg/3? Я понимаю, что такие вещи, как срезы и находки, являются нелогичными, потому что они основаны на неявном знании порядка поиска, который использует Пролог, что плохого в изменении аргумента термина?

1 Ответ

0 голосов
/ 04 июля 2018

Легко видеть, что использование 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 называется нечистым предикатом: монотонные рассуждения первого порядка не могут быть применены к нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...