在z3中打印内部求解器公式

时间:2012-10-27 18:09:42

标签: z3 smt theorem-proving formal-verification

定理证明工具z3花了很多时间来解决一个公式,我认为它应该能够轻松处理。为了更好地理解这一点并可能优化我对z3的输入,我想看到z3生成的内部约束作为其求解过程的一部分。 当从命令行使用z3时,如何打印z3为其后端解算器生成的公式?

1 个答案:

答案 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

  • 在调试模式下编译Z3时,默认选项为AUTO_CONFIG=false。因此,要重现“释放”模式的行为,您必须提供命令行选项AUTO_CONFIG=true