0

在 prolog 中,我们可以使用否定来选择元组中的最大值,例如:p(X),而不是 (p(Y), Y > X)。% 在 Prolog 中工作,但在 Clingo 中不工作

如何使用 Clingo 表达式获得相似的规则(如果没有比 A 更大的数字,则 A 为最大值)。谢谢。

4

2 回答 2

1

我想用两种替代解决方案扩展先前的答案。我没有对第一个答案进行任何性能比较。

  • 聚合的使用,请参阅Clingo 用户指南

    最大(X):- X = #max { Y:p(Y)}。

  • 猜测和检查方法。这个想法是我们猜测最大值,然后检查它是否确实是最大值。请注意,算术表达式可以写在规则的头部。

    1 { 最大(X) : p(X) } 1。

    M >= X :- p(X), max(M)。

于 2020-05-05T16:50:29.407 回答
0

以下规则可以表示如果没有比 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).

于 2020-05-05T06:21:33.057 回答