我刚开始使用 Z3 (v4.4.0),我想尝试其中一个教程示例:
(declare-const a Int)
(assert (> (* a a) 3))
(check-sat)
(get-model)
(echo "Z3 will fail in the next example...")
(declare-const b Real)
(declare-const c Real)
(assert (= (+ (* b b b) (* b c)) 3.0))
(check-sat)
如前所述,第二个示例因“未知”而失败,并且通过增加详细级别(至 3)我想我明白为什么:简化过程存在问题,然后策略失败。为了更好地了解问题(以及更短的输出),我决定删除代码的第一部分以仅测试失败的部分:
(echo "Z3 will fail in the next example...")
(declare-const b Real)
(declare-const c Real)
(assert (= (+ (* b b b) (* b c)) 3.0))
(check-sat)
但神奇的是,现在我“坐”了。我不确定 Z3 在涉及非线性算术时如何选择它的策略,但问题可能出在 Z3 为第一个公式选择一种对第二个公式无用的策略吗?
提前致谢