1

不幸的是,我没有足够的声誉来评论其他问题的答案。所以我必须开始一个新的问题。

基本上我有与这里描述的相同的问题。我想使用 Z3 进行增量求解。为了让约束进入 Z3,我使用 smtlib2 字符串。第一组约束一切正常,我可以将变量声明等直接放入 smtlib2 字符串中。当增量添加附加约束时,Z3_parse_smtlib2_string 需要接收先前声明的数量 (unsigned num_decls)、声明 (Z3_func_decl const decls[]) 及其名称 (Z3_symbol const decl_names[])。对于 smtlib 字符串,Parser 接口提供检索此信息的函数,例如“Z3_get_smtlib_num_decls”和“Z3_get_smtlib_decl”。但是,它们不适用于 smtlib2 字符串。

有一个使用模型的解决方法。对于此解决方法,Z3 必须返回包含每个已声明变量的模型(“完整模型”),默认情况下似乎并非如此。此处已描述了此问题的解决方案(针对 Z3 4.0)。不幸的是,这不再适用于 Z3 4.3。

有人知道我如何从 Z3 获得完整的模型,而不是依赖于使用的版本吗?甚至更好:同时是否有更直接的方法来检索声明?大约一年前,Leonardo de Moura 提到未来会有“Parser”对象支持检索 decl、公式等(参见Z3 4.0:获取完整模型)。这里有什么我还没有在文档中发现的新东西吗?

非常感谢!

伊丽莎白

4

1 回答 1

1

您可以遍历子表达式以收集辅助排序和函数声明。以下扩展示例包含解析 SMTLIB2 的代码,它必须遍历返回的表达式以收集排序和函数声明。你可以在这里浏览

它使用 C++ API。函数 collect_decls 遍历表达式并收集未解释的排序和函数(此函数假定没有用户定义的代数数据类型并且不尝试提取这些)。

于 2013-05-20T13:20:27.790 回答