来自z3的错误结果

时间:2012-01-25 15:22:28

标签: optimization solver z3 satisfiability sat-solvers

我正在尝试使用Z3 SMT Solver证明以下内容:((x*x) + x) = ((~x * ~x) + ~x)。 这是正确的,因为c编程语言中存在溢出语义。

现在我编写了以下smt-lib代码:

(declare-fun a () Int)

(define-fun myadd ((x Int) (y Int)) Int (mod (+ x y) 4294967296) )
(define-fun mynot ((x Int))         Int (- 4294967295 (mod x 4294967296)) )
(define-fun mymul ((x Int) (y Int)) Int (mod (* x y) 4294967296) )

(define-fun myfun1 ((x Int)) Int (myadd (mynot x) (mymul (mynot x) (mynot x))) )
(define-fun myfun2 ((x Int)) Int (myadd x (mymul x x)) )

(simplify (myfun1 0))
(simplify (myfun2 0))

(assert (= (myfun1 a) (myfun2 a)))
(check-sat)
(exit)

z3的输出是:

0
0
unsat

现在我的问题:为什么结果“不满意”?我的代码中的simplify命令显示可以获得有效的分配,以便myfun1和myfun2具有相同的结果。

我的代码有问题或者这是z3中的错误吗?

请有人帮帮我。谢谢

1 个答案:

答案 0 :(得分:2)

错误的结果是由于Z3公式/表达式预处理器中的错误。该错误已得到修复,并且已经是当前版本(v4.3.1)的一部分。该错误会影响使用表单公式的基准:(mod (+ a b))(mod (* a b))

我们可以在线here重试该示例,并获得预期结果。