Eu estava brincando com os predicados de pró-roteirizaçãofreeze/2
e frozen/2
:
?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).
O sicstus-prolog (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 SWI-Prolog 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?
prolog
sicstus-prolog
prolog-coroutining
repetir
fonte
fonte
Respostas:
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 sejamfreeze/2
objetivos de casos especiais .De fato, até 4.5.1, o SICStus tentou, mas às vezes falhou,
freeze/2
atingir 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 torneGoal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))
(e também fizemos outras melhoriasfrozen/2
).fonte