考虑以下OCaml代码片段,该代码片段使用Z3模块与Z3解算器连接。代码尝试在Z3中使用单个构造函数TPair
定义新的T
数据类型,该构造函数接受两个整数参数:
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
的调用都会导致分段错误。可能是什么原因?
答案 0 :(得分:1)
用纯OCaml编写的代码不会导致分段错误。这是因为OCaml是一种内存安全语言。问题出在管道中的某个地方,无论是在OCaml绑定到底层库的地方,还是在z3库本身。
只有库(或绑定)作者可以帮助您调试和解决此问题。所以,请在the upstream存储库中创建一个问题。