2013-11-02 119 views
3

嵌套列表我要檢查,如果x是嵌套列表的成員的成員,使檢查,如果事情是在序言

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

回報TrueFalse如果沒有x。這可能以某種方式嗎?

回答

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 
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. 
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 
相關問題