{assign(N,C) : color(C)} = 1 :- node(N).
Это означает «выбрать ровно один цвет для каждого узла». Или, точнее, для
каждый узел n
, выберите один цвет c
, так что assign(n, c)
станет истинным.
Чтобы лучше это понять, нам нужно углубиться в семантику ASP.
Здесь N находится за пределами ограничения мощности, поэтому его можно просмотреть
в качестве «глобальной переменной» в этом правиле. Правило по сути является сокращением для:
{assign(sa,C) : color(C)} = 1 :- node(sa).
{assign(wa,C) : color(C)} = 1 :- node(wa).
{assign(nt,C) : color(C)} = 1 :- node(nt).
{assign(q,C) : color(C)} = 1 :- node(q).
{assign(nsw,C) : color(C)} = 1 :- node(nsw).
{assign(v,C) : color(C)} = 1 :- node(v).
{assign(t,C) : color(C)} = 1 :- node(t).
Теперь этот набор {assign(sa,C) : color(C)}
это просто сокращение для
{assign(sa,r), assign(sa,g), assign(sa,b)}
.
Теперь {assign(sa,r), assign(sa,g), assign(sa,b)}=1
грубо говоря, означает выбрать один элемент из набора {assign(sa,r), assign(sa,g), assign(sa,b)}
.
Если вы посмотрите руководство по клинго, общий синтаксис
{assign(sa,r), assign(sa,g), assign(sa,b)} rel EXPR
, где rel
- арифметическое отношение, а EXPR
- некоторое выражение.