我试图找出为什么交换查询订单可能会修改 Z3 定点引擎的答案:
(declare-rel fib (Int Int))
(declare-rel q1 ())
(declare-rel q2 ())
(declare-var n Int)
(declare-var tmp1 Int)
(declare-var tmp2 Int)
(rule (=> (< n 2) (fib n 1)))
(rule (=> (and (>= n 2)
(fib (- n 1) tmp1)
(fib (- n 2) tmp2))
(fib n (+ tmp1 tmp2))))
(rule (=> (< n 2) q1))
(rule (=> (and (fib n tmp1) (<= tmp1 0)) q2))
(query q1)
(query q2)
第一个查询q1
是一个虚拟查询,只是向引擎询问一些事情。第二个查询q2
与推断的不变量相矛盾,即斐波那契数始终为正。
如果查询的顺序是
(query q2)
(query q1)
一切正常,给出了正确的答案。但是在查询时交换它们会产生下一个错误q2
:
(smt.diff_logic: non-diff logic expression (+ fib_1_1 fib_1_0 (* (- 1) fib_1_n))) unknown
有人可以解释原因吗?是 Z3 问题还是我做错了什么?如果首先,任何有关工作的建议(我正在使用.NET API)将不胜感激。谢谢!