从z3模型断言定义不太令人满意

时间:2012-06-21 16:16:32

标签: z3

我有一些我给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的在线界面重现此行为。

1 个答案:

答案 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))