2017-11-11 276 views
0

我想在prolog中创建列表列表的交集。 (矩阵,列表为单元格)Prolog列表交集列表

我只能处理这种情况,行数和列数相同(矩形)。这些列表是有序的,并且不包含任何重复的元素(它们是ord_sets)。

我该怎么做?

举例:(3行3列)

A: 
[[[1,2],[3,2,1],[3,4,5]], 
[[1,2],[3,2,1],[3,4,5]], 
[[1,2],[3,2,1],[3,4,5]]] 
B: 
[[[1],[3,2,1],[3,4,5]], 
[[1,2],[2,1],[3,4]], 
[[1,2],[3,2,1],[3,9,10,4,5]]] 
C: 
[[[1],[3,2,1],[3,4,5]], 
[[1,2],[2,1],[3,4]], 
[[1,2],[3,2,1],[3,4,5]]] 

感谢您的帮助!

+0

通过真正考虑问题并付出一些努力,并最终尝试编写一个或多个谓词并对其进行调试,可以做到这一点。 –

+0

我曾经玩过maplist,ord_intersection和forall,但无法以某种方式将它们组合起来,它按照我的意愿进行了操作。我在序言中很新。 – Falcon

+0

也许你最好先找一种方法来获得两个简单列表的交集。接下来,您可以查看两行的交集,最后找到两个矩阵。 –

回答

1

大多数Prolog解释器已经有一个谓词来计算两个列表之间的交集:intersection/3。例如:

?- intersection([3,2,1], [3,9,10,4,5], R). 
R = [3]. 

我们可以使用maplist/3来处理这些名单的一整行:

?- maplist(intersection, [[1,2],[3,2,1],[3,4,5]], [[1],[3,2,1],[3,4,5]], C). 
C = [[1], [3, 2, 1], [3, 4, 5]]. 

,并通过使用另一个maplist/3我们处理矩阵:

?- maplist(maplist(intersection),[[[1,2],[3,2,1],[3,4,5]], [[1,2],[3,2,1],[3,4,5]], [[1,2],[3,2,1],[3,4,5]]], [[[1],[3,2,1],[3,4,5]],[[1,2],[2,1],[3,4]],[[1,2],[3,2,1],[3,9,10,4,5]]], C). 
C = [[[1], [3, 2, 1], [3, 4, 5]], [[1, 2], [2, 1], [3, 4]], [[1, 2], [3, 2, 1], [3, 4, 5]]]. 

,所以我们可以做与处理:

intersect_matrix(A, B, C) :- 
    maplist(maplist(intersection), A, B, C). 
+0

谢谢!这个答案对我很有帮助。 – Falcon