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

Z3Py:随机结果(阶段选择)不是随机的?,z3,z3py,Z3,Z3py,我尝试使用位向量在模型值中获得随机结果,如de Moura建议的,但随后使用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() 然而,结果似乎总是

我尝试使用位向量在模型值中获得随机结果,如de Moura建议的,但随后使用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_选项('smt.random_seed',123)

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

提前谢谢


卡斯滕这个案子太简单了。它基本上是由预处理器解决的,永远不会到达需要选择相位的点,所以随机相位选择没有效果。Leo对引用帖子的回答现在有点过时了,Z3也发生了变化,因此它不会立即使用最新的不稳定版本进行复制,因为Z3选择使用不同的解算器。如果我们通过添加(推)命令强制它使用增量解算器,我们仍然可以获得随机行为;下面是一个更新的示例,它依赖于种子:

(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)