2015-12-12 10:01:27 +00:00
# Z3
2019-07-26 15:47:24 -07:00
Z3 is a theorem prover from Microsoft Research.
2025-03-07 11:47:32 -08:00
It is licensed under the [MIT license ](LICENSE.txt ). Windows binary distributions include [C++ runtime redistributables ](https://visualstudio.microsoft.com/license-terms/vs2022-cruntime/ )
2015-12-12 11:46:02 +00:00
2016-03-10 18:10:59 +01:00
If you are not familiar with Z3, you can start [here ](https://github.com/Z3Prover/z3/wiki#background ).
2025-01-07 23:31:45 +01:00
Pre-built binaries for stable and nightly releases are available [here ](https://github.com/Z3Prover/z3/releases ).
2015-12-12 11:46:02 +00:00
2025-05-15 09:47:29 -06:00
Z3 can be built using [Visual Studio][1], a [Makefile][2], using [CMake][3],
using [vcpkg][4], or using [Bazel][5].
It provides [bindings for several programming languages][6].
2018-10-17 09:55:15 -07:00
2022-07-22 23:45:07 +07:00
See the [release notes ](RELEASE_NOTES.md ) for notes on various stable releases of Z3.
2015-12-12 11:50:38 +00:00
2024-11-18 13:29:06 -08:00
[](https://microsoft.github.io/z3guide/)
2017-01-13 21:33:11 +00:00
## Build status
2025-04-19 13:46:40 -07:00
| Azure Pipelines | Open Bugs | Android Build | WASM Build | Windows Build | Pyodide Build | OCaml Build |
| --------------- | -----------|---------------|------------|---------------|---------------|-------------|
| [](https://dev.azure.com/Z3Public/Z3/_build/latest?definitionId=1& branchName=master) | [](https://github.com/Z3Prover/z3/actions/workflows/wip.yml) |[](https://github.com/Z3Prover/z3/actions/workflows/android-build.yml) | [](https://github.com/Z3Prover/z3/actions/workflows/wasm.yml) | [](https://github.com/Z3Prover/z3/actions/workflows/Windows.yml) | [](https://github.com/Z3Prover/z3/actions/workflows/pyodide.yml) | [](https://github.com/Z3Prover/z3/actions/workflows/ocaml-all.yaml) |
2021-12-25 17:36:28 -08:00
2015-12-12 11:46:02 +00:00
[1]: #building -z3-on-windows-using-visual-studio-command-prompt
[2]: #building -z3-using-make-and-gccclang
2016-03-14 08:27:46 +00:00
[3]: #building -z3-using-cmake
2025-05-15 09:47:29 -06:00
[4]: #building -z3-using-vcpkg
[5]: #building -z3-using-bazel
[6]: #z3 -bindings
2015-12-12 10:01:27 +00:00
## Building Z3 on Windows using Visual Studio Command Prompt
2025-01-07 23:31:45 +01:00
For 32-bit builds, start with:
2015-12-12 10:01:27 +00:00
```bash
2015-12-12 11:33:32 +00:00
python scripts/mk_make.py
2015-12-12 10:01:27 +00:00
```
or instead, for a 64-bit build:
```bash
2015-12-12 11:33:32 +00:00
python scripts/mk_make.py -x
2015-12-12 10:01:27 +00:00
```
2025-01-07 23:31:45 +01:00
then run:
2015-12-12 10:01:27 +00:00
```bash
2022-03-21 02:21:11 +08:00
cd build
2016-04-17 11:35:27 +01:00
nmake
2015-12-12 10:01:27 +00:00
```
2025-01-07 23:31:45 +01:00
Z3 uses C++20. The recommended version of Visual Studio is therefore VS2019 or later.
2021-06-15 12:25:03 -05:00
2015-12-12 10:31:12 +00:00
## Building Z3 using make and GCC/Clang
2015-12-12 10:01:27 +00:00
Execute:
```bash
2015-12-12 11:33:32 +00:00
python scripts/mk_make.py
2022-03-21 02:21:11 +08:00
cd build
2015-12-12 11:33:32 +00:00
make
sudo make install
2015-12-12 10:01:27 +00:00
```
2025-01-07 23:31:45 +01:00
Note by default ``g++` ` is used as C++ compiler if it is available. If you
prefer to use Clang, change the ``mk_make.py` ` invocation to:
2015-12-12 10:31:12 +00:00
```bash
2015-12-12 11:33:32 +00:00
CXX=clang++ CC=clang python scripts/mk_make.py
2015-12-12 10:31:12 +00:00
```
Note that Clang < 3.7 does not support OpenMP .
2016-06-07 12:15:51 +02:00
You can also build Z3 for Windows using Cygwin and the Mingw-w64 cross-compiler.
2025-01-07 23:31:45 +01:00
In that case, make sure to use Cygwin's own Python and not some Windows installation of Python.
2016-06-07 12:15:51 +02:00
2025-01-07 23:31:45 +01:00
For a 64-bit build (from Cygwin64), configure Z3's sources with
2016-06-07 12:15:51 +02:00
```bash
CXX=x86_64-w64-mingw32-g++ CC=x86_64-w64-mingw32-gcc AR=x86_64-w64-mingw32-ar python scripts/mk_make.py
```
2025-01-07 23:31:45 +01:00
A 32-bit build should work similarly (but is untested); the same is true for 32/64 bit builds from within Cygwin32.
2016-06-07 12:15:51 +02:00
2025-01-07 23:31:45 +01:00
By default, it will install z3 executables at ``PREFIX/bin` `, libraries at
``PREFIX/lib``, and include files at ``PREFIX/include``, where the ``PREFIX` `
2022-02-06 09:47:47 -08:00
installation prefix is inferred by the ``mk_make.py` ` script. It is usually
2018-10-02 17:38:09 +07:00
``/usr`` for most Linux distros, and ``/usr/local` ` for FreeBSD and macOS. Use
2025-01-07 23:31:45 +01:00
the ``--prefix=` ` command-line option to change the install prefix. For example:
2015-12-12 10:01:27 +00:00
```bash
2015-12-12 11:33:32 +00:00
python scripts/mk_make.py --prefix=/home/leo
2022-03-21 02:21:11 +08:00
cd build
2015-12-12 11:33:32 +00:00
make
make install
2015-12-12 10:01:27 +00:00
```
To uninstall Z3, use
```bash
2015-12-12 11:33:32 +00:00
sudo make uninstall
2015-12-12 10:01:27 +00:00
```
2025-01-07 23:31:45 +01:00
To clean Z3, you can delete the build directory and run the ``mk_make.py` ` script again.
2015-12-12 11:04:12 +00:00
2016-03-03 18:44:44 +00:00
## Building Z3 using CMake
2019-11-06 08:43:54 +01:00
Z3 has a build system using CMake. Read the [README-CMake.md ](README-CMake.md )
file for details. It is recommended for most build tasks,
except for building OCaml bindings.
2016-03-03 18:44:44 +00:00
2022-09-19 16:36:54 +00:00
## Building Z3 using vcpkg
2025-01-07 23:31:45 +01:00
vcpkg is a full platform package manager. To install Z3 with vcpkg, execute:
2022-09-19 16:36:54 +00:00
```bash
git clone https://github.com/microsoft/vcpkg.git
./bootstrap-vcpkg.bat # For powershell
./bootstrap-vcpkg.sh # For bash
./vcpkg install z3
```
2025-05-15 09:47:29 -06:00
## Building Z3 using Bazel
Z3 can be built using [Bazel ](https://bazel.build/ ). This is known to work on
Ubuntu with Clang (but may work elsewhere with other compilers):
```
bazel build //...
```
2020-07-27 09:35:50 -07:00
## Dependencies
2025-01-07 23:31:45 +01:00
Z3 itself has only few dependencies. It uses C++ runtime libraries, including pthreads for multi-threading.
2020-07-27 09:35:50 -07:00
It is optionally possible to use GMP for multi-precision integers, but Z3 contains its own self-contained
2025-01-07 23:31:45 +01:00
multi-precision functionality. Python is required to build Z3. Building Java, .NET, OCaml and
Julia APIs requires installing relevant toolchains.
2020-07-27 09:35:50 -07:00
2015-12-12 11:04:12 +00:00
## Z3 bindings
Z3 has bindings for various programming languages.
### ``.NET``
2025-01-07 23:31:45 +01:00
You can install a NuGet package for the latest release Z3 from [nuget.org ](https://www.nuget.org/packages/Microsoft.Z3/ ).
2019-10-17 10:00:41 -07:00
2016-01-11 22:45:57 +00:00
Use the ``--dotnet`` command line flag with ``mk_make.py` ` to enable building these.
2015-12-12 11:04:12 +00:00
See [``examples/dotnet`` ](examples/dotnet ) for examples.
### ``C``
These are always enabled.
See [``examples/c`` ](examples/c ) for examples.
### ``C++``
These are always enabled.
See [``examples/c++`` ](examples/c++ ) for examples.
### ``Java``
Use the ``--java`` command line flag with ``mk_make.py` ` to enable building these.
See [``examples/java`` ](examples/java ) for examples.
### ``OCaml``
Use the ``--ml`` command line flag with ``mk_make.py` ` to enable building these.
See [``examples/ml`` ](examples/ml ) for examples.
### ``Python``
2024-09-24 14:17:11 +00:00
You can install the Python wrapper for Z3 for the latest release from pypi using the command:
2019-10-17 10:00:41 -07:00
```bash
pip install z3-solver
```
2016-01-11 23:35:12 +00:00
Use the ``--python`` command line flag with ``mk_make.py` ` to enable building these.
2022-02-06 09:47:47 -08:00
Note that it is required on certain platforms that the Python package directory
2025-01-07 23:31:45 +01:00
(``site-packages`` on most distributions and ``dist-packages` ` on Debian-based
distributions) live under the install prefix. If you use a non-standard prefix
2016-01-11 23:35:12 +00:00
you can use the ``--pypkgdir` ` option to change the Python package directory
used for installation. For example:
```bash
python scripts/mk_make.py --prefix=/home/leo --python --pypkgdir=/home/leo/lib/python-2.7/site-packages
```
2025-01-07 23:31:45 +01:00
If you do need to install to a non-standard prefix, a better approach is to use
2016-01-11 23:35:12 +00:00
a [Python virtual environment ](https://virtualenv.readthedocs.org/en/latest/ )
2017-03-09 06:00:34 +01:00
and install Z3 there. Python packages also work for Python3.
Under Windows, recall to build inside the Visual C++ native command build environment.
2025-01-07 23:31:45 +01:00
Note that the ``build/python/z3` ` directory should be accessible from where Python is used with Z3
and it requires ``libz3.dll` ` to be in the path.
2016-01-11 23:35:12 +00:00
```bash
virtualenv venv
2016-01-12 11:25:30 +00:00
source venv/bin/activate
2016-01-11 23:35:12 +00:00
python scripts/mk_make.py --python
cd build
make
make install
# You will find Z3 and the Python bindings installed in the virtual environment
venv/bin/z3 -h
...
python -c 'import z3; print(z3.get_version_string())'
...
```
2015-12-12 11:04:12 +00:00
See [``examples/python`` ](examples/python ) for examples.
2017-03-09 06:00:34 +01:00
2020-04-24 01:05:50 +08:00
### ``Julia``
2024-09-24 14:17:11 +00:00
The Julia package [Z3.jl ](https://github.com/ahumenberger/Z3.jl ) wraps the C API of Z3. A previous version of it wrapped the C++ API: Information about updating and building the Julia bindings can be found in [src/api/julia ](src/api/julia ).
2020-04-24 01:05:50 +08:00
2025-01-07 23:31:45 +01:00
### ``WebAssembly`` / ``TypeScript`` / ``JavaScript``
2018-04-18 21:12:43 -07:00
2022-01-09 17:16:38 -08:00
A WebAssembly build with associated TypeScript typings is published on npm as [z3-solver ](https://www.npmjs.com/package/z3-solver ). Information about building these bindings can be found in [src/api/js ](src/api/js ).
2019-07-26 15:47:24 -07:00
2022-03-09 20:31:12 +00:00
### Smalltalk (``Pharo`` / ``Smalltalk/X``)
2025-01-07 23:31:45 +01:00
Project [MachineArithmetic ](https://github.com/shingarov/MachineArithmetic ) provides a Smalltalk interface
to Z3's C API. For more information, see [MachineArithmetic/README.md ](https://github.com/shingarov/MachineArithmetic/blob/pure-z3/MachineArithmetic/README.md ).
2022-03-09 20:31:12 +00:00
2019-07-26 17:56:54 -07:00
## System Overview
2019-07-26 15:47:24 -07:00
2019-07-26 16:47:55 -07:00

2019-07-26 15:47:24 -07:00
2019-07-26 17:56:54 -07:00
## Interfaces
2019-07-26 15:47:24 -07:00
2019-07-26 15:48:07 -07:00
* Default input format is [SMTLIB2 ](http://smtlib.cs.uiowa.edu )
2019-07-26 15:47:24 -07:00
* Other native foreign function interfaces:
2024-05-07 11:39:52 -07:00
* [C++ API ](https://z3prover.github.io/api/html/namespacez3.html )
2020-05-13 04:34:47 +02:00
* [.NET API ](https://z3prover.github.io/api/html/namespace_microsoft_1_1_z3.html )
* [Java API ](https://z3prover.github.io/api/html/namespacecom_1_1microsoft_1_1z3.html )
* [Python API ](https://z3prover.github.io/api/html/namespacez3py.html ) (also available in [pydoc format ](https://z3prover.github.io/api/html/z3.html ))
2023-10-24 00:28:02 +02:00
* [Rust ](https://github.com/prove-rs/z3.rs )
2020-05-13 04:34:47 +02:00
* C
* OCaml
* [Julia ](https://github.com/ahumenberger/Z3.jl )
2022-03-09 20:31:12 +00:00
* [Smalltalk ](https://github.com/shingarov/MachineArithmetic/blob/pure-z3/MachineArithmetic/README.md ) (supports Pharo and Smalltalk/X)
2019-07-26 15:47:24 -07:00
2024-08-28 10:32:07 -07:00
## Power Tools
* The [Axiom Profiler ](https://github.com/viperproject/axiom-profiler-2 ) currently developed by ETH Zurich
2019-07-26 15:47:24 -07:00