(Por sugestão de @repeat ) Considere uma consulta de um programa puro 1 ?- G_0.
Que utilidade teria a consulta ?- G_0, G_0.
?
Notas
de rodapé 1 Sem tabelas (por segurança), as restrições são aceitáveis.
Post anterior sobre o assunto.
prolog
logical-purity
falso
fonte
fonte
?- G_0(State), G_0(State).
também nenhum estado está sendo passado na pilha do resultado do primeiro objetivo para o segundo objetivo?G_0
pode ser qualquer objetivo (puro), incluindo, digamosG_0 = append(Xs,Ys,Zs)
G_0;G_0
Pode-se testar efeitos colaterais ou problemas de desempenho / armazenamento em cache / marcação)G_0(State),G_0(State)
um pouco escrevecall(G_1,State), call(G_1,State)
Respostas:
A consulta
?- G_0, G_0.
ajuda a identificar respostas redundantes de?- G_0.
Para fazer isso, basta comparar o número de respostas de
?- G_0.
com o número de respostas de?- G_0, G_0.
. Não há necessidade de armazenar essas respostas (que é uma fonte frequente de erros). Apenas dois inteiros são suficientes! Se forem iguais, não haverá redundância. Mas se?- G_0, G_0.
tiver mais respostas, haverá alguma redundância. Aqui está um exemplo:... e agora vamos corrigir isso:
Não há necessidade de inspecionar manualmente as restrições envolvidas.
Isso pode ser estendido ainda mais quando estamos procurando explicitamente apenas por respostas redundantes
call_nth/2
.fonte
Não vejo utilidade para o segundo objetivo, especialmente quando a otimização da recursão da cauda ( otimização da última chamada ) está ativada .
Eu pude perceber um problema de GC (estouro de pilha / pilha) quando a consulta é gananciosa por recursos e as opções acima estão DESLIGADAS (por exemplo, durante a depuração).
Eu acho que a segunda chamada é redundante (para programa puro) e deve ser eliminada pelo compilador.
fonte