List 序言列表。检查列表中的第一个和最后一个元素是否相似

List 序言列表。检查列表中的第一个和最后一个元素是否相似,list,prolog,dcg,List,Prolog,Dcg,例如: firstlast([1,2,3,4,1]). true; firstlast([1,2,3,4]). false; firstlast([5,10,4,3]). false; exc... 问题是im只允许对谓词“firstlast”使用递归? 我真的试图打破这一点,但我似乎无法检查/比较最后一个元素和第一个元素 有任何提示吗?更新:由于不允许使用其他谓词,请尝试以下操作: firstlast([H,H]). firstlast([F,_|T]) :- firstlast([F

例如:

firstlast([1,2,3,4,1]).
true;

firstlast([1,2,3,4]).
false;

firstlast([5,10,4,3]).
false;

exc...
问题是im只允许对谓词“firstlast”使用递归? 我真的试图打破这一点,但我似乎无法检查/比较最后一个元素和第一个元素


有任何提示吗?

更新:由于不允许使用其他谓词,请尝试以下操作:

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

第一个谓词处理基本情况,第二个谓词删除包含三个或更多项的列表中的第二个元素,并向下递归。

您的意思可能是第一个元素和最后一个元素相同。下面是一个使用-notation的解决方案:

firstlast(Xs) :- phrase(([X],...,[X]), Xs). ... --> [] | [_], ... . 最后一个(Xs):- 短语(([X],…,[X]),Xs)。 ... --> [] | [_], ... .
我不确定
firstlast([1])
是否应该成功…

因为您只能对firstlast/1使用递归,所以解决方案如下所示:

firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .
其中一些将是关于基本情况的规则,而另一些则是“吃掉”问题的规则。 这个问题需要一次检查:比较第一个和最后一个元素。所以,在你的基本情况下,你应该只有这两个元素;你不需要别的东西。因此,解决方案将忽略所有其他元素

最后提示:您可以使用以下统一模式访问列表的前两个元素:

foo([H1,H2|T])
所以我得到了这个:

firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).
我的代码比较了最后一个和第一个元素,但递归是错误的:/

如上所述,不允许列表中有一个元素成功。
尽管im只允许使用谓词“firstlast”。

Xs=[f,Xs],firstlast(Xs)。
成功。这是故意的吗?@false我刚刚在SWI中尝试了这个,我得到了
false
回复,我是不是遗漏了什么?(注意:我编辑了我的答案,第一行有一个输入错误-它说的是
last(X,list)
,而不是
last(X,list)
first(H,H)。
必须删除。如果你把这个代码添加到问题本身,而不是作为答案发布,那么这个代码会更加明显。通过单击
edit
链接,您始终可以编辑您的问题。