Несподівана поведінка заморожених / 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)) ,
prolog: заморозити (X, користувач: (a = a))? ;
ні
| ? - заморожувати (X, a = a), заморожувати (Y, b = b), X = Y, заморожувати (X, ціль).
Y = X,
Мета = (користувач: (a = a), prolog: заморозити (X, користувач: (b = b))) ,
prolog: заморозити (X, користувач: (a = a)),
prolog: заморозити (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.