List 如何在prolog中反转列表并将两个列表连接在一起
我需要用prolog编写一个程序,它接受一个列表,反转该列表,并将其追加到原始列表的末尾 例如: 列表列表([1,2,3],X)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
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]
或一个完全自由的变量,则这不起作用。