2014-04-08 71 views
0

我是新来的Prolog,我很难用动态谓词。序言 - 使用动态断言

首先,这里我执行

:- dynamic(list/1). 

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

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

现在,如果我这样做:

add(2,LL)。

答案将是:

LL = 2;

LL = []。

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

LL = [2]。

它看起来很简单(可能是),但我无法得到它的工作。

非常感谢。

+0

我想将它添加到前面。我希望它失败,X = []。 –

+3

如果你是Prolog的新手,忘记断言。首先了解其他所有内容:逻辑变量,统一,谓词和/或列表,递归,... – jschimpf

回答

0

如果你想添加X到列表的前面:

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

但我@ jschimpf的建议达成一致。断言/回退只能在某些情况下使用,因为在某些应用中可能相当有效。

+0

肯定可能的时候最好避免非逻辑特征,但是Prolog的DB非常适合他们的任务,我不会说'低效率'。在我的2分钱的机器,我得到一个完全索引WORDNET图像中约8秒......(这是关于300K记录...) – CapelliC

+0

@CapelliC的确,我想我有资格评论为“在某些情况下”,但没有字好吧。 – lurker