Z3对指数的支持

Z3对指数的支持,z3,smt,Z3,Smt,我是Z3的新手,我试图了解它是如何工作的,以及它能做什么和不能做什么。我知道Z3通过幂(^)操作符至少对指数有一些支持(请参阅和)。我不清楚的是这种支持的范围有多广,以及z3可以对指数做出什么样的推论 这里有一个简单的例子,涉及z3可以分析的指数。我们定义一个指数函数,然后要求它验证exp(0)==1: Z3按预期返回unsat。另一方面,这里有一个Z3无法分析的简单示例: (定义乐趣exp((x Real))Real (^2.718281828459045 x)) (声明为真) (宣布乐趣y1

我是Z3的新手,我试图了解它是如何工作的,以及它能做什么和不能做什么。我知道Z3通过幂(^)操作符至少对指数有一些支持(请参阅和)。我不清楚的是这种支持的范围有多广,以及z3可以对指数做出什么样的推论

这里有一个简单的例子,涉及z3可以分析的指数。我们定义一个指数函数,然后要求它验证exp(0)==1:

Z3按预期返回unsat。另一方面,这里有一个Z3无法分析的简单示例:

(定义乐趣exp((x Real))Real
(^2.718281828459045 x))
(声明为真)
(宣布乐趣y1()真实)
(断言(=y1(exp-x1)))
(断言(不是(
这应该是可以满足的,因为x1的任何值都会给出y1>0。但是,Z3返回未知值。考虑到Z3可以分析第一个示例,我可能天真地认为Z3能够分析这一点


我意识到这个问题有点宽泛,但是:有谁能给我一些关于Z3如何处理指数的见解,以及(更具体地说)为什么它能解决我给出的第一个例子,而不是第二个?

一般来说很难说,因为非线性解算是具有挑战性的,但你给出的例子其实并不那么神秘。你写道:

(assert (= y (exp x)))
(assert (not (=> (= x 0) (= y 1))))
Z3将简化第二个断言,产生:

(assert (= y (exp x)))
(assert (= x 0))
(assert (not (= y 1)))
(assert (= y (exp 0)))
(assert (not (= y 1)))
然后它将传播第一个等式,产生:

(assert (= y (exp x)))
(assert (= x 0))
(assert (not (= y 1)))
(assert (= y (exp 0)))
(assert (not (= y 1)))
现在,当展开
exp
时,有一个常量^constant的情况,Z3可以处理它(对于整数指数等)


对于第二种情况,你要问的是一个关于变量指数的非常基本的问题,Z3会立刻呕吐。这并不奇怪,因为很多关于变量指数的问题要么是已知的、不可计算的,要么是未知的、但很难回答的。

有时
(使用sat检查sat(或者使用默认qfnra nlsat))
使用非线性sat引擎会给出更好的结果。(虽然这对你的第二个例子不起作用。)根据我的经验,一旦你有了非线性项,就很难说什么东西起作用了,什么时候不起作用了。谢谢!这是非常有帮助的(回想起来很明显,真的)。为了以后的参考,我在Z3中处理了相当多的指数,我发现它有时可以,但不总是,以这种方式传播等式,并确定它是在计算常数^constant。对于更复杂的表达式,我发现它对您给出的断言的精确公式相当敏感。一个公式会立即返回未知值,另一个稍有不同(但逻辑上相同)的公式会立即返回unsat值。是的,它会非常敏感,因为你依赖于简化器将方程推演成一种可判定的形式。手动简化通常是必要的,因为简化器不是很聪明。通常,您会很快得到“unknown”,因为它通常是一种语法检查。我认为,你很快就得到了“unsat”,这只是你发送的断言的一个事实。顺便说一句,如果我的回答是正确的,我会感谢你“接受”它。