【问题标题】:Prolog - Using dynamic with assertsProlog - 使用带有断言的动态
【发布时间】:2014-04-08 16:48:03
【问题描述】:

我是 Prolog 的新手,我很难使用动态谓词。

首先,这是我正在执行的代码

:- dynamic(list/1).

add(X, LL) :- asserta(list([])), asserta(list(X)), retract(list(LL)).

我知道代码看起来很奇怪,但我只是在寻找要使用的正确语法。

现在,如果我这样做:

添加(2,LL)。

答案是:

LL = 2 ;

LL = []。

但我想做的是将 X (2) 添加到数组 ([]) 中。所以..

LL = [2]。

它看起来很简单(可能是这样),但我无法让它工作。

非常感谢。

【问题讨论】:

  • 我想加到前面。我希望它以 X = [] 失败。
  • 如果您是 Prolog 新手,请忘记断言。首先学习其他所有内容:逻辑变量、统一、谓词和/或列表、递归……

标签: dynamic prolog prolog-assert


【解决方案1】:

如果要将X添加到列表的最前面:

add(X, LL) :-
    (   retract(list(Prev))
    ->  LL = [X|Prev]
    ;   LL = [X]
    ),
    asserta(list(LL)).

但我同意@jschimpf 的建议。 Assert/retract 仅应在某些情况下使用,因为在某些应用程序中可能非常有效。

【讨论】:

  • 当然,如果可能,最好避免使用非逻辑功能,但 Prolog 的数据库非常针对它们的任务进行了很好的调整,我不会说“效率低下”。在我的 2 便士机器上,我在大约 8 秒内获得了一个完全索引的 Wordnet 图像......(大约 30 万条记录......)
  • @CapelliC 确实,我试图用“在某些情况下”来限定我的评论,但措辞不好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
  • 2012-08-08
相关资源
最近更新 更多