首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Prolog中每隔一个列表反转一次

在Prolog中每隔一个列表反转一次
EN

Stack Overflow用户
提问于 2019-12-16 16:31:52
回答 3查看 102关注 0票数 1

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

我不能使用任何库。我需要递归地做这件事,或者拆分它们,然后再追加它们。到目前为止,我做的最好的事情是只颠倒第一个偶数列表,并将第一个奇数和偶数列表追加到一个新的列表中。

我试着这样做:

代码语言:javascript
运行
复制
reverselist(List, [List]).
reverselist([X,Y|Rest], [SnakeList|Rest2]):-
    append(X, [], Odd),
    reverse(Y, EvenList),
    append(Odd, EvenList, SnakeList),
    reverselist(Rest, Rest2).

还有这个:

代码语言:javascript
运行
复制
 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).

示例查询:

代码语言:javascript
运行
复制
?- reverselist([[a,b,c],[d,a,b],[c,d,o],[b,c,d],[e,e,d]], List).

我希望结果是:

代码语言:javascript
运行
复制
List = [ [a,b,c],[b,a,d],[c,d,o],[d,c,b],[e,e,d] ].
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-12-16 19:42:24

你与你的第一个变种非常接近。

而不是你的

代码语言:javascript
运行
复制
reverselist(List, [List]).
reverselist([X,Y|Rest], [SnakeList|Rest2]):-
  append(X, [], Odd),
  reverse(Y, EvenList),
  append(Odd, EvenList, SnakeList),
  reverselist(Rest, Rest2).

只需将其调整为

代码语言:javascript
运行
复制
reverselist([],   []).               % additional clause
reverselist([List], [List]).
reverselist([X,Y|Rest], [X,EvenList|Rest2]):-
  reverse(     Y,          EvenList),
  reverselist(   Rest,              Rest2).

所有这三个子句都是相互排斥的,它们在一起是详尽的,即它们涵盖了所有的可能性。

我相信这个定义是对你的问题最直接、最贴切的描述。在Prolog中,用公式表示问题就意味着有问题的解决方案。

票数 2
EN

Stack Overflow用户

发布于 2019-12-16 17:49:25

您还可以编写相互递归:

代码语言:javascript
运行
复制
reverselist([],[]).
reverselist([H|T],[H|T1]):-reverselist2(T,T1).

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

Stack Overflow用户

发布于 2019-12-16 17:40:37

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

代码语言:javascript
运行
复制
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).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59352907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档