是否可以在 Z3 中对条件 sat 检查进行编码?

Is it possible to encode conditional sat checks in Z3?

假设我有以下问题(为了简化我的问题,我已将其简化)

;; declare variables
(declare-const X0 Int)
(assert (>= X0 0))
(assert (<= X0 1))
(declare-const X1 Int)
(assert (>= X1 0))
(assert (<= X1 1))
(declare-const X2 Int)
(assert (>= X2 0))
(assert (<= X2 1))

;; two sat checks
(push)
(assert (= (0 (+ X1 X2))))
(check-sat)
(pop)
(push)
(assert (= (0 (+ X1 X2 X3))))
(check-sat)
(pop)

如果第一次 sat 检查是 unsat/sat,我想做的是跳过第二次 sat 检查。是否有可能做到这一点?我相信如果我将 Z3 与 python 一起使用(运行 sat 检查,得到结果,并在结果上使用 python if 语句来确定是否 运行 第二次检查),但我想用 smt-lib 来做。这(很容易)可能吗?

没有。 SMTLib 语言 (http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2021-05-12.pdf) 没有任何“控制结构”供您根据先前的结果发出 sat 检查。

解决方案是使用更高级别的 API,可以从任何数量的宿主语言中获得,例如 C/C++/C#/O'Caml/Python/Java/Scheme/Haskell,您可以在其中可以对这种交互进行编程。