Исключение квантификатора - дополнительные вопросы

Большое спасибо Джошу и Леонардо за ответы на предыдущий вопрос.

У меня еще несколько вопросов.

‹1> Рассмотрим другой пример.

(exists k) i * k > = 4 and k > 1.

У этого есть простое решение i> 0. (как для Int, так и для Real случая)

Однако, когда я попытался подписаться,

(declare-const i Int)
(assert (exists ((k Int)) (and (>= (* i k)  4) (> k 1))))
(apply (using-params qe :qe-nonlinear true))

Z3 Не удалось исключить здесь квантификатор.

Однако в реальном случае это могло исключить. (когда i и k оба действительные числа) Сложнее ли исключение квантификатора для целых чисел?

‹2> Я использую Z3 C API в своей системе. Я добавляю некоторые нелинейные ограничения для целых чисел с кванторами в моей системе. Z3 в настоящее время проверяет выполнимость и дает мне правильную модель, когда система удовлетворительна.

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

Я думал, что z3 автоматически исключает квантификатор перед проверкой выполнимости. Но поскольку он не мог этого сделать в случае 1 выше, теперь я думаю, что он обычно находит модель без исключения квантификатора. Я прав?

В настоящее время z3 может разрешить ограничения в моей системе. Но это может дать сбой в сложных системах. В таком случае, стоит ли выполнить исключение квантора каким-либо другим методом без z3 и добавить ограничения к z3 позже?

‹3> Я могу подумать о добавлении в мою систему реальных нелинейных ограничений вместо целочисленных нелинейных ограничений. В таком случае, как я могу заставить z3 выполнять исключение квантификатора с помощью C-API?

‹4> Наконец, неплохо ли заставить z3 выполнять исключение квантификатора? Или он обычно находит модель более разумно, не выполняя исключения квантификатора?

Спасибо.


z3
person Kaustubh Nimkar    schedule 03.05.2012    source источник


Ответы (1)


‹1> Теория нелинейной целочисленной арифметики не допускает исключения кванторов (qe). Более того, неразрешима проблема решения для нелинейной целочисленной арифметики.

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

‹2> Исключение квантификатора не включено по умолчанию. Пользователь должен запросить это. Z3 может находить модели для выполнимых формул, даже если исключение квантора не разрешено. Он использует метод, называемый созданием квантификатора на основе модели (MBQI). В интерактивном руководстве по Z3 есть несколько примеров, описывающих возможности и ограничения этого метода.

‹3> Вы должны включить его при создании объекта Z3_context. Любая опция, заданная в командной строке, может быть предоставлена ​​во время создания объекта Z3_context. Вот пример, который позволяет построить модель и исключить квантор:

Z3_config cfg = Z3_mk_config();
Z3_context ctx;
Z3_set_param_value(cfg, "MODEL", "true");
Z3_set_param_value(cfg, "ELIM_QUANTIFIERS", "true");
Z3_set_param_value(cfg, "ELIM_NLARITH_QUANTIFIERS", "true");
ctx = mk_context_custom(cfg, throw_z3_error);
Z3_del_config(cfg);

После этого ctx указывает на объект контекста Z3, который поддерживает построение модели и исключение квантификатора.

‹4> Модуль MBQI не завершен даже для фрагмента линейной арифметики. Онлайн-руководство по Z3 описывает завершенные фрагменты. Модуль MBQI - хороший вариант для задач, содержащих неинтерпретируемые функции. Если в ваших задачах используется только арифметика, то обычно лучше и эффективнее устранение квантора. При этом несколько проблем можно быстро решить с помощью MBQI.

person Leonardo de Moura    schedule 03.05.2012
comment
Думаю, в первой строке вы имеете в виду, что нелинейная целочисленная арифметика не допускает исключения квантора. - person pad; 03.05.2012
comment
Большое спасибо Леонардо. Только один вопрос - можете ли вы объяснить, почему теория нелинейной целочисленной арифметики не допускает исключения кванторов (qe)? - person Kaustubh Nimkar; 08.05.2012
comment
Это следствие первой теоремы Гёделя о неполноте. Если вы поищете первую теорему Гёделя о неполноте, вы найдете несколько хороших (неформальных и формальных) представлений этого результата. - person Leonardo de Moura; 08.05.2012
comment
Еще хуже. Выполнимость теории нелинейной (читай: полиномиальной) целочисленной арифметики неразрешима; то есть доказано (посредством серии результатов Дэвиса, Патнэма, Робинсона и Матиясевича), что ни один алгоритм не может сказать, учитывая многомерный многочлен, есть ли у него целые нули. Таким образом, даже не требуется чередование кванторов; единый блок экзистенциальных кванторов делает его неразрешимым. - person David Monniaux; 15.07.2013
comment
Дэвид (aka monniaux) прав, проблема неразрешима даже без кванторов. В следующем посте по теме есть дополнительная информация: stackoverflow.com/questions/13898175/ - person Leonardo de Moura; 15.07.2013