z3解算器是否可以同时使用位爆炸和软断言?

z3解算器是否可以同时使用位爆炸和软断言?,z3,solver,assertion,smt,Z3,Solver,Assertion,Smt,我试图使用z3 smt解算器将值分配给受约束的变量。除了硬约束,我还有一些软约束(例如,a!=c)。我希望能够使用assert指定硬约束,将软约束指定为soft assert,如果我使用(检查sat)进行求解,这会起作用 如果我使用(使用sat检查sat(然后简化求解eqs-bit-blast-sat))启用位爆破,则某些文件非常大且复杂,只能在合理的时间内求解。当我这样做时,软断言似乎被忽略了(下面的例子或在)。这是预期的吗?是否可以同时使用位爆炸解决和软断言 以下SMT代码定义了4个位向量,

我试图使用z3 smt解算器将值分配给受约束的变量。除了硬约束,我还有一些软约束(例如,
a!=c
)。我希望能够使用
assert
指定硬约束,将软约束指定为
soft assert
,如果我使用
(检查sat)
进行求解,这会起作用

如果我使用
(使用sat检查sat(然后简化求解eqs-bit-blast-sat))
启用位爆破,则某些文件非常大且复杂,只能在合理的时间内求解。当我这样做时,软断言似乎被忽略了(下面的例子或在)。这是预期的吗?是否可以同时使用位爆炸解决和
软断言

以下SMT代码定义了4个位向量,
a
b
c
&
d
,这些位向量都应该能够获取唯一值,但只能通过软断言强制执行。使用
检查sat
(第39行)按预期工作,但
检查sat使用
(第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将其视为一个优化问题,它考虑了软约束,并给出了您所寻求的“不相交性”

让我们做同样的事情,但是这次我们将使用
check sat
调用来指定要使用的策略。我们得到:

$ z3 -v:3 a.smt2
(smt.searching)
sat
((a #b11)
 (b #b11)
 (c #b11)
 (d #b10))
这证实了你的怀疑:当你告诉z3到底该做什么时,它并没有完成优化过程。事后看来,这是意料之中的,但我同意这相当令人惊讶


问题是我们是否可以告诉z3显式地进行优化。但是我不确定这在战术语言中是否可行。我认为这个问题非常值得在他们的问题网站()上提问,看看是否有一个神奇的咒语可以用来从战术语言启动
maxres
引擎。(由于许多原因,这可能是不可能的,但没有理由在这里猜测。)请在这里报告您发现的情况

我在上发现了这个问题,这似乎表明(截至2017年)这可能是不可能的:“那么,在任何API中都没有办法用策略互操作Z3优化器吗?”,“没有办法”。我将提交一个更新的问题,看看情况是否发生了变化。