我需要在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 :(得分: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).
这里,首先使用accumulator(accRev
的第二个参数)反转列表,一旦完成,原始列表(保存在{{1}的第三个参数中) })是前置的。