z3处理非线性整数问题的幂次不同于乘法 我使用Z3C++ API,在非线性整数运算方面存在一些问题,Z3似乎对功率和乘法有不同的处理。

z3处理非线性整数问题的幂次不同于乘法 我使用Z3C++ API,在非线性整数运算方面存在一些问题,Z3似乎对功率和乘法有不同的处理。,z3,smt,Z3,Smt,例如,x*x*x>y*y是sat,但是x^3>y^2是未知的: #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);

例如,
x*x*x>y*y
sat
,但是
x^3>y^2
未知的

#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;
}
#包括
#包括
使用名称空间std;
int main(){
z3::上下文c;
自动x=c.int_const(“x”);
自动y=c.int_常数(“y”);
z3::sol(c);
sol.add(x*x*x>y*y);

cout这不是一个bug,Z3只是对非线性整数问题没有很好的支持;另请参见

这个例子不是由任何实际的非线性算术解算器来解决的,而是由一个预处理步骤来解决的,该步骤将所有内容转换为位向量,然后位爆炸,并运行一个纯SAT解算器;请参阅。此策略不支持指数运算,因此在第二次解算器调用中,它会一直到(最一般的)解算器SMT解决方案,迅速放弃


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

谢谢你的回答。我不知道所使用策略的细节。所以我想我会尝试在使用mu时它对我的效果如何对于我的项目,至少对于正方形/立方体,使用多重复制而不是指数;)