预燃配方与z3的可满足性

时间:2013-06-24 12:17:53

标签: 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)) 
                              (=> (= 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”。 有什么我不明白或这是一个错误吗?

1 个答案:

答案 0 :(得分:2)

感谢您指出这一点。 这是量词消除模块中的一个错误,它会影响嵌套量词的情况。 它现在已在不稳定的分支中修复。