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是列表的头部时(第二个规则不能)时,单独站立告诉我?
谢谢.
如果您只有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).