Неожиданное поведение замороженного /2
Я играл с предикатами пролога-сопрограммыfreeze/2
а также frozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
sicstus-prolog (версия 4.5.1 для x86_64) дал следующие ответы:
|?- заморозить (X, a = a), заморозить (X,Goal). Цель = пролог: заморозить (X, пользователь: (a = a)), пролог: заморозить (X, пользователь:(a=a))?; нет |?- заморозить (X, a = a), заморозить (Y,b=b), X=Y, заморозить (X,Goal). Y = X, Цель = (пользователь: (a = a), пролог: заморозить (X, пользователь: (b = b))), пролог: заморозить (X, пользователь: (a = a)), пролог: заморозить (X, пользователь:(b=b))?; нет
Сейчас Goal = prolog:freeze(X,user:(a=a))
Я не ожидал!
То, что я сделал ожидать, были ответы, как те, предоставленных SWI-Пролог версии 8.0.3:
?- заморозить (X, a = a), заморозить (X,Goal). Цель = пользователь: (a = a), заморозить (X, a = a).?- заморозить (X, a = a), заморозить (Y,b=b), X=Y, заморозить (X,Goal). X = Y, Цель = (пользователь: (a = a), пользователь: (b = b)), заморозить (Y, a=a), заморозить (Y, b=b).
Можно утверждать, что оба ответы SICStus и ответы SWI правильно...
Но есть ли более глубокая причина для несколько своеобразного ответа (ов), данного SICStus?
1 ответ
Я не знаю, есть ли какая-то "глубокая" причина такой разницы. посколькуfrozen/2
это общий интерфейс для приписываемых переменных, имеет смысл не рассматривать freeze/2
цели.
Фактически, до 4.5.1 SICStus пытался, но иногда безуспешно, в особых случаях. freeze/2
цели. Вот почему вы видитеuser:(a=a)
для первой подцели. В следующем выпуске мы изменили это так, чтобы вместо этого результат сталGoal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))
(и мы также внесли некоторые другие улучшения в frozen/2
).