为什么同一个 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 中的求解器最终被命名为 FairZ3Solver
,Fair
就像函数的公平展开一样。所有的展开逻辑都与 Z3 通信混合在一起。
Leon 中有第二个(新的)归纳展开实现(称为 UnrollingSolver
),它独立于底层求解器(Z3、CVC4、RandomSolver
)。该展开与 fairz3
提供的展开一样 "fair"。当您使用 unrollz3
时,您正在使用此 UnrollingSolver
(也与 smt-z3
一起使用),底层求解器是 Z3 的本机界面(不使用 SMT-LIB 文本界面)。与 FairZ3Solver
的主要区别在于,除了更通用之外,展开是在 Leon 树上完成的。这会稍微影响性能。
在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 中的求解器最终被命名为 FairZ3Solver
,Fair
就像函数的公平展开一样。所有的展开逻辑都与 Z3 通信混合在一起。
Leon 中有第二个(新的)归纳展开实现(称为 UnrollingSolver
),它独立于底层求解器(Z3、CVC4、RandomSolver
)。该展开与 fairz3
提供的展开一样 "fair"。当您使用 unrollz3
时,您正在使用此 UnrollingSolver
(也与 smt-z3
一起使用),底层求解器是 Z3 的本机界面(不使用 SMT-LIB 文本界面)。与 FairZ3Solver
的主要区别在于,除了更通用之外,展开是在 Leon 树上完成的。这会稍微影响性能。