为Z3指定初始模型值

时间:2012-03-26 20:32:47

标签: z3

如何为模型指定初始“软”值?这个初始模型是解决类似查询的结果,很可能该模型具有正确的部分,甚至可能对于当前查询也是如此。

目前我正在使用增量求解和hard/soft constraints

来模拟这一点
(define-fun trans_assumed ((a Int)) Int
; an initial model, which may be (partially) true
)

(declare-fun trans_sought ((a Int)) Int) 

(declare-const p Bool)
(assert (=> p (forall ((a Int)) (= (trans_assumed a) (trans_sought a)))))
(check-sat p) ; in hope that trans_assumed values will be used as initial below

; add here the main constraints for trans_sought function

(check-sat) ; Z3 will use trans_assumed as a starting point for trans_sought

这是否真的将trans_sought的初始值指定为trans_assumed

与顺序相比,增量模式的求解速度较慢。有没有更好的方法来引入初始值?

1 个答案:

答案 0 :(得分:3)

我认为这是一个很好的方法,但您可以考虑使用更多的布尔变量。现在,这是一种“全”或“无”的方法。在您的脚本中,执行(check-sat p)时,Z3会查找trans_assumedtrans_sought具有相同解释的模型。如果这样的模型不存在,它将返回包含p的不满核心。执行(check)时,Z3可以自由地将p分配给false,并且通用量词基本上是无关紧要的。也就是说,trans_assumedtrans_sought可能完全不同。

如果您使用多个布尔变量来控制trans_sought的解释,您将获得更多灵活性。 如果你的问题的其余部分是量化的,你应该考虑放弃通用量词。如果您只关心有限数量点中trans_sought的值,则可以执行此操作。

假设我们有trans_assumed(0) = 1trans_assumed(1) = 10。然后,我们可以写:

assert (=> p0 (= (trans_sought 0) 1)))
assert (=> p1 (= (trans_sought 1) 10)))

在此编码中,我们可以查询(check-sat p0 p1)(check-sat p0)(check-sat p1)