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

时间:2015-05-09 17:56:48

标签: leon

在Leon验证者中,为什么即使在莱昂内部发生归纳推理,也会有不同的选项使用相同的求解器?例如。所有3个选项:fairz3,smt-z3和unrollz3似乎都使用z3求解器并在leon中执行归纳推理。

1 个答案:

答案 0 :(得分:1)

所有这三个选项原则上都是这样做的,但在实施上略有不同(导致不同的性能/可靠性)。

fairz3选项使用本机Z3 api(通过ScalaZ3库),而smt-z3与Z3进程标准输入通信(通过{{使用SMT-LIB标准) 3}}库)。要使用smt-z3,您需要确保{PATH}中有z3命令。

使用fairz3,Leon和Z3在同一个进程中运行,这意味着Z3中的崩溃会导致整个过程停止,并且Leon无法做任何事情来阻止它。使用smt-z3时,我们将Z3作为一个单独的进程运行,我们可以独立于该进程运行Leon。如果该过程变得无法响应(或者如果Leon决定将解算器超时),则可以在任何时候终止该过程。

fair名称是由于历史原因。 Leon的原始实现基于Z3的原生API(显然出于性能原因,直接在Z3中构建公式树而不是在Leon中构建它们然后将它们转换为Z3更快)。 Leon中的解算器最终被命名为FairZ3Solver,其中Fair被命名为公平展开函数。所有展开逻辑都与Z3通信混合在一起。

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