Неожиданное поведение замороженных / 2


11

Я играл с предикатами freeze/2 и frozen/2:

?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).

(версия 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))

То , что я сделал ожидать , были ответы , как те , предоставленных версии 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?


1
AFAIK в Sicstus функциональность для маскировки "последний сбой" не реализована "? ; нет`
Антон Данилов

Во-первых, явная квалификация предпочтительнее.
неверно

1
До 3.8.5 этой проблемы не существует. Начиная с версии 3.8.6.
ложь

@AntonDanilov. Ладно. Но я на самом деле имел в виду различия в жирных строках «Цель = ...».
повторить

1
Может быть @PerMildner ответит?
неверно

Ответы:


6

Я не знаю, есть ли какая-то "глубокая" причина для различия. Так 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).


до 4,5,1 и после 3,8,5
ложь
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.