我需要使用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,则没有分段错误。但显然你的方法更清洁。 –