所以我找到了一种从stackoverflow解决它的方法,它涉及到以下答案:
last(X,Y) :-
append(_,[X],Y).
但我实际上无法理解其实际工作原理。 如果有人可以帮助我,那将真的很有帮助。谢谢。
所以我找到了一种从stackoverflow解决它的方法,它涉及到以下答案:
last(X,Y) :-
append(_,[X],Y).
但我实际上无法理解其实际工作原理。 如果有人可以帮助我,那将真的很有帮助。谢谢。
您可以在多个方向上使用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]