(@twinterer уже дал объяснение, мой ответ пытается взять его с другого ракурса)
Когда вы вводите запрос в Prolog, вы получаете ответ. Часто ответ содержит решение, иногда содержит несколько решений, а иногда вообще не содержит никакого решения. Довольно часто эти два понятия путают. Давайте посмотрим на примеры с GNU Prolog:
| ?- length(Vs,3), fd_domain_bool(Vs).
Vs = [_#0(0..1),_#19(0..1),_#38(0..1)]
yes
Здесь у нас есть ответ, который содержит 8 решений. Это:
| ?- length(Vs,3), fd_domain_bool(Vs), fd_labeling(Vs).
Vs = [0,0,0] ? ;
Vs = [0,0,1] ? ;
...
Vs = [1,1,1]
yes
А теперь другой запрос. Это пример, на который ссылается @twinterer.
| ?- length(Vs,3), fd_domain_bool(Vs), fd_all_different(Vs).
Vs = [_#0(0..1),_#19(0..1),_#38(0..1)]
yes
Ответ выглядит так же, как и раньше. Однако он больше не содержит решения.
| ?- length(Vs,3), fd_domain_bool(Vs), fd_all_different(Vs), fd_labeling(Vs).
no
В идеале в таком случае верхний уровень сказал бы не «да», а «может быть». Фактически, CLP(R), одна из самых первых систем ограничений, сделала это.
Еще один способ сделать это немного менее загадочным — показать фактические задействованные ограничения. SWI делает это:
?- length(Vs,3), Vs ins 0..1, all_different(Vs).
Vs = [_G565,_G568,_G571],
_G565 in 0..1,
all_different([_G565,_G568,_G571]),
_G568 in 0..1,
_G571 in 0..1.
?- length(Vs,3), Vs ins 0..1, all_different(Vs), labeling([], Vs).
false.
Таким образом, SWI показывает вам все ограничения, которые должны быть соблюдены, чтобы получить конкретное решение. Прочтите ответ SWI так: Да, решение есть, если все это мелким шрифтом правда! Увы, мелкий шрифт неверен.
И еще один способ решить эту проблему — получить реализацию all_different/1
с более высокой согласованностью. Но это работает только в конкретных случаях.
?- length(Vs,3), Vs ins 0..1, all_distinct(Vs).
false.
В общем случае вы не можете ожидать, что система будет поддерживать глобальную согласованность. Причины:
Поддержание последовательности может быть очень дорогим. Зачастую такие решения лучше делегировать маркировке. На самом деле простой all_different/1
часто быстрее, чем all_distinct/1
.
Алгоритмы лучшей согласованности часто очень сложны.
В общем случае сохранение глобальной согласованности — неразрешимая проблема.
person
false
schedule
07.11.2011