如何在prolog中反转列表并将两个列表连接在一起

时间:2016-09-17 16:40:17

标签: list prolog append reverse

我需要在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).

2 个答案:

答案 0 :(得分: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]
…

答案 1 :(得分: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).

这里,首先使用accumulatoraccRev的第二个参数)反转列表,一旦完成,原始列表(保存在{{1}的第三个参数中) })是前置的。