Prolog 和列表统一

标签 prolog unification prolog-anonymous-variable

我正在尝试加深对 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/

相关文章:

prolog - 如何从序言中的两个列表创建原子对列表?

macros - 在 SWI-Prolog 中编写宏

prolog - 这个序言排序程序溢出堆栈仅仅是因为它的复杂性——还是因为它是错误的?

prolog - 谓词 'append/3' 如何与 Prolog 中的匿名变量一起使用?

list - 序言列表高原

algorithm - 什么是最优的 "most general unifier"算法?

haskell - 为什么 "map (filter fst)"的类型是 "[[(Bool, a)]] -> [[(Bool, a)]]"?

list - 在Prolog中不统一删除列表的所有成员

prolog - 一阶逻辑 Prolog 匿名变量