【发布时间】:2018-03-22 13:52:10
【问题描述】:
我是 Z3 的新手,我正在尝试了解它的工作原理,以及它能做什么和不能做什么。我知道 Z3 至少 一些 通过幂 (^) 运算符支持指数(请参阅 Z3py returns unknown for equation using pow() function、How to represent logarithmic formula in z3py 和 Use Z3 and SMT-LIB to define sqrt function with a real number)。我不清楚的是这种支持有多广泛,以及 z3 可以对指数做出什么样的推论。
这是一个涉及指数的简单示例,z3 可以分析。我们定义一个指数函数,然后要求它验证 exp(0) == 1:
(define-fun exp ((x Real)) Real
(^ 2.718281828459045 x))
(declare-fun x1 () Real)
(declare-fun y1 () Real)
(assert (= y1 (exp x1)))
(assert (not (=> (= x1 0.0) (= y1 1.0))))
(check-sat)
(exit)
Z3 按预期返回 unsat。另一方面,这是一个 Z3 无法分析的简单示例:
(define-fun exp ((x Real)) Real
(^ 2.718281828459045 x))
(declare-fun x1 () Real)
(declare-fun y1 () Real)
(assert (= y1 (exp x1)))
(assert (not (< y1 0.0)))
(check-sat)
(exit)
这应该是可以满足的,因为从字面上看,x1 的任何值都会给出 y1 > 0。但是,Z3 返回未知。天真的我可能期望 Z3 能够分析这个,因为它可以分析第一个示例。
我意识到这个问题有点宽泛,但是:谁能给我任何关于 Z3 如何处理指数的见解,以及(更具体地说)为什么它可以解决我给出的第一个示例但不能解决第二个示例?
【问题讨论】:
-
有时
(check-sat-using (or-else default qfnra-nlsat))使用非线性 sat 引擎提供更好的结果。 (尽管它不适用于您的第二个示例。)根据我的经验,一旦您有非线性项,就很难说什么时候有效,什么时候无效。