我正在尝试加深对 Prolog 以及它如何处理统一的理解。在本例中,它如何处理与列表的统一。
这是我的知识库;
member(X, [X|_]).
member(X, [_|T]):- member(X, T).
如果我正确理解了这个过程。如果 member(X, [X|_])
不为 true,则进入递归规则,并且如果 X
在列表 T
中>,则[_|T]
与T
统一。
那么我的递归谓词中的匿名变量会发生什么情况?它会被丢弃吗?我很难理解列表的确切统一过程,因为 [_|T]
是两个变量,而不是一个。我只是想弄清楚统一过程如何与列表精确配合。
最佳答案
假设_
是Y
member(X, [Y|T]):- member(X, T).
那么无论Y
,这都是True
。现在您正在“返回”member(X, T)
。换句话说,您正在丢弃 Y
并“返回”member(X, T)。
_
意味着,无论它是什么,忽略该变量。
The _ is just like any other variable, except that each one you see is treated as a different variable and Prolog won't show you what it unifies with. There's no special behavior there; if it confuses you about the behavior, just invent a completely new variable and put it in there to see what it does.
在您的情况下,您的函数检查列表中是否存在给定元素,因此,您获取列表的第一个元素,检查是否相等,如果不相等,则丢弃该元素并继续。
关于Prolog 和列表统一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28154749/