我正在为一个新颖的程序逻辑编写一个校对程序,处理弱内存。 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)
并说'未知'。
我犯了一个简单的错误,或者这是一个错误,还是什么?
答案 0 :(得分:0)
这似乎是主分支和在线使用的可执行文件中的错误。 该行为不会在最新的不稳定分支中重现。