【发布时间】:2023-03-27 15:42:01
【问题描述】:
考虑以下使用 Z3 模块与 Z3 求解器交互的 OCaml 代码 sn-p。代码尝试在 Z3 中使用一个接受两个整数参数的构造函数 T 定义一个新的 TPair 数据类型:
open Z3
open Z3.SMT
open Z3.Expr
open Z3.Symbol
open Z3.Datatype
open Z3.FuncDecl
open Z3.Arithmetic
open Z3.Arithmetic.Integer
open Z3.Quantifier
let _ =
let cfg = [("model", "true"); ("proof", "false")] in
let ctx = (mk_context cfg) in
let sym = Symbol.mk_string ctx in
let s_Int = mk_sort ctx in
(* (declare-datatypes () ((TPair (T Int Int) )))*)
let s_T = mk_constructor_s ctx "T" (sym "isT")
[sym "left"; sym "right"]
[Some s_Int; Some s_Int] [0; 0] in
let s_TPair = mk_sort_s ctx "TPair" [s_T] in
let _::s_content::_ = Constructor.get_accessor_decls s_T in
let s_isT = Constructor.get_tester_decl s_T in
let solver = Solver.mk_solver ctx None in
begin
Printf.printf "***** CONTEXT ******\n";
print_string @@ Solver.to_string solver;
Printf.printf "\n*********************\n"
end
对get_tester_decl 和get_accessor_decls 的调用都会引发分段错误。可能是什么原因?
【问题讨论】:
-
报告给图书馆作者。
-
这里给出的示例源代码可以编译(带有警告)并且对我来说运行良好。 OCaml 有点古怪。你能告诉我们你正在使用哪个版本以及你从哪里得到的吗?此外,请确保您使用的是最新的 Z3 源代码并从源代码编译它,因为自上一个二进制版本以来已经进行了许多修复。