Prolog成员名单

Com*_*sNo 1 prolog

Prolog新手在这里谁想知道为什么这些规则不能自立,如果我想知道某些东西是否是列表的成员.

member(X, [X|_]).

member(X, [_|Y]) :- member(X,Y).
Run Code Online (Sandbox Code Playgroud)

如果我问以下规则:

member(will, [anna, eddie, pat, will, marjorie, donna]).
Run Code Online (Sandbox Code Playgroud)

我明白了,但如果我删除:

member(X, [X|_]).
Run Code Online (Sandbox Code Playgroud)

刚离开第二条规则,我就是假的.如果第二条规则指出"如果X是列表尾部的成员,则X是列表的成员",为什么会这样呢?

"will"是此列表尾部的成员.

而且,为什么可以

member(X, [X|_]).
Run Code Online (Sandbox Code Playgroud)

当X是列表的头部时(第二个规则不能)时,单独站立告诉我?

谢谢.

She*_*vic 5

如果您只有member(X, [X|_]).并执行此查询:member(will, [will,anna]).

你会得到true.因为根据你的规则,X将是列表的头部.

但是如果你只有那个规则并且你执行了member(anna, [will,anna]).,那么你就会变得虚假,因为anna不是你列表的头部.

让我们看看你的第二条规则.

您将程序创建为 member(X, [_|Y]) :- member(X,Y).

您执行查询 member(will, [anna, eddie, pat, will, marjorie, donna]).

这就是Prolog看到的:

拿出清单并移除头部.对列表的其余部分执行相同操作,直到尾部为空.

你知道false.因为列表中没有任何元素.

您的问题是您不检查X是否是您的列表的成员.您也可以将该规则重命名为removehead(X,[_|Y]):-removehead(X,Y).