Comportamento inesperado de congelado / 2

11

Eu estava brincando com os predicados de freeze/2 e frozen/2:

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

(versão 4.5.1 para x86_64) deu as seguintes respostas:

| ? - congelar (X, a = a), congelado (X, meta).
Objetivo = prólogo: congelar (X, usuário: (a = a)) ,
prólogo: congelar (X, usuário: (a = a))? ;
não
| ? - congelar (X, a = a), congelar (Y, b = b), X = Y, congelar (X, meta).
Y = X,
Meta = (usuário: (a = a), prólogo: congelar (X, usuário: (b = b))) ,
prolog: congelar (X, usuário: (a = a)),
prólogo: congelar (X, usuário: (b = b))? ;
não

Agora eu não esperava!Goal = prolog:freeze(X,user:(a=a))

O que eu fiz esperar eram respostas como os dados por versão 8.0.3:

? - congelar (X, a = a), congelado (X, meta).
Meta = usuário: (a = a) ,
congelar (X, a = a).
? - congelar (X, a = a), congelar (Y, b = b), X = Y, congelar (X, meta).
X = Y,
Meta = (usuário: (a = a), usuário: (b = b)) ,
congelar (Y, a = a),
congelar (Y, b = b).

Indiscutivelmente, as respostas SICStus e SWI estão corretas ...

Mas existe uma razão mais profunda para as respostas um tanto peculiares dadas pelo SICStus?

repetir
fonte
11
AFAIK no Sicstus a funcionalidade para mascarar "última falha" não está implementada `? ; no`
Anton Danilov
Por um lado, a qualificação explícita é preferível.
false
11
Até 3.8.5 esse problema não existe. A partir de 3.8.6, ele existe.
false
@AntonDanilov. OK. Mas na verdade eu estava me referindo a diferenças nas linhas em negrito "Objetivo = ...".
repita
11
Talvez o @PerMildner responda?
false

Respostas:

6

Não sei se existe alguma razão "profunda" para a diferença. Como frozen/2é uma interface geral para variáveis ​​atribuídas, faz sentido que não sejam freeze/2objetivos de casos especiais .

De fato, até 4.5.1, o SICStus tentou, mas às vezes falhou, freeze/2atingir objetivos de casos especiais . É por isso que você vê user:(a=a)o primeiro subobjetivo. No próximo lançamento, mudamos isso para que o resultado se torne Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(e também fizemos outras melhorias frozen/2).

Per Mildner
fonte
até 4,5,1 e depois de 3.8.5
false