Home

Awesome

License: GPL v3

OCaml Bindings for Yices 2

This repository provides an ocaml library containing bindings for yices2's standard API (https://yices.csl.sri.com/doc/).

Contents

Main library

The main OCaml library, called yices2, provides three levels of abstraction that wrap the yices C functions:

At each level lev, the types and module signatures are defined in file lev_types.ml and the bindings are in lev.ml/mli

The library also provides an SMTLib2 parser for OCaml.

Extension library

An additional OCaml library, called yices2.extensions, contains experimental extensions leveraging the bindings (e.g. tuple-blasting, etc).

SMT-solver executable

Building the bindings will also compile an executable yices_smt2.exe. That executable file is an SMT-solver you can run on an SMTLib2 file such as src_smt2/simple.smt2. The solver plugs the SMTLib parser with the Yices2 API bindings, so it is essentially running Yices2, through the Yices2 API rather than throug the Yices2 native front-end for SMTLib2. It is mostly there as an example of how you can use the Yices2 bindings, and offers a quick test that everything works.

Building and Installing

Dependencies

Outside of the OCaml world, you need Yices2 compiled and installed, with the MCSAT mode enabled, which means you also need the Yices2/MCSAT dependencies libpoly and CUDD. You also need gmp.

On the OCaml side, you need the libpoly OCaml bindings installed in findlib. All of the other dependencies are listed in yices2_bindings.opam and can be installed in findlib by opam (2.0 or higher), for instance

opam install . --deps-only

Building using opam (2.0 or higher)

In the directory of this README.md, build and install (in findlib) with the following command:

opam install .

This expects the yices library (and the libraries it depends on) to be present in the relevant paths (e.g., /usr/local/lib), as weel as its header files (e.g., /usr/local/include/). If for some reason these libraries are not in the usual paths, you can specify their paths by setting the environment variables LDFLAGS (for the yices library) and LD_LIBRARY_PATH (for its dependencies, like libpoly or cudd), as well as C_INCLUDE_PATH, e.g.:

export LD_LIBRARY_PATH=[UNCONVENTIONAL_PATHS]:/usr/local/lib
export LDFLAGS="-L[UNCONVENTIONAL_PATH]"
export C_INCLUDE_PATH="[UNCONVENTIONAL_PATH]"

Building without opam

Assuming that the dependencies have been installed, you can build the yices2 bindings by running the following command:

make

in the directory of this README.md.

To install (in findlib), run the following command:

make install

You can also use make reinstall and make clean.

Quick Testing

In the directory of this README.md, run the following command:

make test

Whether the tests pass is rather self-explanatory.

Again, if the non-OCaml dependencies are not installed in conventional directories, make sure you set LDFLAGS and LD_LIBRARY_PATH correctly as described above.

You can also run the yices_smt2.exe executable, giving as sole argument the name of the SMTLib2 file to solve, suuch as src_smt2/simple.smt2. As with make test, this step involves linking and requires yices being installed. You can set LDFLAGS as above in case it is not in a standard location.

The code in src_test and in the src_smt2/yices_smt2.ml file give examples on how to use the bindings.

Building the documentation

In the top-level directory, run the following command:

make doc

You can then open _build/default/_doc/_html/index.html in a web browser.