对于非线性整数问题,z3处理的功率不同于乘法

时间:2015-10-29 10:58:39

标签: z3 smt

我正在使用z3 C ++ API并且在非线性整数运算方面存在一些问题,其中z3似乎以不同方式处理幂和乘法。

E.g。 x*x*x > y*ysat,但x^3 > y^2unknown

#include <z3++.h>
#include <iostream>
using namespace std;

int main() {
    z3::context c;
    auto x = c.int_const("x");
    auto y = c.int_const("y");

    z3::solver sol(c);
    sol.add(x*x*x > y*y);
    cout << sol << " : " << sol.check() << endl;

    sol.reset();
    sol.add(z3::pw(x,3) > z3::pw(y,2));
    cout << sol << " : " << sol.check() << endl;
}

我已经阅读了一些python问题(Z3 python treats x**2 different than x*x?),但我使用的是z3版本4.4.0,应该修复它。

我在尝试解决x ^ 51&gt;时遇到了这个问题。 Ÿ^ 17。我知道非线性整数算法一般是不可判定的,但我有点惊讶z3没有找到解决方案(即使重写为乘法)。所以我想知道上面是否是一个错误,或者是否有任何方法可以从这些示例的C ++中获得更好的z3结果。

1 个答案:

答案 0 :(得分:0)

这不是一个bug,Z3对非线性整数问题没有很好的支持;另见http://codepen.io/mullany/pen/sJopz

这个例子不是由任何实际的非线性算术求解器解决的,而是通过预处理步骤将所有内容转换为位向量,然后进行比特冲击,并运行纯SAT求解器;见How does Z3 handle non-linear integer arithmetic?。这种策略不支持取幂,因此在第二个求解器调用中,它一直到(最通用的)SMT求解器,它迅速放弃。

即使我们为nla2bv添加对求幂的支持,一般问题仍然存在,并且它也会为大指数产生非常大的SAT公式,所以我认为添加它的价值有限。