2

我有一个简单的程序来检查一个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]部分

4

2 回答 2

1

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

member2(X, [Y|Ys]) :-
    X = Y ; member2(X, Ys).
于 2012-12-20T08:18:50.673 回答
0

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

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

这可能比你的第二次尝试更清楚?

于 2012-12-20T07:27:16.937 回答