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

时间:2015-12-27 21:19:29

标签: prolog prolog-assert

通过阅读手册,我似乎无法找到两者之间的区别。

手册说:

  

建议使用retractall / 1来删除动态谓词的所有子句。

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

3 个答案:

答案 0 :(得分:8)

retractall/1标准内置谓词可用于删除动态谓词的所有子句,但运行时仍将知道谓词。另一方面,abolish/1标准内置谓词不仅删除了所有谓词子句,还使运行时未知的谓词。如果在使用retractall/1删除所有子句后尝试调用动态谓词,则调用将失败。但是如果你取消动态谓词,之后调用它将导致谓词存在错误。

答案 1 :(得分:5)

与SQL类似:

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

播放

答案 2 :(得分:2)

在我阅读你的问题和@PauloMoura's fine answer之前,我也不知道答案。

有了这个答案,我不想复制保罗的回答。相反,我建议你考虑阅读/搜索与Prolog相关的替代资源:

请注意,上述may or may not直接适合the Prolog system you use

尽管如此,拥有多个来源是一件好事:它可以防止卡住!