我想在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 :(得分: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).