我在z3 shell和java api中尝试了相同的假设。如下:
(declare-const x (_ BitVec 32))
(assert (not (bvsle (bvadd x #xfffffff8) #x00000000)))
(check-sat)
(get-model)
在z3 shell中,解决方案是:x = 9 但是在z3 api中,解决方案是:x = 0x80000000 在我的应用程序中,我更喜欢shell结果。 如果我错过了API使用的一些选项,我想要。
顺便说一句。有没有我可以用来控制解决方案价值的选项,我想要一些更合理的价值观。但是Z3经常给我一些看起来像随机值的巨大价值。
答案 0 :(得分:0)
AFAIK ,在 z3 中随机选择可以说的模型。
如果合理值表示 small ,那么您原则上可以使用 z3 优化x
以确保返回的模型集x
等于#x00000009
。的 e.g。强>
(declare-const x (_ BitVec 32))
(assert (not (bvsle (bvadd x #xfffffff8) #x00000000)))
(minimize x)
(check-sat)
(get-model)
当然,对搜索更难的问题所花的时间可能会产生重大影响。
这是在优化搜索中设置超时并且仍然能够检索与最佳近似相关联的模型(如果有)的情况之一最佳解决方案,将是理想的。但是,我不知道 z3 是否具有此功能。