Betrachten Sie das folgende OCaml-Code-Snippet, das das Z3-Modul als Schnittstelle zum Z3-Solver verwendet. Der Code versucht, einen neuen TPair
Datentyp in Z3 mit einem einzigen Konstruktor zu definieren T
, die zwei Integer-Argumente akzeptiert:Die OCaml-Bibliothek von Z3 löst einen Segmentierungsfehler aus
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
Die Anrufe get_tester_decl
und get_accessor_decls
beiden Wurfsegmentierungsfehler. Was könnte der Grund sein?
Melden Sie es dem Autor der Bibliothek. – camlspotter
Der hier angegebene Beispiel-Quellcode kompiliert (mit Warnungen) und läuft für mich gut. OCaml ist ein bisschen flakey. Kannst du uns sagen, welche Version du gerade verwendest und woher du das hast? Stellen Sie außerdem sicher, dass Sie den neuesten Z3-Quellcode verwenden, und kompilieren Sie ihn aus der Quelle, da seit der letzten Binärversion eine Reihe von Korrekturen vorgenommen wurden. –