#ocaml #z3
#ocaml #z3
Вопрос:
Рассмотрим следующий фрагмент кода OCaml, который использует модуль Z3 для взаимодействия с решателем Z3. Код пытается определить новый TPair
тип данных в Z3 с помощью одного конструктора 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
оба вызывают ошибку сегментации. В чем может быть причина?
Комментарии:
1. Сообщите об этом автору библиотеки.
2. Приведенный здесь пример исходного кода компилируется (с предупреждениями) и работает нормально для меня. OCaml немного неустойчив. Не могли бы вы рассказать нам, какую именно версию вы используете и откуда вы это взяли? Кроме того, убедитесь, что вы используете последний исходный код Z3, и скомпилируйте его из исходного кода, поскольку с момента последнего двоичного выпуска было исправлено несколько исправлений.
Ответ №1:
Никакой код, написанный на чистом OCaml, не может вызвать ошибку сегментации. Это потому, что OCaml является языком, безопасным для памяти. Проблема где-то в системе, либо в том месте, где OCaml привязан к базовой библиотеке, либо в самой библиотеке z3.
Только авторы библиотек (или привязок) могут помочь вам в отладке и устранении этой проблемы. Поэтому, пожалуйста, создайте проблему в вышестоящем репозитории.
Комментарии:
1. Спасибо за ответ. Вопрос предназначен для сообщества Z3, поэтому я удалил тег OCaml. По какой-либо причине вы повторно добавили ее?
2. Конечно, в вопросе явно указан OCaml как в заголовке, так и в теле, он также включал код OCaml. Также похоже, что OP думает, что проблема в OCaml или в его коде, а не в библиотеке. Итак, моя задача состояла в том, чтобы объяснить, что OCaml сам по себе не может быть причиной таких проблем, поэтому корень проблемы следует искать в другом месте. Я надеюсь, что в будущем мой ответ поможет кому-то, кто будет искать «ошибка сегментации ocaml», явно указав, что проблема не может быть в коде OCaml.