Prolog - como limpar a memória e começar do zero?
-
29-10-2019 - |
Pergunta
Estou desenvolvendo um algoritmo em um arquivo .pl e examinando-o com consultas na janela de comando. Eu uso variáveis dinâmicas e retraio / declaro predicados.E quando eu modifico o arquivo pl e clico em "recarregar arquivos modificados", eu tenho fatos extras que não quero.
por exemplo, no começo eu tenho contador (0).
e eu faço algo, retiro e declaro este contador, ele se torna o contador (7).Então, quando eu recarregar o arquivo pl modificado, eu tenho ambos contador (0).e contador (7).
Como posso evitar isso e só ter contador (0).no começo?
Agradecemos antecipadamente.
Solução
Inserir
:- abolish(counter/1).
no início do seu arquivo.Quando terminar o teste, remova-o.
Outras dicas
Se você usar esses fatos dinâmicos apenas para implementar contadores, deve pensar se esta é a melhor maneira de fazer isso.Usar assert/1
e retract/1
torna o código bastante lento.
Você pode tornar a variável do contador outro argumento de predicado que você passa adiante em seu código (você pode precisar distinguir entre entrada e saída, então tem dois argumentos extras), ou usar variáveis globais (que são recursos não lógicos,embora, o que às vezes é impossível).
Depende do sistema que você está usando.Em YAP, B, GNU, SICStus, o
A diretiva :- dynamic(counter/1).
tem esse efeito.Ou seja, apenas o
fatos do arquivo estão presentes após o recarregamento.
No SWI, os predicados dinâmicos são mantidos conforme você descreve.Você precisa removê-los diretamente com retractall/1
, que retém a informação de que o predicado é dinâmico.