【问题标题】:Prolog intersection list of listsProlog列表的交集列表
【发布时间】:2018-04-24 19:07:59
【问题描述】:

我想在 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]]]

感谢您的帮助!

【问题讨论】:

  • 你通过认真思考问题,付出一些努力,最终尝试编写一个或多个谓词并调试它们来做到这一点。
  • 我玩过 maplist、ord_intersection 和 forall,但无法以某种方式将它们结合起来,让它做我想做的事。我是序言中的新手。
  • 也许你最好先寻找一种方法来获得两个简单列表的交集。接下来,您可以查找两行的交集,最后查找两个矩阵。
  • 有了两个辅助谓词,我们可以用一个单行来做到这一点。
  • 我被困在两行的交叉点。这是我尝试过的,但不起作用:ir([],[],_)。 ir([H|T], [H1|T1], Out) :- ord_intersection(H, H1, O), append(Out, O, O2), ir(T, T1, O2), Out = O2。

标签: list matrix prolog intersection


【解决方案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).

【讨论】:

  • 谢谢!这个答案对我很有帮助。
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多