在 prolog 中,我们可以使用否定来选择元组中的最大值,例如:p(X),而不是 (p(Y), Y > X)。% 在 Prolog 中工作,但在 Clingo 中不工作
如何使用 Clingo 表达式获得相似的规则(如果没有比 A 更大的数字,则 A 为最大值)。谢谢。
在 prolog 中,我们可以使用否定来选择元组中的最大值,例如:p(X),而不是 (p(Y), Y > X)。% 在 Prolog 中工作,但在 Clingo 中不工作
如何使用 Clingo 表达式获得相似的规则(如果没有比 A 更大的数字,则 A 为最大值)。谢谢。
我想用两种替代解决方案扩展先前的答案。我没有对第一个答案进行任何性能比较。
聚合的使用,请参阅Clingo 用户指南
最大(X):- X = #max { Y:p(Y)}。
猜测和检查方法。这个想法是我们猜测最大值,然后检查它是否确实是最大值。请注意,算术表达式可以写在规则的头部。
1 { 最大(X) : p(X) } 1。
M >= X :- p(X), max(M)。
以下规则可以表示如果没有比 A 更大的数字,则 A 是最大值。
non_max(X) :- p(X), p(Y), Y > X.
max(X) :- p(X), not non_max(X).
基本上,您所代表的规则是具有通用量词的规则,即
∀b ∈ p(b),如果 a > b,则 a 为最大值。(1)
如果 a 是最大值,则 ∀b ∈ p(b),a > b。(2)
将 (2) 变换成它的对立面,我们有
如果 ∃b ∈ p(b),a < b,则 b 不是最大值 (3)
(3)的对应规则是 non_max(X) :- p(X), p(Y), Y > X.
由于 max 和 non_max 是互斥的,那么我们有
max(X) :- p(X), not non_max(X).