Prolog 将列表的第一个和最后一个元素与append进行比较

Prolog 将列表的第一个和最后一个元素与append进行比较,prolog,append,Prolog,Append,我有点像一个开场白,这就是为什么我在这里问,我在别的地方找不到答案 我尝试以另一种方式实现此功能: firstlast([H,H]). firstlast([F,_|T]):- firstlast([F|T]). 它基本上会发现在包含两个或更多元素的列表中,第一个和最后一个元素是否相同 现在我想用append来实现这个函数,所以不需要递归,只需要一个append调用 append([],U,U). append([H|T],U,[H|V]) :- append(T,U,V). 它应该如何工作

我有点像一个开场白,这就是为什么我在这里问,我在别的地方找不到答案

我尝试以另一种方式实现此功能:

firstlast([H,H]).
firstlast([F,_|T]):- firstlast([F|T]).
它基本上会发现在包含两个或更多元素的列表中,第一个和最后一个元素是否相同

现在我想用append来实现这个函数,所以不需要递归,只需要一个append调用

append([],U,U).
append([H|T],U,[H|V]) :- append(T,U,V).
它应该如何工作的示例:

firslasta([1,2,3,4,1]).
true.

firstlasta([1,3,4,1,5]).
false-

firstlasta([2,5,2,3,6,2]).
true.

这方面的任何帮助都将非常有用:)。

使用惯用的Prolog很容易:

为了识别列表的第一个元素(Head,你知道),我们使用[Head |],其中下划线(一个匿名变量)表示未指定(无趣)的列表尾部

在长度为1的列表中,我们只有最后一个要识别的。然后将以一个元素开头的列表附加到一个包含1个元素的列表中:

firstlast(L) :- append([Elem|_], [Elem], L).

append包含三个列表<代码>附加(A、B、A+B)。您从未分配过中间列表。值得注意的是,
append/3
本身是通过递归完成的,因此我认为您使用它不会节省任何计算能力。你的第一个答案在我看来更优雅。