【问题标题】:Prolog - Assert into a new databaseProlog - 断言到新数据库
【发布时间】:2012-05-03 19:17:23
【问题描述】:
:-dynamic listofQuestions/2.
myrule:-
    write('P = '), write(Percent), write('-'),write(X),
    ( listofQuestions(Percent,X) -> true ; assert(listofQuestions(Percent,X)) ),

回答我的问题可能不需要代码 sn-p。

每次我调用我的规则时,我都想断言一个空白的“问题列表”。仅当我关闭 prolog 窗口并重新启动它时,才会发生这种情况。

有什么建议吗?

【问题讨论】:

  • 也许吧,因为我也问过这个问题。每次我的程序退出时,我都需要擦除它存储的任何内容。每次 PROLOG 退出时,它都能满足我的需要。但这不是我需要的。 :(

标签: prolog prolog-assert


【解决方案1】:

abolish/1 从数据库中删除给定谓词的所有子句。因此,只要您需要删除有关此谓词的信息,只需添加对 abolish(PredName/Arity) 的调用即可。注意取消对动态谓词的调用后不会失败而是报错。

12 ?- f(X,Y).
false.

13 ?- assert(f(a,b)).
true.

14 ?- f(X,Y).
X = a,
Y = b.

15 ?- abolish(f/2).
true.

16 ?- f(X,Y).
ERROR: user://2:67:
        toplevel: Undefined procedure: f/2 (DWIM could not correct goal)

在 SWI-Prolog 中,abolish 适用于静态过程,除非 prolog 标志 iso 设置为 true。如果你打算只删除动态谓词,你最好试试retractall。请注意,在这种情况下,删除不会导致报告错误,而是导致失败。

17 ?- [user].
:- dynamic f/2.
|: 
% user://3 compiled 0.00 sec, 264 bytes
true.

18 ?- f(X,Y).
false.

19 ?- assert(f(a,b)).
true.

20 ?- f(X,Y).
X = a,
Y = b.

21 ?- retractall(f(X,Y)).
true.

22 ?- f(X,Y).
false.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    相关资源
    最近更新 更多