【问题标题】:Solve for expression variables using Z3 in C++在 C++ 中使用 Z3 求解表达式变量
【发布时间】:2020-03-25 15:22:48
【问题描述】:

例如,我怎样才能用 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 表达式

【问题讨论】:

标签: c++ z3


【解决方案1】:

这样的事情应该可以工作:

#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 的赋值微不足道地满足了它。但是您可以添加其他约束并获得更多有趣的值。

【讨论】:

    猜你喜欢
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多