在 C++ 中使用 Z3 求解表达式变量
Solve for expression variables using Z3 in C++
我如何写出带有 2 个 z3 表达式的等式
z3::exp x;
Z3::exp y;
如何得到形式为z3::exp Z= x+10*y
的线性方程
如何使用 Z3 表达式求解表达式变量,例如我有以下方程组:
x = a+b;
a = 2*y;
b = 4*c;
我怎样才能得到 x = 2*y + 4*c
其中 x 、 y 、 b 和 c 都是 z3 表达式
像这样的东西应该可以工作:
#include "z3++.h"
using namespace z3;
int main(void) {
context ctx;
expr x = ctx.int_const("x");
expr y = ctx.int_const("y");
expr a = ctx.int_const("a");
expr b = ctx.int_const("b");
expr c = ctx.int_const("c");
solver s(ctx);
s.add(x == a+b);
s.add(a == 2*y);
s.add(b == 4*c);
s.add(x == 2*y + 4*c);
std::cout << s.check() << "\n";
model m = s.get_model();
for (unsigned i = 0; i < m.size(); i++) {
func_decl v = m[static_cast<int>(i)];
std::cout << v.name() << " = " << m.get_const_interp(v) << "\n";
}
return 0;
}
假设你把这个程序放在一个名为 a.cpp
的文件中,你可以像这样编译和 运行 它:
$ c++ a.cpp -lz3
$ ./a.out
sat
y = 0
c = 0
x = 0
b = 0
a = 0
您得到的模型不是特别有趣,因为全 0 赋值可以平凡地满足它。但是您可以添加其他约束并获得更多有趣的值。
我如何写出带有 2 个 z3 表达式的等式
z3::exp x;
Z3::exp y;
如何得到形式为z3::exp Z= x+10*y
如何使用 Z3 表达式求解表达式变量,例如我有以下方程组:
x = a+b;
a = 2*y;
b = 4*c;
我怎样才能得到 x = 2*y + 4*c
其中 x 、 y 、 b 和 c 都是 z3 表达式
像这样的东西应该可以工作:
#include "z3++.h"
using namespace z3;
int main(void) {
context ctx;
expr x = ctx.int_const("x");
expr y = ctx.int_const("y");
expr a = ctx.int_const("a");
expr b = ctx.int_const("b");
expr c = ctx.int_const("c");
solver s(ctx);
s.add(x == a+b);
s.add(a == 2*y);
s.add(b == 4*c);
s.add(x == 2*y + 4*c);
std::cout << s.check() << "\n";
model m = s.get_model();
for (unsigned i = 0; i < m.size(); i++) {
func_decl v = m[static_cast<int>(i)];
std::cout << v.name() << " = " << m.get_const_interp(v) << "\n";
}
return 0;
}
假设你把这个程序放在一个名为 a.cpp
的文件中,你可以像这样编译和 运行 它:
$ c++ a.cpp -lz3
$ ./a.out
sat
y = 0
c = 0
x = 0
b = 0
a = 0
您得到的模型不是特别有趣,因为全 0 赋值可以平凡地满足它。但是您可以添加其他约束并获得更多有趣的值。