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