每次执行后刷新断言(事实)

Flushing the asserts(facts) after each execution

我在 python 程序中使用 swi-prolog。它从用户那里获取输入查询并为其创建断言。我将这部分保留为 gearman worker(如服务器套接字),它一直在监听输入查询。

  1. 第一个查询 - 程序生成 x 个断言

  2. 第二个查询 - 程序生成 y 个断言,现在程序在处理查询时考虑 (x+y) 个断言。

等等。

是否有任何方法可以在每次查询执行后刷新断言?这是 process.pro:

的代码片段

此处链接采用断言,问题用于输入查询。

question(REND, RULE):-
    linkage(LINK, LEND, REND_NEW),
    (  
        (
            rule_first_question(LINK, REND_NEW) ->
                nb_getval(rule, RULE_NEW),
                nb_getval(rend, REND)
                ; nb_linkval(rule, ''), nb_getval(rule, RULE)
        )
        ;
        (
            rule_third_question(LINK, REND_NEW) ->
                nb_getval(link, LINK_NEW),
                nb_getval(rule, RULE_NEW)
                ; nb_linkval(rule, ''), nb_getval(rule, RULE)
        )
        ;
        (
            rule_four_question(LINK, REND_NEW) ->
                nb_getval(link, LINK_NEW),
                nb_getval(rule, RULE_NEW)
                ; nb_linkval(rule, ''), nb_getval(rule, RULE)
        )
    ).

是的,retract 可以帮助您从数据库中删除事实。

for p in self.prolog_question_identify.query("retract(linkage(_,_,_)),fail"):
    print

在链接中你可以给出你想要刷新的任何值。

我假设您所说的“同花顺”是指“忘记”。

retractall/1如你所愿

示例:

?- assert(bottoms_on_fire(all_english_men)).

正确。

?- assert(bottoms_on_fire(all_scottish_men)).

正确。

?- bottoms_on_fire(all_english_men).

正确。

?- retractall(bottoms_on_fire(_)).

正确。

%note- 使用匿名变量来统一所有这些事实

?- bottoms_on_fire(all_english_men).

错误。