Stavo giocando con i predicati del prologo-coroutiningfreeze/2
e frozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
sicstus-prolog (versione 4.5.1 per x86_64) ha dato queste risposte:
| ? - Congela (X, a = a), congelata (X, Obiettivo). Obiettivo = prologo: blocco (X, utente: (a = a)) , prologo: congelare (X, utente: (a = a))? ; no | ? - congelare (X, a = a), congelare (Y, b = b), X = Y, congelato (X, Obiettivo). Y = X, Obiettivo = (utente: (a = a), prologo: blocco (X, utente: (b = b))) , Prolog: freeze (X, utenti: (A = A)), prologo: congelare (X, utente: (b = b))? ; no
Ora non me l'aspettavo!Goal = prolog:freeze(X,user:(a=a))
Quello che ho fatto aspettare erano risposte come quelle fornite dal swi-prolog versione 8.0.3:
? - Congela (X, a = a), congelata (X, Obiettivo). Obiettivo = utente: (a = a) , congelare (X, a = a). ? - congelare (X, a = a), congelare (Y, b = b), X = Y, congelato (X, Obiettivo). X = Y, Obiettivo = (utente: (a = a), utente: (b = b)) , congelare (Y, a = a), congelare (Y, b = b).
Probabilmente, sia le risposte SICStus che SWI sono corrette ...
Ma c'è una ragione più profonda per le risposte alquanto peculiari fornite da SICStus?