【发布时间】:2017-09-25 09:08:15
【问题描述】:
我正在尝试在 Prolog 中编写以下谓词,而 不 使用append/3:
lastTwoReversed(List, ListOf2)
当ListOf2 按该顺序包含List 的最后一个和倒数第二个元素时(即颠倒),该方法成功。
但是,我不知道从哪里开始。任何帮助表示赞赏。
【问题讨论】:
我正在尝试在 Prolog 中编写以下谓词,而 不 使用append/3:
lastTwoReversed(List, ListOf2)
当ListOf2 按该顺序包含List 的最后一个和倒数第二个元素时(即颠倒),该方法成功。
但是,我不知道从哪里开始。任何帮助表示赞赏。
【问题讨论】:
您可以编写一个简单的递归谓词,并在由两个元素组成的列表上匹配基本案例模式,如下所示:
last_two_reversed([X,Y],[Y,X]).
由于这可能是家庭作业,我认为最好自己编写递归子句。
【讨论】:
只需使用内置谓词reverse/2:
last_two_reversed([A,B|T],[Y,X]) :-
reverse([A,B|T],[Y,X|_]).
对于严格少于两个元素的列表,这将失败。明智的做法是使用这两个附加规则使其成功:
last_two_reversed([],[]).
last_two_reversed([H],[H]).
【讨论】:
首先,谓词应该是空列表还是只有一个元素的列表失败或成功??
在数学逻辑中,谓词应该在空列表和单元素列表的情况下返回 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 个或更多元素的列表,因此与之前的规则不匹配。
【讨论】: