Z3 4.0 Z3_解析_smtlib2_字符串

Z3 4.0 Z3_解析_smtlib2_字符串,z3,Z3,我通过C API/JNA/Scala将Z3与SMT2一起使用,并且似乎工作得很好 我想尝试增量求解。因此,首先我使用Z3_parse_smtlib2_字符串来翻译: 然后我得到一个Z3_ast,通过Z3_solver_断言将其放入一个解算器,使用Z3_solver_检查并通过Z3_solver_get_模型检索一个模型(如果检查返回的结果是可满足的,在本例中就是这种情况)。到目前为止没有问题 但是,当我想声明这样的附加内容时: (assert (= x 1)) 我被困在调用Z3_parse_s

我通过C API/JNA/Scala将Z3与SMT2一起使用,并且似乎工作得很好

我想尝试增量求解。因此,首先我使用Z3_parse_smtlib2_字符串来翻译:

然后我得到一个Z3_ast,通过Z3_solver_断言将其放入一个解算器,使用Z3_solver_检查并通过Z3_solver_get_模型检索一个模型(如果检查返回的结果是可满足的,在本例中就是这种情况)。到目前为止没有问题

但是,当我想声明这样的附加内容时:

(assert (= x 1))
我被困在调用Z3_parse_smtlib2_字符串的地方,因为它抱怨x是未知常量。如果在第二个代码段中添加declare fun,则会出现无效参数错误。 环境中不应该已经存在这个变量吗?我必须设置Z3_parse_smtlib2_字符串的附加参数吗?我怎样才能从先前解析的公式中得到它们

另外,使用did not work,因为Z3告诉我,初始化后无法修改此选项值

有人知道如何解决这个问题吗?

可以将现有排序和常量的列表作为额外的参数。因此,第二次调用它时,您可以告诉它您已经知道
x
代表什么


要从第一次解析过程中恢复声明的常量和排序,可以使用、
Z3\u get\u smtlib\u decl
和类似的排序方法。

无耻插件:您尝试过吗?(披露:我是主要作者。)。。我很快就接受了这个正确的答案。可能是Z3_get_smtlib_X函数仅在调用Z3_parse_smtlib_string或Z3_parse_smtlib_文件时才起作用,如注释所示?因为我得到了一个错误:解析器(数据)不可用…我找到了一种解决这个问题的方法:我不从解析器中获得我需要的信息(func decls和func name),而是从一个模型中获得:Z3_model_get_const_decl、Z3_model_get_func_decl和Z3_model_get_decl_name这些都是不推荐使用的API的一部分。但正如我所见,这是在SMTLIB2中使用增量求解的唯一方法。或者有人有其他建议吗?
(assert (= x 1))