来自Z3的神秘'未知'

时间:2014-03-26 13:32:01

标签: z3

我正在为一个新颖的程序逻辑编写一个校对程序,处理弱内存。 Z3完成了繁重的工作:我将所有支票翻译成AST,并使用ML绑定将它们扔到Z3。 (但是,见下文,我通过rise4fun在线检查Z3给出了相同的答案)。这里有我想检查的含义,非常印刷,所以我可以理解操作符嵌套,名称略有简化,因此很容易看出它们是什么:

         r1=1
       =>      y=1
           /\  x=1
   /\  xnew=x
   /\  ynew=2
=>          xnew=x
       /\  ynew=y
   \/  Exists(r1) 
                   r1=1
               =>      y=1
                   /\  x=1
           /\  xnew=x
           /\  ynew=2

这很好地转换为AST(类型声明未显示,但请参见下面的实际Z3输入):

(let ((a1 (and (=> (= r1 1) (and (= y 1) (= x 1)))
               (= xnew x)
               (= ynew 2)))
     (a2 (exists ((r1 Int))
            (and (=> (= r1 1) (and (= y 1) (= x 1)))
                 (= xnew x)
                 (= ynew 2)))))
 (=> a1 (or 

(和(= xnew x)(= ynew y))a2)))

所以这一切都很好。但是Z3说不知道'奇怪的是,这是我所有测试中数千个查询中唯一一个给出这个结果的查询。所以我通过升级4fun教程调查了Z3的在线版本,该教程接受了这个输入

(declare-const r1 Int)
(declare-const y Int)
(declare-const x Int)
(declare-const xnew Int)
(declare-const ynew Int)
(define-fun a1 () Bool
  (and (=> (= r1 1) (and (= y 1) (= x 1)))
               (= xnew x)
               (= ynew 2))
)
(define-fun a2 () Bool
  (exists ((r1 Int))
            (and (=> (= r1 1) (and (= y 1) (= x 1)))
                 (= xnew x)
                 (= ynew 2)))
)
(define-fun conjecture () Bool 
  (=> a1 (or (and (= xnew x) (= ynew y)) a2))
)
(assert (not conjecture))
(check-sat)

并说'未知'。

我犯了一个简单的错误,或者这是一个错误,还是什么?

1 个答案:

答案 0 :(得分:0)

这似乎是主分支和在线使用的可执行文件中的错误。 该行为不会在最新的不稳定分支中重现。