我需要使用C++來實現Z3集合的理論,系統應該像這樣工作: 1.構建支持使用C++的通用集合操作的約束系統;使用C++定義Z3的集合理論
- 添加在smtlib2格式附加約束,在這裏我使用 在C這個API將字符串轉換成EXPR:Z3_parse_smtlib2_string
對於集理論,我開始與萊昂納多在這篇文章中的原始答案: Defining a Theory of Sets with Z3/SMT-LIB2
我試過編碼在http://rise4fun.com/Z3/DWYC和一切工作正常rise4fun。但是,我將編碼轉換爲C++代碼時遇到了一些麻煩,我無法在Z3中爲C++找到任何設置的API。 有沒有例子?
然後我發現z3_api.h包含c的set API。所以我寫了一個非常簡單的代碼片段,它似乎工作:
//https://github.com/Z3Prover/z3/blob/master/examples/c/test_capi.c#L105
Z3_context c = mk_context();
Z3_solver s = mk_solver(c);
Z3_sort ty = Z3_mk_int_sort(c);
Z3_ast emp = Z3_mk_empty_set(c, ty);
Z3_ast s1 = Z3_mk_empty_set(c, ty);
Z3_ast s2 = Z3_mk_empty_set(c, ty);
Z3_ast one = Z3_mk_int(c, 1, ty);
Z3_ast two = Z3_mk_int(c, 2, ty);
Z3_ast three = Z3_mk_int(c, 3, ty);
s1 = Z3_mk_set_add(c, s1, one);
s1 = Z3_mk_set_add(c, s1, two);
s2 = Z3_mk_set_add(c, s2, three);
Z3_ast intersect_array[2];
intersect_array[0] = s1;
intersect_array[1] = s2;
Z3_ast s3 = Z3_mk_set_intersect(c, 2, intersect_array);
Z3_ast assert1 = Z3_mk_eq(c, s3, emp);
Z3_solver_assert(c, s,assert1);
check(c, s, Z3_L_TRUE);
如果我使用Z3 ::上下文初始化Z3_context對象,而調用「Z3_mk_set_intersect」的代碼將拋出一個「分段故障」錯誤。
context ctx;
Z3_context c = ctx.operator _Z3_context *();
我想對字符串元素執行一些操作集,我不知道如何將它融入我的C++代碼,因爲我還創建了自己的Z3:用C++方面。我如何直接在C++中執行set操作?
謝謝,
尼古拉您好,感謝這麼多!我還發現,如果我在z3 ++。h(第132行)中將Z3_mk_context_rc更改爲Z3_mk_context,則沒有分段錯誤。但顯然你的方法更清潔。 –