Z3モジュールを使用してZ3ソルバとインターフェイスする次のOCamlコードスニペットを考えてみましょう。コードは、2つの整数の引数を受け入れ、単一のコンストラクタT
とZ3に新しいTPair
データ型を定義しようとします:Z3のOCamlライブラリがセグメント化エラーをスローする
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
の両方への呼び出しセグメンテーションフォールトをスローします。理由は何でしょうか?
ライブラリ作成者に報告してください。 – camlspotter
ここで与えられたサンプルソースコードは(警告付きで)コンパイルされ、うまく動作します。 OCamlは少しフレークです。正確にあなたが使っているバージョンとそのバージョンを教えてください。また、最新のZ3ソースコードを使用していることを確認し、ソースからコンパイルしてください。最後のバイナリリリース以降にいくつか修正されています。 –