比较多个集合的基数并从最大集合的成员中获取特定值

Compare cardinality of multiple sets and get specific value from member of greatest set

我正在使用 clingo 解决 flood-it 问题。我使用谓词 frontier([CELL], [COLOR], [TIMESTEP]) 来跟踪与洪水相邻的所有单元格。边界集可能如下所示:

frontier(c(1,3),2,3) frontier(c(2,1),2,3) frontier(c(2,2),3,3) frontier(c(2,3),3,3) frontier(c(3,1),3,3) frontier(c(3,2),3,3) frontier(c(4,1),3,3)

我们可以将这个集合分成两个子集。每个颜色值分别为 2 或 3 的一种。我需要的基本上是两件事:

  1. 确定哪个子集更大,即是否有更多颜色值为 2 或 3 的单元格(顺便说一句,颜色的数量不固定,因此解决方案必须是通用的)
  2. 获取最大集合中某成员的颜色值

如何比较谓词逻辑中 n (n>=2) 个集合的基数?

提前致谢!

我找到了一个比一般领域(即 clingo)更具体的答案。

我最初做的是计算颜色为 C 的单元格的数量:

frontier_subset_size(C,N) :- color(C), N = #count{ X : frontier(X,C) }.

然后我使用 #max 聚合过滤最大的集合:

max_subset_color(C) :- frontier_subset_size(C,N), N = #max{ M : frontier_subset_size(_,M) }.

对于这个特定问题,这可以正常工作。

但我想知道如何在纯谓词逻辑中做到这一点。