簡體   English   中英

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_astZ3_dec_ref時都必須調用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM