Переменные атрибутов позволяют расширить унификацию. Далее мы поговорим о загадочных деталях интерфейса. Давайте перейдем к делу!
В библиотеке sicstus-prolog (atts ) предоставляет предикаты для использования переменных с атрибутами. Думаю, я понял то, что SICStus Prolog User's Manual на странице библиотеки (atts) говорится, за исключением одной детали о verify_attributes(-Var, +Value, -Goals)
:
[...] verify_attributes / 3 вызывается до того, как Var будет фактически привязан к Value. В случае неудачи объединение считается неудачным. Успех может быть неопределенным, и в этом случае объединение может вернуться назад, чтобы дать другой ответ. Ожидается, что в Goals он вернет список целей, которые будут вызываться после того, как Var будет привязан к Value. Наконец, после вызова Goals вызываются все голы, заблокированные на Var.
Вышеупомянутое предложение (выделенное мной) смутило меня и многое тоже :)
Я всегда думал, что объединение - это процедура, которая может либо:
добиться успеха с самым общим объединителем (переименование переменной по модулю)
или потерпеть неудачу.
Но добиться успеха неопределенно ?!
Когда эта "функция" когда-либо была использована разработчиками решателей ограничений?
Я не могу придумать ни одного варианта использования ... помогите, пожалуйста!
РЕДАКТИРОВАТЬ
На самом деле, я считаю неопределенность в (моем) коде решателя ошибкой, а не особенностью. Ибо любую неопределенность можно легко смоделировать, вернув некоторую дизъюнкцию в Goals
.
freeze(X, ( Y = 1 ; Y = 2 ) )
- person false   schedule 25.06.2019Goals
аргумент в пользу незамороженных голов ... - person repeat   schedule 25.06.2019Y
может быть унифицирован при размораживанииX
. Но это легко сделать с помощьюGoals = [(Y = 1 ; Y = 2)]
. - person repeat   schedule 25.06.2019clpq
,clpr
илиclpb
он понадобится, а я не получаю его в своихclpfd
очках :) - person repeat   schedule 25.06.2019