2016-09-17 24 views
1

我需要在接受列表的prolog中編寫一個程序,將該列表反轉並將其附加到原始列表的末尾。如何反轉列表並在序言中將兩個列表連接在一起

實施例: list_rList([1,2,3],X)
X = [1,2,3,3,2,1]

到目前爲止我已經能夠扭轉列表,但我可以設法將反向列表追加到原始列表中。

以下是我有:

list_rList([],[]). 
list_rList([H|T],R):- list_rList(T,RevT), append(RevT,[H],R). 

回答

0

你可以做這樣的事情:

accRev([H|T],A,L,R) :- accRev(T,[H|A],L,R). 
accRev([],A,L,R) :- append(L,A,R). 

list_rList(L,R) :- accRev(L,[],L,R). 

這裏,第一列表是使用accumulator(的accRev第二個參數)逆轉,一旦這已完成,原始列表(保存在accRev的第三個參數中)被預先佔用。

+0

完美的作品!非常感謝你! – Sam4246

+1

如果「list_rList/2」的第一個參數是例如,則這不起作用。 '[1 | T]'或者一個完全自由的變量。 – Fatalize

2

在這裏是將正確地在所有方向上工作溶液:

list_rList(L, T) :- 
    list_rList(L, [], T). 

list_rList([], A, A). 
list_rList([H|T], C, [H|T2]) :- 
    list_rList(T, [H|C], T2). 

第二個參數將積聚在翻轉列表,而第三個將累積結果:原始的列表的每個元素是附加在第三個參數的開頭,尾部是第二個參數,一旦我們清空了第一個列表。

一些示例查詢:

 
?- list_rList([1,2,3],Z).   % What you asked 
Z = [1, 2, 3, 3, 2, 1]. 

?- list_rList([1|T],Z).    % With a variable tail 
T = [], 
Z = [1, 1] ; 
T = [_G1659], 
Z = [1, _G1659, _G1659, 1] ; 
T = [_G1659, _G1668], 
Z = [1, _G1659, _G1668, _G1668, _G1659, 1] 
… 

?- list_rList(Z,[1,2,3,3,2,1]).  % The original list from the result 
Z = [1, 2, 3] ; 
false. 

?- list_rList(Z,[1,2,3,3,2]).  % Check that a list can be the result of this predicate 
false. 

?- list_rList(Z,[1,2,3,X,Y,3,2,1]). % With variable elements in the result 
Z = [1, 2, 3, Y], 
X = Y ; 
false. 

?- list_rList(L,Z).     % With completely free arguments 
L = Z, Z = [] ; 
L = [_G1623], 
Z = [_G1623, _G1623] ; 
L = [_G1623, _G1632], 
Z = [_G1623, _G1632, _G1632, _G1623] ; 
L = [_G1623, _G1632, _G1641], 
Z = [_G1623, _G1632, _G1641, _G1641, _G1632, _G1623] ; 
L = [_G1623, _G1632, _G1641, _G1650], 
Z = [_G1623, _G1632, _G1641, _G1650, _G1650, _G1641, _G1632, _G1623] 
… 
相關問題