我的问题是,在Z3 C/C++ API中,如何从由Z3生成的模型中获取(索引,值)对。
我遇到了与以下问题相同的问题: 从z3模型中读取z3数组的func interp 然而,那个解决方案并不总是适用于我。
第一个断言可能会失败,因为函数:
如果忽略第一个断言错误并继续执行,第四个断言可能会失败,实际上是Z3_PARAMETER_SORT。
我发现旧版本的Z3库可以使用该答案,但我需要使用更新版本,因为新版本具有to_smt2()函数。
谢谢!
我遇到了与以下问题相同的问题: 从z3模型中读取z3数组的func interp 然而,那个解决方案并不总是适用于我。
assert(Z3_get_decl_kind(c, some_array_1_eval_func_decl) == Z3_OP_AS_ARRAY);
assert(Z3_is_app(c, some_array_1_eval));
assert(Z3_get_decl_num_parameters(c, some_array_1_eval_func_decl) == 1);
assert(Z3_get_decl_parameter_kind(c, some_array_1_eval_func_decl, 0) ==
Z3_PARAMETER_FUNC_DECL);
func_decl model_fd = func_decl(c,
Z3_get_decl_func_decl_parameter(c, some_array_1_eval_func_decl, 0));
第一个断言可能会失败,因为函数:
Z3_get_decl_kind(c, some_array_1_eval_func_decl)
(define-fun |choice.pc.1:1| () Bool
false)
(define-fun pc () (_ BitVec 4)
#x0)
(define-fun pc_miter_output () Bool
true)
(define-fun rom () (Array (_ BitVec 4) (_ BitVec 4))
(_ as-array k!0))
(define-fun |choice.pc.1:2| () Bool
true)
(define-fun k!0 ((x!0 (_ BitVec 4))) (_ BitVec 4)
(ite (= x!0 #x0) #x0
#x0))
我使用它来评估“rom”。如果我打印出结果,那就是:
((as const (Array (_ BitVec 4) (_ BitVec 4))) #x0)
我可以获取它的声明。就是这样
(declare-fun const ((_ BitVec 4)) (Array (_ BitVec 4) (_ BitVec 4)))
如果忽略第一个断言错误并继续执行,第四个断言可能会失败,实际上是Z3_PARAMETER_SORT。
我发现旧版本的Z3库可以使用该答案,但我需要使用更新版本,因为新版本具有to_smt2()函数。
谢谢!
(as const ...)
术语的第一个参数。该术语表示一个常量数组,即该数组对于所有索引具有相同的值。Z3_get_app_arg(ctx, term, 0)
应该给你这个值。 - Christoph Wintersteiger