abolish/1 和 retractall/1 有什么区别?

What is the difference between abolish/1 and retractall/1?

看说明书,我好像找不到两者的区别。

手册说:

It is advised to use retractall/1 for erasing all clauses of a dynamic predicate.

所以我选择在我的程序中使用retractall/1;但是,我想知道有什么区别。

retractall/1 标准内置谓词可用于删除动态谓词的所有子句,但谓词仍会为运行时所知。另一方面,abolish/1 标准内置谓词不仅删除了所有谓词子句,而且还使谓词对运行时未知。如果您尝试在使用 retractall/1 删除所有子句后调用动态谓词,调用就会失败。但是如果废除一个动态谓词,之后调用它会导致谓词存在错误。

在我阅读你的问题和之前,我也不知道答案。

有了这个答案,我不想复制 Paulo 的答案。相反,我建议您考虑 reading/searching 个替代的 Prolog 相关来源:

注意上面的may or may not directly fit the Prolog system you use.

不过,拥有多个来源是一件好事:它可以让你避免卡住!

类似于SQL:

retractall(table_name(_,_,_)) 可能是 delete from table_name,而 abolish(table_name/3) 将扮演 drop table_name