如何在 Clingo 中定义 OR 条件

How to define OR condition in Clingo

我是 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).

但是 clingo 不接受圆括号。我必须如何在 clingo 中制定此条件?

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

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)).

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

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 语句中的变量在括号内。