Z3 对命题模型的质疑

Z3 对命题模型的质疑,z3,Z3,我正在浏览Z3的OCaml API,寻找一种访问由满足简单命题公式的解算器返回的模型的方法,即只使用Z3的SAT部分,而不是“T”部分,例如p或q可能返回模型p=true,q=false。我能找到的最接近的是solver_get_模型,它返回一个模型。但是我找不到任何访问模型的方法,因为模型类型似乎不透明。我确实看到了一个函数,用于获取与函数符号(model_get_func_interp)关联的解释,但这并不是我想要的,即使这样,我也看不到如何处理返回的信息(func_interp),因为这似

我正在浏览Z3的OCaml API,寻找一种访问由满足简单命题公式的解算器返回的模型的方法,即只使用Z3的SAT部分,而不是“T”部分,例如p或q可能返回模型p=true,q=false。我能找到的最接近的是solver_get_模型,它返回一个模型。但是我找不到任何访问模型的方法,因为模型类型似乎不透明。我确实看到了一个函数,用于获取与函数符号(model_get_func_interp)关联的解释,但这并不是我想要的,即使这样,我也看不到如何处理返回的信息(func_interp),因为这似乎也是一个不透明类型。我能看到的唯一其他方法是将模型转换为字符串。这是唯一的办法吗

谢谢

(警告:我自己还没有使用过OCAMLAPI,所以我从使用C API的经验中部分地猜测到了这一点。)

看看函数:

val model_get_const_interp : context -> model -> func_decl -> ast
要传递给
上下文
模型
的值应该是清晰的。现在,您可能想知道,在真正查找常量值时,为什么需要传递
func_decl
。问题是,在SMT世界中,尤其是在Z3中,常量就像没有参数的函数一样(因此前提条件
get_arity ca==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传递给此函数(例如∧ 以同样的方式读取结果。

(公平警告:我自己没有使用过OCAMLAPI,因此我从使用C API的经验中部分猜测到这一点。)

看看函数:

val model_get_const_interp : context -> model -> func_decl -> ast
要传递给
上下文
模型
的值应该是清晰的。现在,您可能想知道,在真正查找常量值时,为什么需要传递
func_decl
。问题是,在SMT世界中,尤其是在Z3中,常量就像没有参数的函数一样(因此前提条件
get_arity ca==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传递给此函数(例如∧ 以同样的方式读出结果。

谢谢!我来看看。我目前使用的是SMT-LIB接口,我觉得它不那么复杂!我来看看。我目前正在使用SMT-LIB接口,IMHO似乎不那么复杂