例子:
firstlast([1,2,3,4,1]).
true;
firstlast([1,2,3,4]).
false;
firstlast([5,10,4,3]).
false;
exc...
问题是我只允许对谓词“firstlast”使用递归。? 我真的试图打破这一点,但我似乎无法检查/比较最后一个元素与第一个元素。
有什么提示吗?
更新:由于您不允许使用其他谓词,请尝试以下操作:
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).
第一个谓词处理基本情况,第二个谓词删除三个或更多项目列表中的第二个元素,并向下递归。
You probably mean that the first and last element are the same. Here is a solution using dcg-notation:
firstlast(Xs) :- phrase(([X],...,[X]), Xs). ... --> [] | [_], ... .
I am not sure whether firstlast([1])
should succeed or not ...
好吧,因为您只能使用 firstlast/1 的递归,所以解决方案将如下所示:
firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .
其中一些将是关于基本案例的规则,其中一些将是“蚕食”问题的规则。这个问题需要一个检查:比较第一个和最后一个元素。所以,在你的基本情况下,你应该只有这两个元素;你不需要其他任何东西。所以解决方案将忽略所有其他元素
最后提示:您可以使用以下统一模式访问列表的前 2 个元素:
foo([H1,H2|T])
太公平了,我得到了这个:
firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).
我的代码比较了最后一个元素和第一个元素,但递归是错误的:/
如上所述,不应允许列表中的一个元素成功。虽然我只允许使用谓词“firstlast”。