Как написать ограничение, включающее определенный параметр в clingo?
Я пытаюсь решить Google ASP Competition 2019: проблема назначения страхового рефери. Проблема описана по этой ссылке .
Существует жесткое ограничение: если рефери имеет тип предпочтения 0, то дело не будет назначено этому рефери. Я упростил задачу, включив в нее несколько переменных.
case(cid)
относится к делу с идентификатором случая cid.
ref(rid)
относится к рефери с идентификатором рефери.
pref(rid, type)
отдает предпочтение рефери «rid» и типу, который принимает значение от 0 до 3. Чем выше число, тем больше вероятность того, что дело будет принято.
В
ref(10, 3)
а также
ref(9, 2)
, большее предпочтение будет отдано
ref(10)
.
Я пробовал следующий код clingo:
ref(rid).
case(cid).
pref(rid, type).
assign(cid, rid) :- ref(rid), pref(rid, type), type != 0.
case(4).
ref(3).
ref(5).
pref(3, 0).
pref(5, 1).
#show assign/2.
Однако, когда я запускаю команду, она показывает удовлетворительно, но выводит только это
assign(cid, rid)
Что я делаю не так?
1 ответ
В clingo переменные начинаются с заглавной буквы и являются «действительными» только в рамках правила. Итак, я предполагаю, что вам нужен следующий код:
assign(Rcid, Rrid) :- case(Rcid), ref(Rrid), pref(Rrid, Rtype), Rtype != 0.
case(4).
ref(3). ref(5).
pref(3, 0). pref(5, 1).
#show assign/2.
выход:
Solving...
Answer: 1
assign(4,5)
SATISFIABLE
Обратите внимание, что только переименование констант в имена переменных приведет к сообщению об ошибке, вы должны добавить
case(Rcid)
также в свод правил. Имена переменных были выбраны свободно, вы можете использовать любое имя переменной, если оно начинается с заглавной буквы.