Prolog交叉的2个列表列表

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog交叉的2个列表列表相关的知识,希望对你有一定的参考价值。

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

列表1:

[[1,4],[1,6],[6,8],[8,10]]

列表2:

 [[], [10], [8], [8, 10], [6], [6, 10], [6, 8], [6, 8, 10]]

我想在list2中找到list1的所有项目相交的项目。解决方案是[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.

以上是关于Prolog交叉的2个列表列表的主要内容,如果未能解决你的问题,请参考以下文章

这个Prolog代码如何真正起作用 - 随机播放两个列表

Prolog 返回一个列表而不是几个可能的字符串

使用Prolog的CLPFD基于约束结果生成列表

Prolog - 如何返回每个元素只出现一次的列表?

Prolog - 在将每个值加倍后,从原始列表中创建元素的新列表?

Prolog列表列表获取所有元素