使用 Z3 的 C++ API 创建长析取
Create a long disjunction using the C++ api of Z3?
创建
具有可变数量的析取的长析取的首选方法是什么?
我的猜测是,使用expr_vector
首先动态push_back
所有析取,然后以某种方式使用Z3_mk_or
来构建我的析取,应该可以像这样的事情
但是我怎样才能从expr_vector
中获取Z3_ast
数组作为第三个参数传递给Z3_mk_or
?
顺便说一句,如果创建一个长序列的二进制析取,而不是一个长 n 元析取,是否有任何效率损失?
Z3 C++ API 不支持从expr_vector
对象创建 n 元析取。我同意这是一个有用的功能,我将在下一个 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元析取,则不会有明显的性能损失。在内部,Z3 可以非常有效地在二进制和 n 元格式之间进行转换。
相关文章:
- C++win32 API创建多个类似视口的窗口
- 使用Qt框架在c ++类中创建API调用
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 如何使用Windows API C++更改已创建的文件夹/目录安全权限
- 如何检查第三个 API 是否在 Linux 中为 c/c++ 程序创建了一个新线程?
- 两个线程一个使用流 Api,另一个线程创建文件失败并出现错误ERROR_SHARING_VIOLATION
- 创建进程 API 失败,在窗口 122 上出现错误代码 10
- 如何创建面向C++函数的C API
- C++为API中定义的结构创建超类
- Microsoft加密 API 是否允许从字节流创建 ECDSA 密钥?
- 如何在 DolphinDB 中使用 c plus plus API 提高创建表的性能
- 使用(非对象)API 时改变表数组C++而不重新创建整个平面缓冲区
- 使用OpenCV为使用GENICAM API和C++的各种相机创建程序
- 为什么创建进程 API 调用会导致内存访问冲突?
- 如何使用 CZMQ-4.0.2 新 zsock API 创建发布/订阅架构?
- 在创建类时根据模板参数更改类 API
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- 如何在 API 中创建私有函数
- GRPC创建Google Assistant API的频道链接
- 如果要创建 API,我应该使用静态库还是 DLL?