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?
prolog
sicstus-prolog
prolog-coroutining
repetir
fuente
fuente
Respuestas:
No sé si hay alguna razón "profunda" para la diferencia. Dado que
frozen/2
es una interfaz general para variables atribuidas, tiene sentido no tenerfreeze/2
objetivos de casos especiales .De hecho, hasta 4.5.1, SICStus intentó, pero a veces falló, alcanzar
freeze/2
objetivos de casos especiales . Esta es la razón por la que vesuser:(a=a)
el primer objetivo secundario. En la próxima versión, hemos cambiado esto, por lo que el resultado seráGoal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))
(y también hemos realizado otras mejorasfrozen/2
).fuente