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

List 如何在prolog中反转列表并将两个列表连接在一起,list,prolog,append,reverse,List,Prolog,Append,Reverse,我需要用prolog编写一个程序,它接受一个列表,反转该列表,并将其追加到原始列表的末尾 例如: 列表列表([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) :- accRe

我需要用prolog编写一个程序,它接受一个列表,反转该列表,并将其追加到原始列表的末尾

例如: 列表列表([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).

在这里,首先使用一个(第二个参数
approv
)反转列表,完成后,原始列表(保存在
approv
的第三个参数中)被预先设置好。

这里有一个解决方案,它将在所有方向上正确工作

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,2,3],Z)。%你问的 Z=[1,2,3,3,2,1]。 ?列表列表([1 | T],Z)。%尾巴可变的 T=[], Z=[1,1]; T=[[u G1659], Z=[1,1659,1]; T=[[u G1659,[u G1668], Z=[1,1659,1668,668,1659,1] … ?列表列表(Z[1,2,3,3,2,1])。%从结果中删除原始列表 Z=[1,2,3]; 错。 ?列表列表(Z[1,2,3,3,2])。%检查列表是否可以是该谓词的结果 错。 ?列表列表(Z[1,2,3,X,Y,3,2,1])。%结果中包含可变元素 Z=[1,2,3,Y], X=Y; 错。 ?-列表列表(L,Z)。%有完全自由的论据 L=Z,Z=[]; L=[[U G1623], Z=[[u G1623,[u G1623]; L=[[U G1623,[U G1632], Z=[[u G1623,[u G1632,[u G1632,[u G1623]; L=[[U G1623,[U G1632,[U G1641], Z=[[U G1623、[U G1632、[U G1641、[U G1641、[U G1632、[U G1623]; L=[[U G1623、[U G1632、[U G1641、[U G1650], Z=[[U G1623、G1632、G1641、G1650、G1650、G1641、G1632、G1623] …
如果
list_rList/2
的第一个参数是例如
[1 | T]
或一个完全自由的变量,则这不起作用。