关于使用追加查找列表的最后一个元素的序言

所以我找到了一种从stackoverflow解决它的方法,它涉及到以下答案:

last(X,Y) :-
    append(_,[X],Y).

但我实际上无法理解其实际工作原理。 如果有人可以帮助我,那将真的很有帮助。谢谢。

li3029 回答:关于使用追加查找列表的最后一个元素的序言

您可以在多个方向上使用append/3 [swi-doc]。例如,您可以传递一个列表,然后查看如何将两个列表追加到该列表。例如:

?- append(X,Y,[1,4,2,5]).
X = [],Y = [1,5] ;
X = [1],Y = [4,5] ;
X = [1,4],Y = [2,2],Y = [5] ;
X = [1,5],Y = [] ;
false.

如您所见,有五种方法来构造它。例如,使用X = []Y = [1,5],或者使用X = [1]Y = [4,5]

因此,我们将谓词last/2定义为:

last(X,L) :-
    append(_,[X],L).

注意将[X]作为第二个参数。因此,我们在这里指定第二个列表应该是 singleton 列表(一个确切地一个元素的列表)。空列表或包含两个或多个元素的列表将[X]统一。

append/3谓词的目的是使第二个列表与示例中所见的候选者统一。但是只有第二个列表是单例列表时,它才会匹配,在这种情况下,X与最后一个元素统一。

,

请参阅 SWI-Prolog website 上的定义。

其中一个例子是:

?- append(X,[Last],[a,b,c]).
X = [a,b],Last = c.

这意味着 Last 是列表中的单个元素。

想想 X 将“Last”附加到列表末尾的命令式方式。然后,它变成了列表[a,c]。

因此,要定义最后一个,我们可以:

mylast(Xs,Last):-
  append(_,Xs). % doesn't care about the rest of the elements except the [Last]
本文链接:https://www.f2er.com/3094152.html

大家都在问