2014-10-20 62 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