2011-07-23 31 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的答案會做你想做的。 –