2016-10-06 3 views
0

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?

+1

Melden Sie es dem Autor der Bibliothek. – camlspotter

+0

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. –

Antwort

1

Kein Code, der in reinem OCaml geschrieben wurde, kann einen Segmentierungsfehler verursachen. Dies liegt daran, dass OCaml eine speicherfreundliche Sprache ist. Das Problem liegt irgendwo in der Installation, entweder an der Stelle, an der OCaml an die darunterliegende Bibliothek gebunden ist, oder in der z3-Bibliothek selbst.

Nur Autoren von Bibliotheken (oder Bindungen) können Ihnen beim Debuggen und Beheben dieses Problems behilflich sein. Bitte erstellen Sie ein Problem in the upstream Repository.

+0

Danke für die Antwort. Die Frage ist für die Z3-Community gedacht, also habe ich das OCaml-Tag entfernt. Irgendein Grund, den du es wieder hinzufügst? –

+0

Sicher, die Frage hat OCaml sowohl im Titel als auch im Text explizit erwähnt, es enthielt auch OCaml-Code. Es sieht auch so aus, dass OP meint, dass das Problem in OCaml oder in seinem Code nicht in der Bibliothek liegt. Meine Aufgabe bestand also darin, zu erklären, dass OCaml an sich kein Grund für solche Probleme sein kann, weshalb die Wurzel des Problems an anderer Stelle gesucht werden sollte. Ich hoffe, dass meine Antwort in Zukunft jemandem helfen wird, der nach "segmentation fault + ocaml" sucht, indem er ausdrücklich sagt, dass das Problem nicht im OCaml Code sein kann. – ivg

Verwandte Themen