【问题标题】:Flushing the asserts(facts) after each execution每次执行后刷新断言(事实)
【发布时间】:2015-03-25 10:36:03
【问题描述】:

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

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

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

等等。

有没有办法在每次查询执行后刷新断言?这是process.pro的代码sn-p:

这里的链接接受断言,问题用于输入查询。

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)
        )
    ).

【问题讨论】:

  • 最后一个分号对我来说似乎是无效的语法
  • @CapelliC: 是的,复制代码 sn-p 时忘记删除。
  • nb_getval/2nb_linkval 用于您的目的是没有意义的。这些结构很少使用,从它们开始你不会学到任何关于 Prolog 的知识。
  • @false:谢谢,实际上我找不到更好的 swi-prolog 教程,而且我只是初学者。感谢您的建议和改进

标签: prolog swi-prolog


【解决方案1】:

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

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

在链接中,您可以给出您想要清除的任何值。

【讨论】:

    【解决方案2】:

    我假设“冲洗”是指“忘记”。

    retractall/1 是你想要的。

    例子:

    ?- 断言(bottoms_on_fire(all_english_men))。

    是的。

    ?- 断言(bottoms_on_fire(all_scottish_men))。

    是的。

    ?- bottoms_on_fire(all_english_men).

    是的。

    ?- 收回(bottoms_on_fire(_))。

    是的。

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

    ?- bottoms_on_fire(all_english_men).

    假的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多