2011-07-23 32 views
0

我有一个问题 我需要输入一个列表,我想追加它的元素到另一个,我想在输出序言追加名单

这是我的代码:

run([],L). 
run([X|Y],Lista) :- X =..Total, append(Total,Lista,ListaR), run(Y,ListaR), stamp(ListaR). 

stamp([]). 
stamp([X|Y]) :- nl, write(X), stamp(Y). 

,如果我跑它具有:

run([p(X,Y,Z),h(Z,P,Q)],[]). 

它会打印出:

h 
_G238 
_G244 
_G245 
p 
_G236 
_G237 
_G238 
p 
_G236 
_G237 
_G238 
true. 

为什么它包含2次p?哪里不对?

_GXXX变数...

回答

1

它打印p两次,因为您在递归的每个级别打印结果。如果您想在最后只打印一次,请执行以下操作:

run([],L) :- stamp(L). 
run([X|Y],Lista) :- X =..Total, append(Total,Lista,ListaR), run(Y,ListaR). 
+0

非常感谢。 –

+0

如果您认为我的帖子确实回答了您的问题,则应点击勾号将其标记为已接受。 – svick

+0

好的,我确实...... –

1

对于追加你不需要写这个递归函数append/3列表为你做的。

?- append([a,b],[k,l],NewList). 
NewList = [a, b, k, l]. 

但我想在SWI-Prolog的代码它不会给你的输出,但它会产生错误的结果,因为你是在打印部分递归名单不止一个。你可以尝试类似的东西

run(List1,List2) :- append(List1,List2,ListResult), stamp(ListResult). 

希望它有帮助。

+0

否输入是:run([p(X,Y,Z),h(Z,P,Q)],[ ])。 –

+0

@ user448381没有输入我误解了问题,请将输入添加到问题中。 svick的答案会做你想做的。 –