是否可以使用不包括 SAT 的 Z3?

Is it possible to use Z3 excluding SAT?

Z3 支持 SMT-lib set-logic 语句来限制特定片段。例如,在使用 (set-logic QF_LRA) 的程序中,启用了无量词线性实数运算。如果启用多个理论,对我来说需要 SAT 是有意义的。但是,我不清楚是否有可能启用单一理论并保证 SAT 永远不会 运行,从而将 Z3 简化为仅针对该单一理论的求解器。这将很有用,例如声称一个工具遵循给定理论的求解器的特定性能界限。

有没有办法在 SMT-lib 中或直接在 Z3 中执行此操作?或者保证 SAT 求解器被禁用是不可能的?

许多SMT求解器本质上实现的Nelson-Oppen理论组合算法关键依赖于SAT求解器:从某种意义上说,SAT求解器是解决您的SMT查询的引擎,请咨询理论求解器以确保冲突根据理论规则,它发现 propagated/resolved。因此,如果没有底层 SAT 引擎,谈论 SMT 求解器是不可能的,而且 SMTLib 和我所知道的任何其他工具都不允许您“关闭”SAT。它是整个系统不可或缺的一部分,不能随意on/off。这是 Nelson-Oppen 的一组不错的幻灯片:https://web.stanford.edu/class/cs357/lecture11.pdf

我想构建一个不使用该架构的 SMT 求解器是可能的;但是每个理论求解器本质上都需要将 SAT 求解器嵌入到自身中。因此,即使在那种情况下,也确实不可能提取出“SAT”位。

如果您要精确测量求解器的哪个部分花费了多少时间,最好的办法是检测求解器以收集有关它花费时间的统计信息。即便如此,准确调用哪些部分属于 SAT 求解器,哪些部分属于理论求解器,哪些部分进入它们的组合将是棘手的。