Comportamiento inesperado de congelado / 2

11

Estaba jugando con los predicados de freeze/2 y frozen/2:

?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).

(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 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?

repetir
fuente
1
AFAIK en Sicstus la funcionalidad para enmascarar "último fallo" no se implementa `? ; no`
Anton Danilov
Por un lado, la calificación explícita es preferible.
falso
1
Hasta 3.8.5 este problema no existe. A partir de 3.8.6 existe.
falso
@AntonDanilov. Bueno. Pero en realidad me refería a las diferencias en las líneas en negrita "Objetivo = ...".
repita el
1
¿Quizás @PerMildner responderá?
falso

Respuestas:

6

No sé si hay alguna razón "profunda" para la diferencia. Dado que frozen/2es una interfaz general para variables atribuidas, tiene sentido no tener freeze/2objetivos de casos especiales .

De hecho, hasta 4.5.1, SICStus intentó, pero a veces falló, alcanzar freeze/2objetivos de casos especiales . Esta es la razón por la que ves user:(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 mejoras frozen/2).

Por niño
fuente
hasta 4,5,1 y después 3.8.5
falso