【问题标题】:What is the difference between abolish/1 and retractall/1?abolish/1 和retractall/1 有什么区别?
【发布时间】:2015-12-27 21:19:29
【问题描述】:

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

手册说:

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

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

【问题讨论】:

    标签: prolog prolog-assert


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      类似于 SQL:

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

      【讨论】:

      • 很好的比喻,谢谢!
      【解决方案3】:

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

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

      注意上面的may or may not直接适合the Prolog system you use

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

      【讨论】:

        猜你喜欢
        • 2018-08-26
        • 2019-01-12
        • 2015-11-04
        • 1970-01-01
        • 1970-01-01
        • 2011-02-27
        • 2011-10-24
        • 2018-04-07
        • 1970-01-01
        相关资源
        最近更新 更多