9

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

手册说:

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

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

4

3 回答 3

12

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

于 2015-12-27T23:45:00.587 回答
7

与 SQL 类比:

retractall(table_name(_,_,_))可能delete from table_name, while abolish(table_name/3)会扮演drop table_name

于 2015-12-28T08:02:04.850 回答
3

在我阅读您的问题和@PauloMoura 的好答案之前,我也不知道答案。

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

请注意,上述内容可能直接适合您使用的 Prolog 系统,也可能不适合您使用的 Prolog 系统

尽管如此,拥有多个来源是一件好事:它可以防止您陷入困境!

于 2015-12-28T07:57:07.380 回答