怎么说如果一个元素属于Prolog中的列表?

时间:2012-12-19 23:06:13

标签: prolog

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

member2(X, [X|_]).
member2(X,[_|T]):- member2(X,T).

我正在尝试以扩展形式编写它(因为以前的方式行为不是那么清楚)。所以我用以下方式写它:

member2(X, [X|_]).
member2(X,Y):- Y = [_|T],
               member2(X,T).

所以意思更明确:

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

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

1)Y = [_|T]。这是正确的,因为匿名变量_与任何东西统一。

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

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

2 个答案:

答案 0 :(得分:1)

你的节目很好,两种形式。这是另一种(重新)写它的方法

member2(X, [Y|Ys]) :-
    X = Y ; member2(X, Ys).

答案 1 :(得分:0)

我想成员的检查的教科书示例是:

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

哪个可能比你第二次尝试更清楚?