Z3 对命题模型的质疑
我正在浏览Z3的OCaml API,寻找一种访问由满足简单命题公式的解算器返回的模型的方法,即只使用Z3的SAT部分,而不是“T”部分,例如p或q可能返回模型p=true,q=false。我能找到的最接近的是solver_get_模型,它返回一个模型。但是我找不到任何访问模型的方法,因为模型类型似乎不透明。我确实看到了一个函数,用于获取与函数符号(model_get_func_interp)关联的解释,但这并不是我想要的,即使这样,我也看不到如何处理返回的信息(func_interp),因为这似乎也是一个不透明类型。我能看到的唯一其他方法是将模型转换为字符串。这是唯一的办法吗 谢谢(警告:我自己还没有使用过OCAMLAPI,所以我从使用C API的经验中部分地猜测到了这一点。) 看看函数:Z3 对命题模型的质疑,z3,Z3,我正在浏览Z3的OCaml API,寻找一种访问由满足简单命题公式的解算器返回的模型的方法,即只使用Z3的SAT部分,而不是“T”部分,例如p或q可能返回模型p=true,q=false。我能找到的最接近的是solver_get_模型,它返回一个模型。但是我找不到任何访问模型的方法,因为模型类型似乎不透明。我确实看到了一个函数,用于获取与函数符号(model_get_func_interp)关联的解释,但这并不是我想要的,即使这样,我也看不到如何处理返回的信息(func_interp),因为这似
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似乎不那么复杂