如何为模型指定初始“软”值?这个初始模型是解决类似查询的结果,很可能该模型具有正确的部分,甚至可能对于当前查询也是如此。
目前我正在使用增量求解和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
?
与顺序相比,增量模式的求解速度较慢。有没有更好的方法来引入初始值?
答案 0 :(得分:3)
我认为这是一个很好的方法,但您可以考虑使用更多的布尔变量。现在,这是一种“全”或“无”的方法。在您的脚本中,执行(check-sat p)
时,Z3会查找trans_assumed
和trans_sought
具有相同解释的模型。如果这样的模型不存在,它将返回包含p
的不满核心。执行(check)
时,Z3可以自由地将p
分配给false
,并且通用量词基本上是无关紧要的。也就是说,trans_assumed
和trans_sought
可能完全不同。
如果您使用多个布尔变量来控制trans_sought
的解释,您将获得更多灵活性。
如果你的问题的其余部分是量化的,你应该考虑放弃通用量词。如果您只关心有限数量点中trans_sought
的值,则可以执行此操作。
假设我们有trans_assumed(0) = 1
和trans_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)