Ответ 1
Ваша формула является выполнимой, и Z3 не способен создать модель для такого вида формулы. Обратите внимание, что он должен будет генерировать интерпретацию для неинтерпретированного сорта Set
. Есть несколько альтернатив, которые вы можете рассмотреть.
1- Отключить модуль создания квантификатора (MBQI) на основе модели. BTW, все инструменты на основе Boogie (VCC, Dafny, Coral и т.д.) Делают это. Чтобы отключить модуль MBQI, мы должны использовать
(set-option :auto-config false)
(set-option :mbqi false)
Примечание: в ветке "незавершенное производство" опция :mbqi
была переименована в :smt.mbqi
.
Минусы: когда модуль MBQI отключен, Z3 обычно возвращает unknown
для выполнимых формул, содержащих квантификатор.
2- Кодировать наборы T как массивы от T до Boolean. Z3 поддерживает теорию расширенных массивов. Расширенная теория имеет два новых оператора: ((_ const T) a)
постоянные массивы, оператор отображения ((_ map f) a b)
. В этой статье описывается теория расширенных массивов и как ее кодировать, например, объединение и пересечение. На веб-сайте rise4fun есть примеры.
Это хорошая альтернатива, если это единственные кванторы в вашей проблеме, потому что проблема теперь в разрешимом фрагменте. С другой стороны, если у вас есть дополнительные количественные формулы, содержащие множества, то это, вероятно, будет работать плохо. Проблема в том, что модель, построенная по теории массивов, не знает о существовании дополнительных кванторов.
Например, как кодировать вышеуказанные операторы, используя const и map, см. ниже: http://rise4fun.com/Z3/DWYC
3- Представляем множества T как функции от T до Bool. Этот подход обычно хорошо работает, если у нас нет наборов множеств или неинтерпретируемых функций, которые принимают множества в качестве аргументов. в онлайн-учебнике Z3 есть пример (раздел Quantifiers).