定理证明工具z3花了很多时间来解决一个公式,我认为它应该能够轻松处理。为了更好地理解这一点并可能优化我对z3的输入,我想看到z3生成的内部约束作为其求解过程的一部分。 当从命令行使用z3时,如何打印z3为其后端解算器生成的公式?
答案 0 :(得分:11)
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组件用于预处理和解决它。 然后,我们可以选择我们应该启用跟踪的“标签”。
编辑 (在constraints发布后):
你的例子是混合整数&amp;实数非线性算法。
Z3中的新非线性算术求解器(nlsat
)不支持to_int
。
因此,Z3通用解算器用于解决您的问题。
虽然这个求解器几乎可以接受所有的东西,但对于非线性实数算术来说甚至都不完该求解器的非线性支持基于:区间分析和Grobner基计算。
此解算器在src/smt
文件夹(unstable branch)中实现。
算术模块在文件theory_arith*
中实现。
一个好的跟踪命令行选项是-tr:after_reduce
。它将在预处理后显示约束集。
瓶颈是算术模块(theory_arith*
)。
补充说明:
问题在于一个不可判定的片段:混合整数&amp;实数非线性算法。也就是说,不可能为这个片段写一个声音和完整的求解器。当然,我们可以编写一个求解器来解决我们在实践中发现的实例。我相信可以延长nlsat
来处理to_int
。
如果您避开to_int
,则可以使用nlsat
。问题出在非线性实数算术片段中。我知道这可能很难,因为to_int
似乎是编码中的关键内容。
z3.codeplex.com上“不稳定”分支中的代码比“master”分支中的官方版本组织得更好。我很快就会将它与“主”分支合并。如果要使用源代码,可以检索“不稳定”分支。
“unstable”分支使用新的构建系统。您可以使用跟踪支持构建发行版。您只需在生成Makefile时使用选项-t
。
python scripts / mk_make.py -t
AUTO_CONFIG=false
。因此,要重现“释放”模式的行为,您必须提供命令行选项AUTO_CONFIG=true
。