不幸的是,我没有足够的声誉评论其他问题的答案。所以我必须开始一个新问题。
基本上我遇到与here所述相同的问题。我想用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必须返回包含每个声明变量(“完整模型”)的模型,默认情况下似乎不是这种情况。已经描述了针对该问题的解决方案here(对于Z3 4.0)。不幸的是,这不再适用于Z3 4.3。
有人知道如何从Z3获得完整的模型,这取决于使用的版本吗? 甚至更好:在此期间还有更直接的方法来检索声明吗?大约一年前,Leonardo de Moura提到将来会有“Parser”对象支持检索decls,公式等(见Z3 4.0: get complete model)。这里有什么新东西我还没有在文档中发现吗?
非常感谢!
伊丽莎白
答案 0 :(得分:1)
您可以遍历子表达式来收集辅助排序和函数声明。 以下扩展示例包含解析SMTLIB2的代码 并且它必须遍历返回的表达式以收集排序和函数声明。 您可以浏览here
它使用C ++ API。函数collect_decls遍历表达式并收集 无法识别的排序和函数(此函数假定没有用户定义的代数数据类型,并且不会尝试提取这些数据类型。)