ocaml 上的 Z3 绑定
Z3 bindings on ocaml
我目前使用的是 ocaml 4.06.0,我正在尝试使用 Z3 sat 求解器。我正在使用 opam 的绿洲来编译文件(它成功地构建了所有内容)。但是,当我 运行 生成本机代码时,出现以下错误:error while loading shared libraries: libz3.so
。我尝试重新安装 z3 包,但错误仍然存在。谁能帮我解决这个问题,因为我不知道还能尝试什么?
这是我刚才在 Ubuntu 18.04.1 下安装 z3 所做的:
$ opam depext conf-gmp.1
$ opam depext conf-m4.1
这些在 opam 之外安装了 gmp 和 m4。印象深刻。
$ opam install z3
现在 z3 库已安装,您可以从 OCaml 代码中使用它。但是没有安装可执行文件(我能找到)。
$ export LD_LIBRARY_PATH=~/.opam/4.06.0/lib/z3
$ ocaml -I ~/.opam/4.06.0/lib/z3
OCaml version 4.06.0
# #load "nums.cma";;
# #load "z3ml.cma";;
# let ctx = Z3.mk_context [];;
val ctx : Z3.context = <abstr>
LD_LIBRARY_PATH
的设置使得找到 libz3.so
成为可能。
这是我目前所了解的。也许这会有所帮助。
更新
下面是我编译和link编辑测试程序的方法。
$ export LD_LIBRARY_PATH=~/.opam/4.06.0/lib/z3
$ cat tz3.ml
let context = Z3.mk_context []
let solver = Z3.Solver.mk_solver context None
let xsy = Z3.Symbol.mk_string context "x"
let x = Z3.Boolean.mk_const context xsy
let () = Z3.Solver.add solver [x]
let main () =
match Z3.Solver.check solver [] with
| UNSATISFIABLE -> Printf.printf "unsat\n"
| UNKNOWN -> Printf.printf "unknown"
| SATISFIABLE ->
match Z3.Solver.get_model solver with
| None -> ()
| Some model ->
Printf.printf "%s\n"
(Z3.Model.to_string model)
let () = main ()
$ ocamlopt -I ~/.opam/4.06.0/lib/z3 -o tz3 \
nums.cmxa z3ml.cmxa tz3.ml
$ ./tz3
(define-fun x () Bool
true)
$ unset LD_LIBRARY_PATH
$ ./tz3
./tz3: error while loading shared libraries: libz3.so:
cannot open shared object file: No such file or directory
它起作用了——也就是说,它说简单的公式 x
可以通过使 x
成为 true
.
来满足
注意:一开始我觉得这里不需要设置LD_LIBRARY_PATH
。但是在后来的测试中我发现这是必要的。所以这可能是您问题的关键。
为您的程序 运行 设置 LD_LIBRARY_PATH
有点麻烦且容易出错。它足以用于个人测试,但可能不适用于任何更广泛的部署。在 link 时间可以设置共享库的搜索路径。
希望对您有所帮助。
我目前使用的是 ocaml 4.06.0,我正在尝试使用 Z3 sat 求解器。我正在使用 opam 的绿洲来编译文件(它成功地构建了所有内容)。但是,当我 运行 生成本机代码时,出现以下错误:error while loading shared libraries: libz3.so
。我尝试重新安装 z3 包,但错误仍然存在。谁能帮我解决这个问题,因为我不知道还能尝试什么?
这是我刚才在 Ubuntu 18.04.1 下安装 z3 所做的:
$ opam depext conf-gmp.1
$ opam depext conf-m4.1
这些在 opam 之外安装了 gmp 和 m4。印象深刻。
$ opam install z3
现在 z3 库已安装,您可以从 OCaml 代码中使用它。但是没有安装可执行文件(我能找到)。
$ export LD_LIBRARY_PATH=~/.opam/4.06.0/lib/z3
$ ocaml -I ~/.opam/4.06.0/lib/z3
OCaml version 4.06.0
# #load "nums.cma";;
# #load "z3ml.cma";;
# let ctx = Z3.mk_context [];;
val ctx : Z3.context = <abstr>
LD_LIBRARY_PATH
的设置使得找到 libz3.so
成为可能。
这是我目前所了解的。也许这会有所帮助。
更新
下面是我编译和link编辑测试程序的方法。
$ export LD_LIBRARY_PATH=~/.opam/4.06.0/lib/z3
$ cat tz3.ml
let context = Z3.mk_context []
let solver = Z3.Solver.mk_solver context None
let xsy = Z3.Symbol.mk_string context "x"
let x = Z3.Boolean.mk_const context xsy
let () = Z3.Solver.add solver [x]
let main () =
match Z3.Solver.check solver [] with
| UNSATISFIABLE -> Printf.printf "unsat\n"
| UNKNOWN -> Printf.printf "unknown"
| SATISFIABLE ->
match Z3.Solver.get_model solver with
| None -> ()
| Some model ->
Printf.printf "%s\n"
(Z3.Model.to_string model)
let () = main ()
$ ocamlopt -I ~/.opam/4.06.0/lib/z3 -o tz3 \
nums.cmxa z3ml.cmxa tz3.ml
$ ./tz3
(define-fun x () Bool
true)
$ unset LD_LIBRARY_PATH
$ ./tz3
./tz3: error while loading shared libraries: libz3.so:
cannot open shared object file: No such file or directory
它起作用了——也就是说,它说简单的公式 x
可以通过使 x
成为 true
.
注意:一开始我觉得这里不需要设置LD_LIBRARY_PATH
。但是在后来的测试中我发现这是必要的。所以这可能是您问题的关键。
为您的程序 运行 设置 LD_LIBRARY_PATH
有点麻烦且容易出错。它足以用于个人测试,但可能不适用于任何更广泛的部署。在 link 时间可以设置共享库的搜索路径。
希望对您有所帮助。