反转Prolog中每隔一秒的列表列表



我有一个包含列表的列表,我想反转其中的每一秒列表。我尝试了一些东西,但是如果我在列表中有奇数个元素,最后一个列表元素就会丢失......因此,最好的解决方案是将奇数列表放在第一位,偶数列表放在第二位,直到每隔一个列表被颠倒。

我不能使用任何库。我需要递归地执行此操作或拆分它们并再次附加它们。到目前为止,我做的最好的事情是只反转第一个偶数列表,并将第一个奇数和偶数列表附加到新列表中。

我试图这样做:

reverselist(List, [List]).
reverselist([X,Y|Rest], [SnakeList|Rest2]):-
append(X, [], Odd),
reverse(Y, EvenList),
append(Odd, EvenList, SnakeList),
reverselist(Rest, Rest2).

而这个:

reverselist(List1, List2).
reverselist([H|Ts], [Odd|R]):-
not(0 is H mod 2),
append(H, [], Odd),
reverselist(Ts, R).
reverselist([H|Ts], [Even|R]):-
0 is H mod 2,
reverse(H, Even),
reverselist(Ts, R).

示例查询:

?- reverselist([[a,b,c],[d,a,b],[c,d,o],[b,c,d],[e,e,d]], List).

我希望结果是:

List = [ [a,b,c],[b,a,d],[c,d,o],[d,c,b],[e,e,d] ].

你也可以写互递归:

reverselist([],[]).
reverselist([H|T],[H|T1]):-reverselist2(T,T1).
reverselist2([],[]).
reverselist2([H|T],[H1|T1]):-reverse(H,H1), reverselist(T,T1).

你和你的第一个变体非常接近。

而不是你的

reverselist(List, [List]).
reverselist([X,Y|Rest], [SnakeList|Rest2]):-
append(X, [], Odd),
reverse(Y, EvenList),
append(Odd, EvenList, SnakeList),
reverselist(Rest, Rest2).

只需将其调整为

reverselist([],   []).               % additional clause
reverselist([List], [List]).
reverselist([X,Y|Rest], [X,EvenList|Rest2]):-
reverse(     Y,          EvenList),
reverselist(   Rest,              Rest2).

所有三个条款都是相互排斥的,它们加在一起是详尽无遗的,即它们涵盖了所有可能性。

我相信这个定义是你的问题最直接和最接近的表达。在Prolog中,提出问题意味着要有解决方案。

我们需要用另一个参数创建另一个谓词来跟踪奇数或偶数位置:

reverselist(InList,OutList):- reverselist(InList,OutList, 0).
reverselist([],[],_). %base case
%case of even position
reverselist([H|T],[H|T1], 0):- reverselist(T,T1,1).
%case of odd position
reverselist([H|T],[H1|T1], 1):- reverse(H1,H), reverselist(T,T1,0).

最新更新