2014-10-20 101 views
2

我有一個列表,列出清單:序言 - 在列表的列表清單元素

A = [1,2,4,5] 
L = [[1,2,5],[3,4,5]] 

如果A包含相同的元素列表中的一個,我希望它返回true。由於A包含與L([1,2,5])中的第一個列表相同的元素(1,2,5),因此即使A中有一個元素不在L中的第一個列表中,它也應該返回true 。

p(X):- findall(Y, (member(Y,X), \+ have_common_element(X,Y)), [_]). 
have_common_element(A,B):- member(X,A), memberchk(X,B). 

但是下面的查詢將返回false:

p([[[1,2,5],[3,4,5]],[1,2,4,5]]). 

我明白

我用一對夫婦在a similar question答案提供的謂詞,以解決這一嘗試這是因爲A(4)中有一個元素不在L的第一個列表中,儘管我是難以弄清楚如何擴展謂詞以使查詢返回true。

是否可以擴展這些謂詞,以便在包含額外(和非相互)元素時返回true?

+0

我的錯誤,所有的固定! – Alpine 2014-10-20 13:35:24

回答

2

你想說什麼似乎是:

p(A, Ess) :- 
    member(Es, Ess), % there is a list Es in Ess 
    maplist(A+\E^member(E,A), Es). % for all E in Es: member(E,A). 

或不lambda表達式:

p(A, Ess) :- 
    member(Es, Ess), 
    maplist(list_member(A), Es). 

list_member(L, E) :- 
    member(E, L). 
+1

對不起,對於遲到的響應,但我嘗試使用非lambda版本p([8,9],[[1,2,3],[3,4,5]]來查看它是否會返回false,然而,由於一些奇怪的原因,它是真實的。你可能知道爲什麼嗎? – Alpine 2014-10-21 09:46:41

+1

@Alpine:你得到了一個警告:有一個'.'代替'',' – false 2014-10-21 10:47:23

+1

啊,哎呀,謝謝! – Alpine 2014-10-21 11:05:24