我有这个简单的程序来检查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]
部分
答案 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).
哪个可能比你第二次尝试更清楚?