【发布时间】:2015-12-27 21:19:29
【问题描述】:
通过阅读手册,我似乎找不到两者之间的区别。
手册说:
建议使用retractall/1 删除动态谓词的所有子句。
所以我选择在我的程序中使用retractall/1;但是,我想知道有什么区别。
【问题讨论】:
标签: prolog prolog-assert
通过阅读手册,我似乎找不到两者之间的区别。
手册说:
建议使用retractall/1 删除动态谓词的所有子句。
所以我选择在我的程序中使用retractall/1;但是,我想知道有什么区别。
【问题讨论】:
标签: prolog prolog-assert
retractall/1 标准内置谓词可用于删除动态谓词的所有子句,但运行时仍会知道该谓词。另一方面,abolish/1 标准内置谓词不仅删除了所有谓词子句,而且使运行时不知道谓词。如果您尝试在使用retractall/1 删除其所有子句后调用动态谓词,则调用将失败。但是如果你取消了一个动态谓词,在之后调用它会导致一个谓词存在错误。
【讨论】:
类似于 SQL:
retractall(table_name(_,_,_)) 可以是 delete from table_name,而
abolish(table_name/3) 将扮演 drop table_name
【讨论】:
在阅读您的问题和@PauloMoura's fine answer 之前,我也不知道答案。
有了这个答案,我不想复制保罗的答案。相反,我建议您考虑阅读/搜索与 Prolog 相关的替代资源:
The ISO directives, control constructs and builtins—iso-prolog 在 SO
4.12.5 Removing Clauses from the Database—sicstus-prologmanual
Chapter 9 Dynamic Clauses and Global Variables—bprologmanual
6.14 Asserting, Retracting, and Other Database Modifications—xsbmanual
注意上面的may or may not直接适合the Prolog system you use。
不过,拥有多个来源是一件好事:它可以防止您陷入困境!
【讨论】: