Я играл с предикатами -прологами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, цель). Цель = пролог: заморозить (X, пользователь: (a = a)) , пролог: заморозить (X, пользователь: (a = a))? ; нет | ? - заморозить (X, a = a), заморозить (Y, b = b), X = Y, заморозить (X, цель). Y = X, Цель = (пользователь: (a = a), пролог: заморозить (X, пользователь: (b = b))) , Пролог: замораживание (Х, пользователь: (а = а)), пролог: заморозить (X, пользователь: (b = b))? ; нет
Теперь я не ожидал!Goal = prolog:freeze(X,user:(a=a))
То , что я сделал ожидать , были ответы , как те , предоставленных SWI-Пролог версии 8.0.3:
? - заморозить (X, a = a), заморозить (X, цель). Цель = пользователь: (a = a) , заморозить (X, a = a). ? - заморозить (X, a = a), заморозить (Y, b = b), X = Y, заморозить (X, цель). X = Y, Цель = (пользователь: (a = a), пользователь: (b = b)) , заморозить (Y, a = a), заморозить (Y, b = b).
Можно утверждать, что оба ответы SICStus и ответы SWI правильно ...
Но есть ли более глубокая причина для довольно своеобразного ответа (ответов) от SICStus?
prolog
sicstus-prolog
prolog-coroutining
повторение
источник
источник
Ответы:
Я не знаю, есть ли какая-то "глубокая" причина для различия. Так
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
).источник