CLP(FD) вариабельные домены и размножение

В моем курсе Prolog в прошлом семестре я немного отстал примерно во время введения CLP. Теперь я пытаюсь наверстать упущенное и попробовал свои силы на прошлом экзамене, который профессор давал всем студентам.

В частности, был такой вопрос:

Какова область определения переменной решения Z в CLP(FD) после следующего запроса:

?- X in 1..7, Y in -3..100, Y #> X, Z #\= 0, Z #= Y - X.

Мне кажется, что ответ должен быть

Z in 1..99

но когда я запустил его в своей установке SWI-Prolog для перепроверки, я получил

Z in -5.. -1\/1..99

который, по-видимому, основан на наивном сравнении максимального и минимального значений X и Y без учета связывающего их ограничения (Y #> X).

Я понимаю, что здесь нужно делать уступки осуществимости, и возвращаемые домены иногда будут менее ограничивающими, чем могли бы быть, но я удивлен, увидев, что это не работает на таком простом примере.

Мои вопросы

  1. Я предполагаю, что это связано с тем, как CLP решает распространять (или не распространять) различные внутренние ограничения, но я не понимаю, как он это делает — для меня это что-то вроде черного ящика. Как именно (или приблизительно) CLP распространяет свои ограничения?
  2. Есть ли какой-нибудь способ заставить CLP(FD) правильно применить ограничение, возможно, путем изменения порядка? Я уже пробовал добавлять дополнительные Y #> X в конце, но это не изменило ни один из доменов переменных.

person Drubbels    schedule 09.01.2020    source источник


Ответы (1)


Мне кажется, что ответ должен быть

Z in 1..99

Как вы можете быть настолько уверены, что вы правы? Это одно из приятных свойств ограничений: в этом легко убедиться:

?- X in 1..7, Y in -3..100, Y #> X, Z #\= 0, Z #= Y -X.
X in 1..7,
Z+X#=Y,
X#=<Y+ -1,
Z in -5.. -1\/1..99,
Y in 2..100.

?- X in 1..7, Y in -3..100, Y #> X, Z #\= 0, Z #= Y -X, Z #< 0.
false.

Хорошо, теперь я верю тому, что ты сказал.

Итак, вы обнаружили здесь непоследовательность, которая присутствует также в родном library(clpfd) SICStus, а также в library(clpz). Во-первых, обратите внимание, что данный ответ не был неправильным! Он сказал: Да, есть решения, если X in 1..7, Z+X#=Y, X#=<Y+ -1, Z in -5.. -1\/1..99, Y in 2..100. верно. Хелас, это неправда.

Так что этот ответ немного похож на юридический язык во многих страховых договорах, где говорится, что да, мы заплатим, при условии, что весь этот крошечный нечитаемый шрифт сохранится, но на самом деле вы можете заменить эту стену микротекста большим жирным false.

В общем, такие несоответствия неизбежны, поскольку CLP(FD)/CLP(Z) в том виде, в каком они определены в приведенных выше системах, позволяют формулировать неразрешимые проблемы. Таким образом, независимо от того, насколько развит ваш решатель ограничений, у нас есть гарантия, что всегда будут случаи, которые мы не сможем решить. Это научный, математический закон, гораздо более надежный, чем эмпирические законы, такие как гравитация или ограничение скорости.

Несоответствие здесь фактически является инженерным компромиссом. Пока никто не жалуется и не будет убедительного варианта использования, разработчики таких систем не увидят смысла улучшаться. В конце концов, такое улучшение может замедлить существующие варианты использования.

  1. Как именно (или приблизительно) CLP распространяет свои ограничения?

На самом деле, для любой проблемы реалистичного размера никто не знает. Но и это не обязательно. В случае CLP(FD) фундаментальным элементом являются домены, связанные с логическими переменными. Вы видите их как (in)/2 целей, таких как Z in -5.. -1\/1..99. Между ними связаны фактические ограничения. В вашем случае Y #> X и Z #= Y-X. Эти ограничения теперь видят только домены переменных и пытаются поддерживать согласованность между ними. В еще более грубом приближении домены видны как интервалы, таким образом, Z in -5 .. 99 вместо приведенного выше. Чего (большинство из них) не видят, так это других ограничений. В этом случае прямой связи между Y #> X и Z #= Y-X нет. Отсюда и нестыковка. Такие ограниченные проверки непротиворечивости гораздо проще реализовать, они довольно быстрые и часто превосходят более полные алгоритмы. С открытием лучших алгоритмов все меняется. Хорошим примером является all_distinct/1, который поддерживает согласованность между всеми переменными с помощью алгоритма Регина, тогда как all_different/1 поддерживает согласованность только между каждой парой переменных. Но в любом случае: эти вещи развиваются, и немного удивительно, что это экзаменационный вопрос.

  1. Есть ли способ заставить CLP(FD) правильно применять ограничение...?
?- X in 1..7, Y in -3..100, Y #> X, Z #\= 0, Z #= Y -X, clpfd:contracting([X,Y,Z]).
X in 1..7,
Z+X#=Y,
X#=<Y+ -1,
Z in 1..99,
Y in 2..100.

Но большинство проигнорируют эту проблему и просто добавят labeling([],[X,Y])

  1. Что такое домен Z?

Это неоднозначный вопрос. Дайте оба в качестве ответа.

person false    schedule 09.01.2020
comment
Спасибо. Подсказка 'clpfd:contracting([X,Y,Z])' пригодится мне в будущем. К сожалению, я пока не могу согласиться, потому что ответ на самом деле не охватывает вопрос 1 — «Как именно (или, если это не так, приблизительно) CLP распространяет свои ограничения?» - и я действительно хотел бы лучше понять этот момент. - person Drubbels; 10.01.2020
comment
Экзаменационный вопрос очень конкретно спрашивает: «Что такое домен [...]». Насколько я понимаю, вопрос предполагает, что студент знает, что CLP(FD) дойдет только до «Z». в -5.. -1\/1..99' и не найдет "Z в 1..99". Я хотел бы понять, как я мог это знать. - person Drubbels; 10.01.2020
comment
Кроме того, это не ограничение скорости... это ограничение гиперболического вращения. Физика = Веселье! И если вы его сломаете, я действительно думаю, что неразрешимые проблемы станут разрешимыми, потому что теперь вы можете создавать машины времени. Вычисления = Физика! Таким образом, вычисление = удовольствие! - person David Tonhofer; 10.01.2020
comment
Простите мою французскую опечатку. Чаще всего нет ограничений на сложность контракта, поэтому вам нужен только достаточно сложный текст - предпочтительно в зависимости от находящихся на рассмотрении постановлений ВТО. - person false; 10.01.2020
comment
ex falso quodlibet не является общепринятым аргументом в юридических вопросах. Вот почему те расширения Пролога, которые включают слишком много отрицаний, имеют трудности с принятием. И подумайте об этом: два произвольных предложения всегда будут связаны между собой либо a подразумевает b, либо b подразумевает a, либо и то, и другое. Вы можете принять это? - person false; 10.01.2020
comment
Вы можете принять это? Конечно, нет. EFQ — это не принцип реального мира, это в лучшем случае неприятный побочный эффект определенной логики. Сложность договора чаще всего не ограничена, поэтому нужен только достаточно сложный текст Вот почему у нас такая огромная иерархия судов. Кажется, что в эту подсистему вложена довольно большая человеческая деятельность. - person David Tonhofer; 10.01.2020