我想检查x
是否是嵌套列表的成员,以便
member(x,[a,b,[c,d],[e,[f,g],[x,i]]])
如果没有True
,会返回False
和x
。这有可能吗?
答案 0 :(得分:4)
通过添加一个检查项是否是第一个元素成员的子句,简单地扩展普通的递归member
定义:
member(X, [X|_]). %X is first element
member(X, [L|_]) :- member(X, L). %X is member of first element
member(X, [_|T]) :- member(X, T). %X is member of tail
答案 1 :(得分:2)
您还可以使用flatten/2将所有元素放到同一级别,然后使用普通成员:
?- flatten([a,b,[c,d],[e,[f,g],[x,i]]],Xs), member(x,Xs).
Xs = [a, b, c, d, e, f, g, x, i] ;
false.
并且如果不包含x:
?- flatten([a,b,[c,d],[e,[f,g],[y,i]]],Xs), member(x,Xs).
false.
答案 2 :(得分:0)
通过这个,您可以在一个简单的列表中找到该成员。 (_) - >单身变量
//Base Case
member(X, [X | _ ]).
member(X, [ _ | T]) :- member(X, T).
通过这个,您可以使用简单列表的定义在嵌套列表中找到该成员:
nestedListMember(X, [H | T]) :-
member(X,H);
nestedListMember(X,T). %Recursive call looking in the tail
nestedListMember(X,[T]) :-
nestedListMember(X,T). %You look for all the subsequent cases