我在.NET API中创建了一个现有的Z3 4.1上下文,包含许多函数声明,排序声明,断言假设等等。
使用此上下文中的所有现有声明解析SMT-LIB2字符串的最简洁方法是什么?具体来说,有没有办法迭代上下文中的所有声明?我没有在Context中看到任何允许我访问声明的方法。
目前,我正在做以下事情:
Context z3 = new Context();
// ... declare sorts, add declarations (parsing other input files), add assertions, to z3 context
List<FuncDecl> decls = new List<FuncDecl>();
List<Symbol> names = new List<Symbol>();
string pstr; // smtlib2 string to be parsed populated elsewhere
// ... populate decls and names by iterating over my internal data structures with references to these declarations
BoolExpr prop = z3.ParseSMTLIB2String(pstr, null, null, names.ToArray(), decls.ToArray());
有没有办法从z3上下文本身获取所有这些声明和符号名称?它们都已在z3对象中声明。我宁愿这样做,也不愿迭代我的内部数据结构。
我可能错过了它,但我没有看到任何让我在API中执行此操作的内容。我正在通过Solver.Assertions对可用的断言公式数组进行成像。
答案 0 :(得分:1)
您的解决方案看起来不错。可以在第一次出现时收集decls和名称,而不是为每次调用重建它们,这将消除每次调用的内部数据结构的迭代。请注意,如果要对Z3进行多次调用,则使用SMT解析器可能不是最有效的解决方案;如果可能的话,我建议直接构造Z3表达式而不是字符串(在这种情况下,也可能需要符号表)。