我正在http://research.microsoft.com/en-us/um/redmond/projects/z3/ml/Z3.html浏览Z3的OCaml API,寻找一种方法来访问解算器返回的模型,满足一个简单的命题公式,即。只使用Z3的SAT部分,而不是“T”部分,例如。 p或q可能返回模型p = true,q = false。我能找到的最接近的是solver_get_model,它返回一个模型。但我找不到任何访问模型的方法,因为模型类型似乎不透明。我确实看到了一个函数,用于获取与函数符号(model_get_func_interp)相关联的解释,但这不是我想要的,即便如此我也看不到如何处理返回的信息(func_interp),因为这似乎也是不透明的类型。关于我能看到的唯一其他方法是将模型转换为字符串。这是唯一的方法吗?
感谢
答案 0 :(得分:1)
(公平警告:我自己没有使用过OCaml API,所以我根据我对C API的经验部分猜测了这一点。)
看看这个功能:
val model_get_const_interp : context -> model -> func_decl -> ast
context
和model
要传递的值应该清楚。现在你可能想知道为什么在你真正寻找常数的值时需要传递func_decl
。事实上,在SMT世界中,特别是在Z3中,常量就像没有参数的函数一样(因此文档中显示的前置条件get_arity c a == 0
)。
这将返回一个(选项类型)AST。下一步是针对true
或false
检查AST。一种方法是调用函数
val get_decl_kind : context -> func_decl -> decl_kind
然后,您可以将结果与OP_TRUE
和OP_FALSE
进行比较。
请注意,查询模型的另一种方法是使用
val model_eval : context -> model -> ast -> bool -> ast option
你可以将任何AST传递给这个函数(例如p∧¬q等)并以相同的方式读出结果。