Z3 c++api替换数组
Z3 c++ api substitution array
我正在尝试对包含数组和整数的表达式使用替换。替换后出现分段错误。
这是代码:
context cxt;
vector<Z3_ast> vars_ast,primed_vars_ast;
sort Int = cxt.int_sort();
sort Array = cxt.array_sort(Int,Int);
expr arr =cxt.constant("arr",Array);
vars_ast.push_back(arr);
expr i =cxt.int_const("i");
vars_ast.push_back(i);
expr test_expr = select(arr,i)==0 ;
primed_vars_ast.push_back(cxt.constant("arr_primed",Array));
primed_vars_ast.push_back(cxt.int_const("i_primed"));
expr cstr_expr (cxt,
ast(cxt,
Z3_substitute(cxt,
ast(test_expr),
vars_ast.size(),
vars_ast.data(),
primed_vars_ast.data())));
但是,如果我从ast数组中删除变量i
,而是对表达式test_expr = select(arr,1)==0
进行替换测试,那么它就成功了。我是不是错过了什么?
这里的问题是您混合了C和C++代码(z3.h和z3++.h)。z3 C-API不会为您进行引用计数,因此每次创建Z3_ast
和Z3_dec_ref
时,每次Z3_ast
超出范围/使用时,您都必须调用Z3_inc_ref
。
C++API(z3++.h)的主要目的是将引用计数代码抽象出来,但这只适用于不混合使用C代码的情况。经验法则是:如果一个函数被称为"Z3_*",那么它是一个C函数,如果它返回Z3_ast
,则立即将其放入expr
中,例如:
expr q(cxt, Z3_mk_select(cxt, arr, i));
在这个特定的示例中,我们可以将vector<Z3_ast>
更改为expr_vector
(附带z3+++.h)。然后可以将该示例修改为
context cxt;
expr_vector vars_ast(cxt), primed_vars_ast(cxt);
sort Int = cxt.int_sort();
sort Array = cxt.array_sort(Int,Int);
expr arr = cxt.constant("arr",Array);
vars_ast.push_back(arr);
expr i = cxt.int_const("i");
vars_ast.push_back(i);
expr test_expr = select(arr,i)==0;
primed_vars_ast.push_back(cxt.constant("arr_primed",Array));
primed_vars_ast.push_back(cxt.int_const("i_primed"));
test_expr.substitute(vars_ast, primed_vars_ast);
相关文章:
- 按平均值替换数组中的元素
- 如何将字节数组元素替换为修改的十六进制 ASCII 符号?
- C++ 替换字节数组中项的顺序
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 为什么数组中对象的析构函数在被另一个对象替换时不被调用?
- 替换 2D 数组中的字符
- 如何在给定文本中用字符数组替换符号
- 用现代C++STL数据结构替换旧的C风格数组
- 查找并替换数组的特定元素
- 如果在执行过程中替换二进制文件,"const"数组是否驻留在内存中?
- 我的函数不会用" "替换".",也不会按预期显示数组
- 用分层结构和类替换数组可以吗?
- 如何替换QT QML中的变体数组文本
- 为什么数据中的随机部分替换了曾经存储在我的角色数组中的其他数据
- C++ 在不使用 C 字符串库函数的情况下替换数组中的字符
- 用另一个1D数组替换2D数组的整个行
- 在函数的输入参数中将 char 数组替换为 std::string
- 用另一个字符数组替换一个字符数组
- 在哪里可以找到如何用函数数组替换"switch"运算符的示例?
- 将内置数组替换为std/tr1/boost::数组是否总是安全的?