比较多个集合的基数并从最大集合的成员中获取特定值
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 的一种。我需要的基本上是两件事:
- 确定哪个子集更大,即是否有更多颜色值为 2 或 3 的单元格(顺便说一句,颜色的数量不固定,因此解决方案必须是通用的)
- 获取最大集合中某成员的颜色值
如何比较谓词逻辑中 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) }.
对于这个特定问题,这可以正常工作。
但我想知道如何在纯谓词逻辑中做到这一点。
我正在使用 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 的一种。我需要的基本上是两件事:
- 确定哪个子集更大,即是否有更多颜色值为 2 或 3 的单元格(顺便说一句,颜色的数量不固定,因此解决方案必须是通用的)
- 获取最大集合中某成员的颜色值
如何比较谓词逻辑中 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) }.
对于这个特定问题,这可以正常工作。
但我想知道如何在纯谓词逻辑中做到这一点。