我正在尝试在Prolog中编写以下谓词,而不使用lastTwoReversed(List, ListOf2)
:
ListOf2
当List
按顺序包含http://localhost:1337/api/reference?select=["name"]
的最后一个和倒数第二个元素(即反转)时,它会成功完成。
但是,我不知道从哪里开始。任何帮助表示赞赏。
答案 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个或更多元素的列表,以便与之前的规则不匹配。