5

例子:

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

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

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

exc...

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

有什么提示吗?

4

4 回答 4

3

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

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

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

于 2012-10-10T18:13:29.780 回答
2

You probably mean that the first and last element are the same. Here is a solution using -notation:

firstlast(Xs) :-
    phrase(([X],...,[X]), Xs).

... --> [] | [_], ... .

I am not sure whether firstlast([1]) should succeed or not ...

于 2012-10-10T18:15:28.210 回答
0

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

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

其中一些将是关于基本案例的规则,其中一些将是“蚕食”问题的规则。这个问题需要一个检查:比较第一个和最后一个元素。所以,在你的基本情况下,你应该只有这两个元素;你不需要其他任何东西。所以解决方案将忽略所有其他元素

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

foo([H1,H2|T])
于 2012-10-10T18:18:06.980 回答
0

太公平了,我得到了这个:

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

我的代码比较了最后一个元素和第一个元素,但递归是错误的:/

如上所述,不应允许列表中的一个元素成功。虽然我只允许使用谓词“firstlast”。

于 2012-10-10T18:32:39.950 回答