Estaba jugando con los predicados de prolog-coroutiningfreeze/2
y frozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
sicstus-prolog (versión 4.5.1 para x86_64) dio estas respuestas:
El | ? - congelar (X, a = a), congelar (X, Meta). Objetivo = prólogo: congelar (X, usuario: (a = a)) , prólogo: congelar (X, usuario: (a = a))? ; No El | ? - congelar (X, a = a), congelar (Y, b = b), X = Y, congelar (X, Meta). Y = X, Objetivo = (usuario: (a = a), prólogo: congelar (X, usuario: (b = b))) , prólogo: congelar (X, usuario: (a = a)), prólogo: congelar (X, usuario: (b = b))? ; No
Ahora no esperaba!Goal = prolog:freeze(X,user:(a=a))
Lo que hice esperar respuestas eran como las dadas por el SWI-Prolog versión 8.0.3:
? - congelar (X, a = a), congelar (X, Meta). Objetivo = usuario: (a = a) , congelar (X, a = a). ? - congelar (X, a = a), congelar (Y, b = b), X = Y, congelar (X, Objetivo). X = Y, Objetivo = (usuario: (a = a), usuario: (b = b)) , congelar (Y, a = a), congelar (Y, b = b).
Podría decirse que tanto las respuestas SICStus como las respuestas SWI son correctas ...
¿Pero hay una razón más profunda para las respuestas algo peculiares dadas por SICStus?