为什么这些规则有效? (在prolog中查找列表中的最后一个元素)

时间:2018-06-17 16:19:29

标签: prolog

我试图理解以下一组规则,它们应该找到列表中的最后一个元素(例如my_list(X,[1,2,3])给出X=3)。

my_last(X,[X]).
my_last(X, [_|L]) :- my_last(X, L).

我理解第一个事实 - 如果X是其中唯一的元素,X是列表的最后一个元素,但第二个规则是如何工作的?作为一个prolog noob,这对我来说有点奇怪,我很想知道是否有一种直观的方式来插入它。 Ť

1 个答案:

答案 0 :(得分:2)

将Prolog谓词作为逻辑规则阅读。如果谓词有多个谓词子句,您可以将其视为“OR”:

my_last(X,[X]).
  

X是列表的最后一个元素[X]

my_last(X, [_|L]) :- my_last(X, L).
  如果 X是列表[_|L]的最后一个元素,则

X是列表L 的最后一个元素。

第二个子句是递归定义。所以它最终需要终止,递归调用与调用它的递归子句的头部不匹配。在这种情况下,L最终会变为[],并且将不再与[_|L]匹配。这很重要,否则,您将获得无限递归。