Z3 unsat核心轨道SMT-LIB v2格式的命名术语列表

Z3 unsat核心轨道SMT-LIB v2格式的命名术语列表,z3,Z3,如何使用z3 api记录或打印带有名称列表的术语,如“a_uc_1”和名称列表的数量?不幸的是,没有api可以实现您想要的功能。此信息在内部可用,但未在API中公开。 更改Z3代码以提取此信息并不困难。 在内部,以下函数用于解析SMT-LIB v2文件 bool parse_smt2_命令(cmd_context&ctx, 标准::istream&is, bool interactive=false, params_ref const&p=params_ref()); 它在文件src/pars

如何使用z3 api记录或打印带有名称列表的术语,如“a_uc_1”和名称列表的数量?

不幸的是,没有api可以实现您想要的功能。此信息在内部可用,但未在API中公开。 更改Z3代码以提取此信息并不困难。 在内部,以下函数用于解析SMT-LIB v2文件

bool parse_smt2_命令(cmd_context&ctx,
标准::istream&is,
bool interactive=false,
params_ref const&p=params_ref());
它在文件
src/parsers/smt2/smt2parser.h
中定义

cmd\u context
对象在object
src/cmd\u context/cmd\u context.h
中定义

它有以下方法:

ptr_vector::const_迭代器begin_断言_names()const;
ptr_vector::const_迭代器end_断言_names()const;
这两种方法可用于遍历SMT-LIB v2文件中用于命名断言的所有名称。每个名称在内部表示为布尔变量。 如果
ctx
cmd\u上下文
,我们可以使用以下方法遍历所有名称:

ptr_vector::const_iterator it=ctx.begin_assertion_names();
for(;it!=ctx.end_断言_名称();it++){
expr*n=*it;
//做点什么
//在这里,我们只需打印名称

std::cout_decl()->get_name()你不清楚你想做什么。你能改进这个问题并提供一个小例子吗?例如,找出unsat核心是(a_uuUC_u1 a_uUC_u2 a_uUC_u3 a_uUC_u4 a_uUC_u5 a_uUC_u6 a_u_u7)大小是7。有用吗?抱歉,我仍然不明白您想要什么。作为解决实例SMT-LIB v2格式,(设置选项:生成unsat cores true)(断言!(let((?def0 x1))(let(?def1(