2016-07-28 68 views
3

我试图写序言以下谓词而制作append/3使用:反向列表的最后两个元素在序言

lastTwoReversed(List, ListOf2) 

这成功究竟何时ListOf2包含的最后一个和第二按顺序排列的List的最后一个元素(即颠倒过来)。

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

回答

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

4

你可以写一个简单的递归谓词名单上的一个基本情况的模式匹配包含两个元素,像这样的:

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

因为这可能是家庭作业,我认为这是最好的,如果你尝试写递归子句你自己。

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种以上的元素列表,以便不符合以前的规则。

相关问题