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

时间:2016-07-28 22:29:52

标签: list prolog

我正在尝试在Prolog中编写以下谓词,而使用lastTwoReversed(List, ListOf2)

ListOf2

List按顺序包含http://localhost:1337/api/reference?select=["name"] 的最后一个和倒数第二个元素(即反转)时,它会成功完成。

但是,我不知道从哪里开始。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:4)

您可以编写一个简单的递归谓词,其基本案例模式匹配在包含两个元素的列表中,如下所示:

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

由于这可能是家庭作业,我认为最好是你自己编写递归条款。

答案 1 :(得分: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 :(得分: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个或更多元素的列表,以便与之前的规则不匹配。