在Prolog中将列表的最后两个元素反转

3

我正在尝试在Prolog中编写以下谓词,而不使用append/3

lastTwoReversed(List, ListOf2)

ListOf2 恰好包含按照倒序排列的 List 的最后一个元素和倒数第二个元素时,该函数将返回成功。

然而,我不知道从哪里开始。欢迎任何帮助。


请参考极其相似的方法:https://dev59.com/HMLra4cB1Zd3GeqPWP2Z#70310254 - brebs
3个回答

4

你可以编写一个简单的递归谓词,并使用模式匹配在由两个元素组成的列表上进行基本情况的匹配,代码如下:

last_two_reversed([X,Y],[Y,X]).

因为这可能是一道作业题,所以我认为最好让你自己尝试编写递归子句。


3

只需使用内置的谓词reverse/2

last_two_reversed([A,B|T],[Y,X]) :-
    reverse([A,B|T],[Y,X|_]).

这将不能处理严格少于两个元素的列表。一个明智的做法是使用以下两个额外规则使其成功:
last_two_reversed([],[]).
last_two_reversed([H],[H]).

2
这个版本的空间成本与列表的长度成比例。 - false

1
首先,谓词应该在空列表或只有一个元素的列表中失败或成功?在数理逻辑中,当列表为空或只有一个元素时,谓词应该返回true,因为没有最后一个和倒数第二个元素可以反转。因此,如果您想在空或一个元素列表上成功,您应该首先开始:
  lastTwoReversed([],[]).
  lastTwoReversed([X],[X]).

否则不要编写上述规则。 接下来,您应该编写以下内容作为基础:
lastTwoReversed([X,Y],[Y,X])

最后,针对长度为3或更大的列表,请编写以下内容:
lastTwoReversed([X,Y,Z|T],[X|T1]):-lastTwoReversed([Y,Z|T],T1).

请记住,我们写[X,Y,Z|T]来指定具有3个或更多元素的列表,以便不与先前的规则匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接