首页 > 解决方案 > Prolog程序firstlast没有递归?

问题描述

如果列表具有相同的第一个和最后一个元素但没有仅使用附加谓词进行递归,我将如何编写一个像下面这样成功的序言程序?

firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).

示例查询:

?- firstlast([1,2,3,1]).
Yes

?- firstlast([1,2,3]).
No

标签: prologappend

解决方案


我认为您的谓词缺少一个边缘情况:单例列表:在一个只有一个元素的列表中,第一个和最后一个元素是相同的。

firstlast([_]).
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).

您可以使用append/3以下方法获取最后一个元素:

last(L, Last) :-
    append(_, [Last], L).

由于将 附加[Last]到某个列表,因此这项工作只能产生一个带有Last最后一个元素的列表。由于该列表是L,并且append/3可以朝那个方向工作,因此我们可以获得最后一个元素。例如:

?- append(_, [Last], [1,4,2,5]).
Last = 5 ;
false.

我认为有了这个提示,您应该能够在不递归的情况下解决问题。


推荐阅读