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

时间:2012-10-10 18:07:18

标签: list prolog dcg

示例:

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

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

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

exc...

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

任何提示?

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

您可能意味着第一个和最后一个元素是相同的。以下是使用的解决方案 - 符号:

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

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

我不确定firstlast([1])是否应该成功......

答案 2 :(得分:0)

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

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

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

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

foo([H1,H2|T])

答案 3 :(得分:0)

如此公平我得到了这个:

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

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

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