Nieoczekiwane zachowanie zamrożonego / 2

11

Grałem około z orzeczników freeze/2oraz frozen/2:

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

(wersja 4.5.1 dla x86_64) dał następujące odpowiedzi:

| ? - zamrożenie (X, a = a), zamrożenie (X, bramka).
Cel = prolog: zamrożenie (X, użytkownik: (a = a)) ,
prolog: zamrożenie (X, użytkownik: (a = a))? ;
Nie
| ? - zamrożenie (X, a = a), zamrożenie (Y, b = b), X = Y, zamrożone (X, bramka).
Y = X,
Cel = (użytkownik: (a = a), prolog: zamrożenie (X, użytkownik: (b = b))) ,
prolog: zamrożenie (X, użytkownik: (a = a)),
prolog: zamrożenie (X, użytkownik: (b = b))? ;
Nie

Teraz się nie spodziewałem!Goal = prolog:freeze(X,user:(a=a))

Co ja zrobiłem oczekiwać odpowiedzi były podobne do tych podanych przez wersji 8.0.3:

? - zamrożenie (X, a = a), zamrożenie (X, bramka).
Cel = użytkownik: (a = a) ,
zamrożenie (X, a = a).
? - zamrożenie (X, a = a), zamrożenie (Y, b = b), X = Y, zamrożone (X, bramka).
X = Y,
Cel = (użytkownik: (a = a), użytkownik: (b = b)) ,
zamrażać (Y, a = a),
zamrażać (Y, b = b).

Prawdopodobnie zarówno odpowiedzi SICStus, jak i odpowiedzi SWI są poprawne ...

Ale czy istnieje głębszy powód nieco osobliwych odpowiedzi udzielonych przez SICStus?

powtarzać
źródło
1
AFAIK w Sicstus nie jest zaimplementowana funkcja maskowania „ostatniej awarii”? ; nie`
Anton Danilov,
Po pierwsze, preferowana jest wyraźna kwalifikacja.
fałszywy
1
Do wersji 3.8.5 ten problem nie istnieje. Od wersji 3.8.6 istnieje.
fałsz
@AntonDanilov. W porządku. Ale tak naprawdę miałem na myśli różnice w pogrubionych wierszach „Gol = ...”.
powtórz
1
Może @PerMildner odpowie?
false

Odpowiedzi:

6

Nie wiem, czy jest jakiś „głęboki” powód tej różnicy. Ponieważ frozen/2jest to ogólny interfejs do przypisywanych zmiennych, sensowne jest, aby nie były to freeze/2cele szczególne.

W rzeczywistości, do 4.5.1, SICStus próbował, ale czasem nie udawał się, do celów specjalnych freeze/2. Właśnie dlatego widzisz user:(a=a)pierwszy cel cząstkowy. W następnej wersji zmieniliśmy to, więc zamiast tego otrzymamy wynik Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(i wprowadziliśmy także kilka innych ulepszeń frozen/2).

Per Mildner
źródło
do 4,5,1, a po 3.8.5
fałszywe