List 检查某物是否是Prolog中嵌套列表中的成员

List 检查某物是否是Prolog中嵌套列表中的成员,list,prolog,nested,member,List,Prolog,Nested,Member,我想检查x是否是嵌套列表的成员,以便 member(x,[a,b,[c,d],[e,[f,g],[x,i]]]) 返回True,如果没有x,则返回False。这有可能吗 只需通过添加检查项是否为第一个元素的成员的子句来扩展正常的递归成员定义: member(X, [X|_]). %X is first element member(X, [L|_]) :- member(X, L). %X is member of first element member(X,

我想检查
x
是否是嵌套列表的成员,以便

member(x,[a,b,[c,d],[e,[f,g],[x,i]]])

返回
True
,如果没有
x
,则返回
False
。这有可能吗

只需通过添加检查项是否为第一个元素的成员的子句来扩展正常的递归
成员定义:

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
您还可以使用将所有元素置于同一级别,然后使用普通成员:

?- 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.

这样,您可以在一个简单的列表中找到该成员。(824;)->Singleton变量

//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