(@ twinterer уже дал объяснение, мой ответ пытается принять его под другим углом)
Когда вы вводите запрос в Пролог, вы получаете ответ .Часто ответ содержит решение , иногда оно содержит несколько решений, а иногда вообще не содержит решения.Довольно часто эти два понятия перепутаны.Давайте рассмотрим примеры с 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
.
Более эффективные алгоритмы согласованности часто очень сложны.
ВВ общем случае поддержание глобальной согласованности является неразрешимой проблемой.