为什么同一个 SMT 求解器有多个选项

Why are there multiple options for the same SMT solver

在Leon verifier中,为什么即使在Leon中进行归纳推理,也会有不同的选项使用相同的求解器?例如。所有 3 个选项:fairz3、smt-z3 和 unrollz3 似乎都使用 z3 求解器并在 leon 中执行归纳推理。

所有三个选项原则上都是这样做的,但在实现上略有不同(导致不同performances/reliability)。

fairz3 选项使用原生 Z3 api(通过 ScalaZ3 library) while the smt-z3 communicates with a Z3 process standard input (using the SMT-LIB standard via the Scala SMT-LIB 库)。为了使用 smt-z3,您需要确保 z3 命令在您的 PATH 中。

fairz3的情况下,Leon和Z3在同一个进程中运行ning,这意味着Z3中的崩溃会导致整个进程崩溃,而在Z3中无能为力。莱昂阻止它。当使用 smt-z3 时,我们 运行 Z3 作为一个单独的进程,我们可以 运行 Leon 与该进程隔离。如果该进程变得无响应(或者如果 Leon 决定使求解器超时),则可以随时终止该进程。

fair 名称是由于历史原因。 Leon 的原始实现是基于 Z3 的原生 API(显然出于性能原因,直接在 Z3 中构建公式树比在 Leon 中构建它们然后为 Z3 翻译更快)。 Leon 中的求解器最终被命名为 FairZ3SolverFair 就像函数的公平展开一样。所有的展开逻辑都与 Z3 通信混合在一起。

Leon 中有第二个(新的)归纳展开实现(称为 UnrollingSolver),它独立于底层求解器(Z3、CVC4、RandomSolver)。该展开与 fairz3 提供的展开一样 "fair"。当您使用 unrollz3 时,您正在使用此 UnrollingSolver(也与 smt-z3 一起使用),底层求解器是 Z3 的本机界面(不使用 SMT-LIB 文本界面)。与 FairZ3Solver 的主要区别在于,除了更通用之外,展开是在 Leon 树上完成的。这会稍微影响性能。