Grałem około z PROLOG-coroutining orzeczników freeze/2
oraz frozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
sicstus-prolog (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 SWI-Prolog 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?
prolog
sicstus-prolog
prolog-coroutining
powtarzać
źródło
źródło
Odpowiedzi:
Nie wiem, czy jest jakiś „głęboki” powód tej różnicy. Ponieważ
frozen/2
jest to ogólny interfejs do przypisywanych zmiennych, sensowne jest, aby nie były tofreeze/2
cele 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 widziszuser:(a=a)
pierwszy cel cząstkowy. W następnej wersji zmieniliśmy to, więc zamiast tego otrzymamy wynikGoal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))
(i wprowadziliśmy także kilka innych ulepszeńfrozen/2
).źródło