是否可以将 bit-blast 和 soft-assert 与 z3 求解器一起使用?
Is it possible to use both bit-blast and soft-assert with the z3 solver?
我正在尝试使用 z3 smt 求解器为受约束的变量分配值。除了硬约束外,我还有一些软约束(例如 a != c
)。我希望能够用 assert
指定硬约束,用 soft-assert
指定软约束,如果我用 (check-sat)
.
求解,这会起作用
有些文件又大又复杂,如果我使用 (check-sat-using (then simplify solve-eqs bit-blast sat))
打开位爆破,只能在合理的时间内解决。当我这样做时,软断言似乎被忽略了(下面的示例或 rise4fun)。这是预期的吗?可以同时使用bit-blast求解和soft-assert
吗?
以下 SMT 代码定义了 4 个位向量,a
、b
、c
和 d
,它们都应该能够采用唯一值,但只能强制通过软断言来做到这一点。使用 check-sat
(第 39 行)按预期工作,但 check-sat-using
(第 38 行)将 b
和 d
分配给相同的值。
(set-option :produce-models true)
(set-logic QF_BV)
;; Declaring all the variables
(declare-const a (_ BitVec 2))
(declare-const b (_ BitVec 2))
(declare-const c (_ BitVec 2))
(declare-const d (_ BitVec 2))
(assert (or (= a #b00)
(= a #b01)
(= a #b10)
(= a #b11)))
(assert (or (= b #b00)
(= b #b01)
(= b #b10)
(= b #b11)))
(assert (or (= c #b00)
(= c #b01)
(= c #b10)
(= c #b11)))
(assert (or (= d #b00)
(= d #b01)
(= d #b10)
(= d #b11)))
;; Soft constraints to limit reuse
(assert-soft (not (= a b)))
(assert-soft (not (= a c)))
(assert-soft (not (= a d)))
(assert-soft (not (= b c)))
(assert-soft (not (= b d)))
(assert-soft (not (= c d)))
(check-sat-using (then simplify solve-eqs bit-blast sat))
;;(check-sat)
(get-value (a
b
c
d))
好问题!当您使用 assert-soft
时,优化引擎默认启动。您可以通过将您的程序与 (check-sat)
子句和 运行 更高的冗长程度一起使用来看到这一点。我已将您的程序放在一个名为 a.smt2
:
的文件中
$ z3 -v:3 a.smt2
(optimize:check-sat)
(sat.solver)
(optimize:sat)
(maxsmt)
(opt.maxres [0:6])
(sat.solver)
(opt.maxres [0:0])
found optimum
sat
((a #b01)
(b #b00)
(c #b11)
(d #b10))
因此,我们可以看到 z3 将此视为一个优化问题,它考虑了软约束并为您提供了您正在寻找的 "disjointness"。
让我们做同样的事情,但这次我们将使用指定要使用的策略的 check-sat
调用。我们得到:
$ z3 -v:3 a.smt2
(smt.searching)
sat
((a #b11)
(b #b11)
(c #b11)
(d #b10))
这证实了您的怀疑:当您确切地告诉 z3 要做什么时,它并没有执行优化过程。事后看来,这是意料之中的,但我同意这相当令人惊讶。
接下来的问题是我们是否可以明确告诉 z3 进行优化。但是我不确定这在战术语言中是否可行。我认为这个问题非常值得在他们的问题站点 (https://github.com/Z3Prover/z3/issues) 上提问,看看是否有魔法咒语可以用来从战术语言中启动 maxres
引擎。 (由于多种原因,这可能是不可能的,但没有理由在这里推测。)请在这里报告你发现了什么!
我正在尝试使用 z3 smt 求解器为受约束的变量分配值。除了硬约束外,我还有一些软约束(例如 a != c
)。我希望能够用 assert
指定硬约束,用 soft-assert
指定软约束,如果我用 (check-sat)
.
有些文件又大又复杂,如果我使用 (check-sat-using (then simplify solve-eqs bit-blast sat))
打开位爆破,只能在合理的时间内解决。当我这样做时,软断言似乎被忽略了(下面的示例或 rise4fun)。这是预期的吗?可以同时使用bit-blast求解和soft-assert
吗?
以下 SMT 代码定义了 4 个位向量,a
、b
、c
和 d
,它们都应该能够采用唯一值,但只能强制通过软断言来做到这一点。使用 check-sat
(第 39 行)按预期工作,但 check-sat-using
(第 38 行)将 b
和 d
分配给相同的值。
(set-option :produce-models true)
(set-logic QF_BV)
;; Declaring all the variables
(declare-const a (_ BitVec 2))
(declare-const b (_ BitVec 2))
(declare-const c (_ BitVec 2))
(declare-const d (_ BitVec 2))
(assert (or (= a #b00)
(= a #b01)
(= a #b10)
(= a #b11)))
(assert (or (= b #b00)
(= b #b01)
(= b #b10)
(= b #b11)))
(assert (or (= c #b00)
(= c #b01)
(= c #b10)
(= c #b11)))
(assert (or (= d #b00)
(= d #b01)
(= d #b10)
(= d #b11)))
;; Soft constraints to limit reuse
(assert-soft (not (= a b)))
(assert-soft (not (= a c)))
(assert-soft (not (= a d)))
(assert-soft (not (= b c)))
(assert-soft (not (= b d)))
(assert-soft (not (= c d)))
(check-sat-using (then simplify solve-eqs bit-blast sat))
;;(check-sat)
(get-value (a
b
c
d))
好问题!当您使用 assert-soft
时,优化引擎默认启动。您可以通过将您的程序与 (check-sat)
子句和 运行 更高的冗长程度一起使用来看到这一点。我已将您的程序放在一个名为 a.smt2
:
$ z3 -v:3 a.smt2
(optimize:check-sat)
(sat.solver)
(optimize:sat)
(maxsmt)
(opt.maxres [0:6])
(sat.solver)
(opt.maxres [0:0])
found optimum
sat
((a #b01)
(b #b00)
(c #b11)
(d #b10))
因此,我们可以看到 z3 将此视为一个优化问题,它考虑了软约束并为您提供了您正在寻找的 "disjointness"。
让我们做同样的事情,但这次我们将使用指定要使用的策略的 check-sat
调用。我们得到:
$ z3 -v:3 a.smt2
(smt.searching)
sat
((a #b11)
(b #b11)
(c #b11)
(d #b10))
这证实了您的怀疑:当您确切地告诉 z3 要做什么时,它并没有执行优化过程。事后看来,这是意料之中的,但我同意这相当令人惊讶。
接下来的问题是我们是否可以明确告诉 z3 进行优化。但是我不确定这在战术语言中是否可行。我认为这个问题非常值得在他们的问题站点 (https://github.com/Z3Prover/z3/issues) 上提问,看看是否有魔法咒语可以用来从战术语言中启动 maxres
引擎。 (由于多种原因,这可能是不可能的,但没有理由在这里推测。)请在这里报告你发现了什么!