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

时间:2018-11-22 20:34:32

标签: logic planning answer-set-programming clingo

我正在使用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)个集合的基数?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我找到的答案比一般的域(即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) }.

这可以解决此特定问题。

但是我想知道如何用纯谓词逻辑来做到这一点。