如何使用z3 api录制或打印出名称列表中的术语,例如“a_ uc _1”和名单数量?
答案 0 :(得分:0)
不幸的是,没有用于执行所需操作的API。此信息在内部可用,但未在API中公开。 更改Z3代码以提取此信息并不困难。 在内部,以下函数用于解析SMT-LIB v2文件。
bool parse_smt2_commands(cmd_context & ctx,
std::istream & is,
bool interactive = false,
params_ref const & p = params_ref());
它在文件src/parsers/smt2/smt2parser.h
中定义。
cmd_context
对象在对象src/cmd_context/cmd_context.h
中定义。
它有以下方法:
ptr_vector<expr>::const_iterator begin_assertion_names() const;
ptr_vector<expr>::const_iterator end_assertion_names() const;
这两个方法可用于遍历用于在SMT-LIB v2文件中命名断言的所有名称。每个名称在内部表示为布尔变量。
如果ctx
是cmd_context
,我们可以使用以下代码遍历所有名称:
ptr_vector<expr>::const_iterator it = ctx.begin_assertion_names();
for (; it != ctx.end_assertion_names(); it++) {
expr * n = *it;
// do something
// here, we just print the name
std::cout << to_app(n)->get_decl()->get_name() << "\n";
}