Dynamic Prolog-使用动态断言

Dynamic Prolog-使用动态断言,dynamic,prolog,prolog-assert,Dynamic,Prolog,Prolog Assert,我是Prolog新手,我很难使用动态谓词 首先,这是我正在执行的代码 :- dynamic(list/1). add(X, LL) :- asserta(list([])), asserta(list(X)), retract(list(LL)). 我知道代码看起来很奇怪,但我只是在寻找正确的语法 现在,如果我这样做: 加(2,LL) 答案是: LL=2 LL=[] 但我想做的是将X(2)添加到数组([])。所以 LL=[2] 它看起来很简单(可能很简单),但我无法让它工作 非常感谢 如果要

我是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
添加到列表的前面:

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

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

我想将其添加到前面。我希望它在X=[]的情况下失败。如果您是Prolog新手,请忘记assert。首先学习所有其他内容:逻辑变量、统一、谓词和/或、列表、递归……当然,如果可能,最好避免使用非逻辑特性,但Prolog的DBs针对它们的任务进行了很好的调优,我不会说它们“低效”。在我的2便士机器上,我在大约8秒内得到一个完全索引的Wordnet图像。。。(大约30万张唱片…)的确,我试图用“在某些情况下”来限定我的评论,但没有说得很好。