Как написать ограничение, включающее определенный параметр в 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)также в свод правил. Имена переменных были выбраны свободно, вы можете использовать любое имя переменной, если оно начинается с заглавной буквы.

Другие вопросы по тегам