Z3 c ++ api替换数组

时间:2015-12-10 12:16:33

标签: c++ arrays z3 substitution

我正在尝试对包含数组和整数的表达式使用替换。替换后我得到分段错误。

以下是代码:

    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上测试替换,则成功。 我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

这里的问题是你正在混合使用C和C ++代码(z3.h和z3 ++。h)。 Z3 C-API不会为您执行引用计数,因此每次Z3_inc_refZ3_ast每次Z3_dec_ref退出时,您都必须致电Z3_ast范围/使用。

C ++ API(z3 ++。h)的主要目的是抽象引用计数代码,但只有在不混合使用C代码时才能起作用。经验法则是:如果调用函数&#39; Z3 _ *&#39;然后它是一个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);