我试图理解以下一组规则,它们应该找到列表中的最后一个元素(例如my_list(X,[1,2,3])
给出X=3
)。
my_last(X,[X]).
my_last(X, [_|L]) :- my_last(X, L).
我理解第一个事实 - 如果X是其中唯一的元素,X是列表的最后一个元素,但第二个规则是如何工作的?作为一个prolog noob,这对我来说有点奇怪,我很想知道是否有一种直观的方式来插入它。 Ť
答案 0 :(得分:2)
将Prolog谓词作为逻辑规则阅读。如果谓词有多个谓词子句,您可以将其视为“OR”:
my_last(X,[X]).
X
是列表的最后一个元素[X]
。
my_last(X, [_|L]) :- my_last(X, L).
如果X
是列表[_|L]
的最后一个元素,则
X
是列表L
的最后一个元素。
第二个子句是递归定义。所以它最终需要终止,递归调用与调用它的递归子句的头部不匹配。在这种情况下,L
最终会变为[]
,并且将不再与[_|L]
匹配。这很重要,否则,您将获得无限递归。