如何判断元素是否属于Prolog中的列表?

如何判断元素是否属于Prolog中的列表?,prolog,Prolog,我有一个简单的程序来检查X元素是否属于列表: member2(X, [X|_]). member2(X,[_|T]):- member2(X,T). 我试图以扩展的形式编写它(因为在前面的方式中,行为并不那么清楚)。所以我用下面的方式写: member2(X, [X|_]). member2(X,Y):- Y = [_|T], member2(X,T). 因此,其含义更加明确: 我有一个表示基本情况的事实(如果X元素位于列表的头部,则它属于列表) 规则规定我必须

我有一个简单的程序来检查
X
元素是否属于列表:

member2(X, [X|_]).
member2(X,[_|T]):- member2(X,T).
我试图以扩展的形式编写它(因为在前面的方式中,行为并不那么清楚)。所以我用下面的方式写:

member2(X, [X|_]).
member2(X,Y):- Y = [_|T],
               member2(X,T).
因此,其含义更加明确:

我有一个表示基本情况的事实(如果
X
元素位于列表的头部,则它属于列表)

规则规定我必须证明两件事:

1)
Y=[\u124; T]
。这是正确的,因为匿名变量
\uu
与任何东西都是统一的

2) 它递归地搜索尾部列表中的元素
X


好的,我认为我的推理是正确的,但是这个程序的第二个版本不起作用!我想问题可能出在
Y=[\u124; T]
部分

我想教科书上关于检查成员的例子是:

member_check(X, [X|Tail]). % or [X|_] to avoid the warning
member_check(X, [Y|Tail]) :- X \= Y, member_check(X, Tail).

哪一种可能比您的第二次尝试更清晰?

您的程序在两种形式下都很好。这里是另一种(重新)写它的方式


这个程序在SWI-PL上似乎和我预期的一样工作,具体出了什么问题?你收到错误消息了吗?好的…谢谢…只有一件事…在这个例子中,X统一为Y…这意味着X变量包含[Y | Ys]列表的头字符?Tnx…我今天发布了另一个问题…我快疯了…如果你能帮我。。。
member2(X, [Y|Ys]) :-
    X = Y ; member2(X, Ys).