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

5

例子:

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

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

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

exc...

问题在于我只被允许使用带有谓词"firstlast"的递归?我真的尝试过打破这个限制,但似乎无法检查/比较最后一个元素和第一个元素。
有什么提示吗?
4个回答

3

更新: 由于不允许使用其他谓词,因此请尝试以下方法:

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

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


Xs = [f,Xs], firstlast(Xs). 成功了。这是预期的吗? - false
我刚在SWI中尝试了一下,结果返回了 false,我有什么遗漏吗?(注意:我编辑了我的答案,第一行有一个错别字 - 它说的是 last(X,list) 而不是 last(X,List) - Sergey Kalinichenko
必须删除 first(H, H). - false

2
您可能的意思是第一个和最后一个元素相同。以下是使用符号的解决方案:
firstlast(Xs) :-
    phrase(([X],...,[X]), Xs).
... --> [] | [_], ... .
我不确定firstlast([1])是否应该成功...

0

由于您只能使用firstlast/1进行递归,因此解决方案将如下:

firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .

其中一些规则将涉及基本情况,而另一些规则将“消耗”问题。

这个问题需要进行一次检查:比较第一个和最后一个元素。因此,在您的基本情况中,您应该只有这两个元素;您不需要其他任何东西。因此,解决方案将忽略所有其他元素。

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

foo([H1,H2|T])

0

到目前为止我得到了这个:

firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).

我的代码比较最后一个和第一个元素,但递归算法有问题 :/

如上所述,不应允许在列表中只有一个元素的情况下成功。 尽管我只被允许使用谓词“firstlast”。


2
如果您将此代码添加到问题本身而不是作为答案发布,它将更加可见。您可以通过单击“编辑”链接来随时编辑您的问题。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接