Неожиданное поведение замороженного /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).

Другие вопросы по тегам