两个列表的Prolog交集

两个列表的Prolog交集,prolog,intersection,Prolog,Intersection,我试图找到两个不同列表的交集。换句话说,找出列表1中的所有列表是否与列表2中的任何列表相交 清单1: [[1,4],[1,6],[6,8],[8,10]] 清单2: [[], [10], [8], [8, 10], [6], [6, 10], [6, 8], [6, 8, 10]] 我想在列表2中找到一个列表1中所有项目都相交的项目。 解决方案是[4,6,8] 我将如何做到这一点?一个非常简单的实现可以是以下内容 intersect(L, M, E) :- member(E, M)

我试图找到两个不同列表的交集。换句话说,找出列表1中的所有列表是否与列表2中的任何列表相交

清单1:

[[1,4],[1,6],[6,8],[8,10]]
清单2:

 [[], [10], [8], [8, 10], [6], [6, 10], [6, 8], [6, 8, 10]]
我想在列表2中找到一个列表1中所有项目都相交的项目。 解决方案是
[4,6,8]


我将如何做到这一点?

一个非常简单的实现可以是以下内容

intersect(L, M, E) :-
    member(E, M),
    maplist(intersect_(E), L).

intersect_(L, M) :-
    member(E, L),
    member(E, M).
示例查询:

?- intersect([[1,4],[1,6],[6,8],[8,10]], [[], [10], [8], [8, 10], [6], [6, 10], [6, 8], [6, 8, 10]], E).
false.

?- intersect([[1,4],[1,6],[6,8],[8,10]], [[], [10], [8], [8, 10], [6], [6, 10], [6, 8], [6, 8, 10], [4,6,8]], E).
E = [4, 6, 8] ;
E = [4, 6, 8] ;  % This succeeds twice because the list [6,8] has two ways of satisfying the predicate
false.

我不想检查它是否为真,而是要检查哪个“M”项为真。所以我相信会有3个参数,一个是解决方案,另2个是列表。另外,解释一下它是如何工作的,对以后的参考也会有帮助。@shanmalic修复了,但实际上是一样的。只需将
E
作为参数添加到
intersect