首页 文章

Prolog - 列出列表列表中的元素

提问于
浏览
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 .

我尝试使用a similar question答案中提供的几个谓词来解决这个问题:

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(4)中有一个元素不在L的第一个列表中,尽管我很难弄清楚如何扩展谓词以使查询返回true .

是否可以扩展这些谓词,以便即使包含附加(和非相互)元素也会返回true?

1 回答

  • 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).
    

    或没有lambdas:

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

相关问题