使用可变数量的析取创建长分离的首选方法是什么?
我的猜测是这样的事情应该可以使用expr_vector
首先动态push_back
所有的析取,然后以某种方式使用Z3_mk_or
构建我的析取。
但是如何才能将Z3_ast
中的expr_vector
数组作为第三个参数传递给Z3_mk_or
?
答案 0 :(得分:3)
Z3 C ++ API不支持从expr_vector
对象创建n-ary析取。
我同意这是一个有用的功能,我将在下一个Z3版本中添加它。
您可以使用以下代码模拟此功能。以下代码并不完美,因为它创建了expr_vector的“副本”,但它可以用作临时解决方法。正如我上面所说,下一个版本将内置支持这种操作,并且将避免复制。
#include<vector>
#include<z3++.h>
using namespace z3;
expr mk_or(expr_vector args) {
std::vector<Z3_ast> array;
for (unsigned i = 0; i < args.size(); i++)
array.push_back(args[i]);
return to_expr(args.ctx(), Z3_mk_or(args.ctx(), array.size(), &(array[0])));
}
int main() {
context c;
expr_vector args(c);
args.push_back(c.bool_const("p"));
args.push_back(c.bool_const("q"));
args.push_back(c.bool_const("r"));
std::cout << mk_or(args) << std::endl;
return 0;
}
关于第二个问题,如果创建一个长序列的二进制析取而不是单个n-ary,则 no 会显着降低性能。 在内部,Z3可以非常有效地在二进制和n元格式之间进行转换。