我需要在接受列表的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).
我需要在接受列表的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).
你可以做這樣的事情:
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
的第三個參數中)被預先佔用。
在這裏是將正確地在所有方向上工作溶液:
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] …
完美的作品!非常感謝你! – Sam4246
如果「list_rList/2」的第一個參數是例如,則這不起作用。 '[1 | T]'或者一個完全自由的變量。 – Fatalize