0

我是 Clingo 的新手。

我想知道如何在计数聚合中表达 OR 条件。

我正在写这条规则。

countPreviousSlots(C1, C2, TotalCount) :-
    firstLecture(C2, S2, G2, I2),
    TotalCount = #count{S1,G1,I1 : slot(S1, G1, I1, C1), (S1 < S2; (S1==S2, G1 < G2); (S1==S2, G1==G2, I1 < I2))},
    slot(_, _, _, _, C1).

但是 cligo 不承认圆括号。我必须如何在 clgo 中制定这种条件?

如果我移动条件并写下有什么区别:

countPreviousSlots(C1, C2, TotalCount) :-
    firstLecture(C2, S2, G2, I2),
    TotalCount = #count{S1,G1,I1 : slot(S1, G1, I1, C1)},
    slot(_, _, _, _, C1), (S1 < S2; (S1==S2, G1 < G2); (S1==S2, G1==G2, I1 < I2)).
4

1 回答 1

0

您可以使用进一步的谓词来制定字典顺序。析取可以用具有相同头部的多个规则很好地描述。这是一个可能的例子

num(1..2).

lexorder(X1, X2, Y1, Y2) :-
  num(X1),
  num(X2),
  num(Y1),
  num(Y2),
  X1 < Y1.

lexorder(X1, X2, Y1, Y2) :-
  num(X1),
  num(X2),
  num(Y1),
  num(Y2),
  X1 = Y1,
  X2 < Y2.

不同的是,你计算的方式不同。您在第一个版本 {...} 中创建的集合比第二个版本小,因为它的约束更少。此外,在第二个版本中,一些变量是无界的(S1),因此grounder 将不知道如何用原子替换S1。count 语句中的变量范围在括号之间。

于 2020-05-06T20:49:21.787 回答