Z3Py:随机结果(阶段选择)不是随机的?

时间:2014-06-20 15:36:24

标签: z3 z3py

我尝试使用位向量来获取模型值中的随机结果,如de Moura here建议的那样,但随后使用Z3Py而不是SMTLIB。我把他的例子翻译成:

from z3 import *
s = Solver()
x = BitVec('x', 16)
set_option('auto_config', False)
set_option('smt.phase_selection',5)
s.add(ULT(x,100))
s.check()
s.model()
s.check()
s.model()

然而,结果似乎总是相同的,即 - 使用s.check()重复检查不会改变结果。 - 即使重启python交互式shell后,执行结果也是一样的

添加随机种子的更改不会改变结果:set_option(' smt.random_seed',123)

有没有人知道为什么不按预期工作?

提前致谢!

Carsten

1 个答案:

答案 0 :(得分:2)

这种情况太简单了。它基本上由预处理器解决,并且永远不会到达需要选择相位的点,因此随机相位选择无效。 Leo对所引用帖子的回答现在有点过时了,Z3已经改变了,所以它不会立即使用最新的不稳定版本进行复制,因为Z3选择使用不同的求解器。如果我们通过添加(push)命令强制它使用增量求解器,我们仍然可以得到随机行为;这是一个与种子有关的更新示例:

(set-option :auto_config false)
(set-option :smt.phase_selection 5)
(set-option :smt.random_seed 456)
(declare-const x (_ BitVec 16))
(assert (bvult x (_ bv100 16)))
(push)
(check-sat)
(get-model)
;; try again to get a different model
(check-sat)
(get-model)
;; try again to get a different model
(check-sat)
(get-model)