通过阅读手册,我似乎无法找到两者之间的区别。
手册说:
建议使用retractall / 1来删除动态谓词的所有子句。
所以我选择在我的程序中使用retractall/1
;但是,我想知道区别是什么。
答案 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相关的替代资源:
The ISO directives, control constructs and builtins - iso-prolog关于SO
4.12.5 Removing Clauses from the Database - sicstus-prolog manual
Chapter 9 Dynamic Clauses and Global Variables - bprolog manual
6.14 Asserting, Retracting, and Other Database Modifications - xsb manual
请注意,上述may or may not直接适合the Prolog system you use。
尽管如此,拥有多个来源是一件好事:它可以防止卡住!