我有一些我给z3的断言,这些断言是可以满足的。当我拨打(check-sat)
时,z3会返回sat
。然后我调用(get-model)
,查看特定变量%%P2_*_143
的定义。它看起来像这样:
(define-fun %%P2_*_143 () JS (NUM 2.0))
如果我采用这个定义,把它变成断言
(assert (= %%P2_*_143 (NUM 2.0)))
再次致电(check-sat)
,z3返回unsat
。此外,如果我再拨打(get-unsat-core)
,则z3会返回()
。
我的理解是z3生成的模型给出了所有变量的令人满意的赋值,因此断言赋值也应该是可满足的。这是不正确的,还是我在其他地方有错误?
整套断言都在这个要点中:https://gist.github.com/2966738。增加的断言位于最底层。
我在Mac OS X 10.7.4上使用的是Z3 3.2版。我还能够使用http://rise4fun.com/z3的在线界面重现此行为。
答案 0 :(得分:1)
几天前报道了类似的错误。线性实际算法包中的模型构造存在错误。该错误已得到修复。 Z3使用无穷小来处理严格的不等式,详情见下文:http://research.microsoft.com/en-us/um/people/leonardo/cav06.pdf
请注意,该错误不会影响解算器的完整性。也就是说,sat / nuts答案是正确的。但是,模型不是。您的示例中的第二个查询是不满意的,因为模型不正确。如果需要,我可以提供一个新的二进制文件来解决这个问题。在此期间,您可以通过在脚本中添加以下命令来解决该错误:
(declare-fun delta () Real)
(assert (< 0.0000001 delta))
(assert (< delta 0.0000002))