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 相关来源:
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
6.10.1 Modification of the Data Base—part of the yap manual
注意上面的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
看说明书,我好像找不到两者的区别。
手册说:
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 相关来源:
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
6.10.1 Modification of the Data Base—part of the yap manual
注意上面的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