具有z3的Presburger公式的可满足性
我使用z3(Linux上的v4.3.2 32位)来确定Presburger算术公式的可满足性,但我对以下公式有一个问题:具有z3的Presburger公式的可满足性,z3,Z3,我使用z3(Linux上的v4.3.2 32位)来确定Presburger算术公式的可满足性,但我对以下公式有一个问题: (assert (forall ((x1 Int) (x2 Int) (x3 Int)) (=> (and (= x3 1) (= x1 (- x2))) (forall ((x4 Int) (x5 Int) (x6 Int))
(assert (forall ((x1 Int) (x2 Int) (x3 Int))
(=> (and (= x3 1) (= x1 (- x2)))
(forall ((x4 Int) (x5 Int) (x6 Int))
(=> (= x6 x2)
(exists ((y Int))
(=> (= x5 (+ x6 (- x4)))
(and (= (+ x1 x4) y)
(= x5 (- y))
(= (+ x1 x4) (- x5))
)
)
)
)
)
)
)
)
(check-sat)
我很确定这个公式是可以满足的,但是z3回答“未满足”。
事实上,如果我试着改变一下公式,z3会回答“sat”,就像下面的公式一样
(assert (forall ((x3 Int) (x1 Int) (x2 Int))
(=> (and (= x3 1) (= x1 (- x2)))
(forall ((x4 Int) (x5 Int) (x6 Int))
(=> (= x6 x2)
(exists ((y Int))
(=> (= x5 (+ x6 (- x4)))
(and (= (+ x1 x4) y)
(= x5 (- y))
(= (+ x1 x4) (- x5))
)
)
)
)
)
)
)
)
(check-sat)
在这里,我刚刚将第一个forall量化列表顶部的量化切换到x3。如果我也删除了x3变量,实际上它是无用的,那么z3也会回答“sat”。
有什么我不明白的吗?还是这是一个bug?谢谢你指出这一点。 这是量词消除模块中的一个bug,影响嵌套量词的情况。
它现在已在不稳定分支中修复。非常感谢您的修复!