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?