【问题标题】:Prolog - How to assert/make a database only onceProlog - 如何仅断言/创建数据库一次
【发布时间】:2012-05-03 18:37:41
【问题描述】:
resultList(UsersQuery):-
    question(X,H),
    write(H),
    myintersection(H,UsersQuery,Match,TotalQuestionKeywords),
    Percent is Match/TotalQuestionKeywords*100,
    write('Question: '),
    write(X),nl,write('Quality: '), write(Percent),write('%'),nl,

    /* please look at this part
    Percent>=50,
    assert(listofQuestions(Percent,Question)),
    write(Percent),write(Question),nl,
    fail.
resultList(_).

我想填充一个名为“listofQuestions”的事实数据库。一切正常,但我断言的东西留在内存中。所以,如果我再次运行我的程序,我会在“问题列表”中添加相同的事实。

我只想拥有一组数据。

谢谢

【问题讨论】:

  • 尝试使用 if-then-else 内置谓词 ( listofQuestions(P,Q) -> true ; assert(listofQuestions(P,Q)) )
  • 效果不错。但是每次我调用我的规则时,我想要的是一个全新的空白“问题列表”。只有当我重新启动 prolog 时才会发生这种情况。有什么帮助吗?

标签: prolog rule


【解决方案1】:

也许在你重新运行你的程序之前做retractall/1

【讨论】:

  • 非常感谢。后来我确实有一个撤回声明。但是在阅读您的评论时,我将其放在了一行之前。它像桃子一样工作! xD
【解决方案2】:

为断言创建一个单独的谓词,检查事实是否尚未断言:

assertThisFact(Fact):-
    \+( Fact ),!,         % \+ is a NOT operator.
    assert(Fact).
assertThisFact(_).

【讨论】:

  • 我喜欢这个答案。这个概念是防弹的吗?这个not怎么样,兼容swi-prolog吗?
  • 或者,在单个子句中且不带否定:assert_once(Fact) :- ( Fact, ! ; assertz(Fact) ).
猜你喜欢
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
相关资源
最近更新 更多