Как определить условие ИЛИ в Clingo - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в Clin go.

Я хочу знать, как express выполнить условие ИЛИ внутри агрегата count.

Я пишу это правило.

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

Но круглые скобки не допускаются клиникой go. Как мне сформулировать это условие в клин go?

И какая разница, если я перенесу условие и напишу:

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

1 Ответ

0 голосов
/ 06 мая 2020

Вы можете сформулировать лексикографический порядок c с дополнительным предикатом. Дизъюнкцию можно красиво описать несколькими правилами с одной и той же головой. Вот возможный пример

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), так что землянин не знает, как заменить S1 атомом. Переменные внутри оператора count заключены в квадратные скобки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...