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

时间:2015-03-25 10:36:03

标签: prolog swi-prolog

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

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

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

  3. 等等。

    这是在每次查询执行后刷新断言的方法吗?这是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)
            )
        ).
    

2 个答案:

答案 0 :(得分:1)

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

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

在连结中你可以给出你想要清除的价值。

答案 1 :(得分:0)

我假设'冲洗'你的意思是'忘记'。

retractall / 1就是你想要的。

示例:

? - 断言(bottoms_on_fire(all_english_men))。

真。

? - 断言(bottoms_on_fire(all_scottish_men))。

真。

? - bottoms_on_fire(all_english_men)。

真。

? - retractall(bottoms_on_fire(_))。

真。

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

? - bottoms_on_fire(all_english_men)。

假。