检查某些东西是否是Prolog中嵌套列表中的成员

时间:2013-11-02 23:21:20

标签: list prolog nested member

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

member(x,[a,b,[c,d],[e,[f,g],[x,i]]])
如果没有True

会返回Falsex。这有可能吗?

3 个答案:

答案 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