печать формул внутреннего решателя в z3

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

1 ответов


инструмент командной строки Z3 не имеет такой опции. Кроме того, Z3 содержит несколько решателей и этапов предварительной обработки. Непонятно, какой шаг будет Вам полезен. Исходный код Z3 доступен по адресуhttps://github.com/Z3Prover/z3. Когда Z3 компилируется в режиме отладки, он предоставляет дополнительную опцию командной строки -tr:<tag>. Этот параметр можно использовать для выборочного сброса информации. Например, исходный файл nlsat_solver.cpp содержит следующие инструкция:

TRACE("nlsat", tout << "starting search...\n"; display(tout); 
               tout << "\nvar order:\n"; 
               display_vars(tout););

параметр командной строки -tr:nlsat проинструктирует Z3 выполнить инструкцию выше. tout - выходной поток трассировки. Он будет сохранен в файле .z3-trace. Источник Z3 полон этих TRACE команды. Поскольку код доступен, мы также можем добавить в код собственные команды трассировки.

если вы опубликуете свой пример, я могу сказать вам, какие компоненты Z3 используются для предварительной обработки и ее решения. Затем мы можем выбрать, какие "теги" мы должны включить трассировку.

редактировать (после ограничения были размещены): Ваш пример в смешанной целочисленной и нелинейной арифметики. Новый нелинейный арифметический решатель (nlsat) в Z3 не поддерживает to_int. Таким образом, решатель общего назначения Z3 используется для решения вашей проблемы. Хотя этот решатель принимает почти все, он даже не является полным для нелинейной реальной арифметики. Нелинейная поддержку в этом "солвер" на основе: интервальный анализ и вычисления базиса гребнера. Этот решатель реализован в папке src/smtнеустойчивая ветвь). Арифметический модуль реализован в файлах theory_arith*. Хорошим вариантом командной строки трассировки является -tr:after_reduce. Он отобразит набор ограничений после предварительной обработки. Узким местом является арифметический модуль (theory_arith*).

Дополнительная Информация:

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

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

  • код в ветке" неустойчивый "на z3.codeplex.com гораздо лучше организована, чем официальная версия в филиале "мастер". В ближайшее время я объединю его с веткой "master". Вы можете получить "нестабильную" ветку, если хотите играть с исходным кодом.

  • в ветке "нестабильный" используется новая система сборки. Вы можете создать версию выпуска с поддержкой трассировки. Вам просто нужно использовать опцию -t при создании файла Makefile.

python scripts/mk_make.py -Т

  • когда Z3 компилируется в режиме отладки, опция AUTO_CONFIG=false по умолчанию. Таким образом, чтобы воспроизвести поведение режима "release", необходимо указать параметр командной строки AUTO_CONFIG=true.