- This release marks the transition to the new GitHub fork & pull model; the unstable and contrib branches will be retired with all new contributions going into the master branch directly.
- New feature: Support for the theory of floating-point numbers. This comes in the form of logics (QF_FP and QF_FPBV), tactics (qffp and qffpbv), as well as a theory plugin that allows theory combinations. Z3 supports the official SMT theory definition of FP (see http://smtlib.cs.uiowa.edu/theories/FloatingPoint.smt2) in SMT2 files, as well as all APIs.
- Upgrade: This release includes a brand new OCaml/ML API that is much better integrated with the build system, and hopefully also easier to use than the previous one.
- Fixed various bugs reported by Marc Brockschmidt, Venkatesh-Prasad Ranganath, Enric Carbonell, Morgan Deters, Tom Ball, Malte Schwerhoff, Amir Ebrahimi, Codeplex users rsas, clockish, Heizmann, susmitj, steimann, and Stackoverflow users user297886.
- Fixed a multitude of bugs and inconsistencies that were reported to us either in person, by email, or on Codeplex. Of those that we do have records of, we would like to express our gratitude to:
Vladimir Klebanov, Konrad Jamrozik, Nuno Lopes, Carsten Ruetz, Esteban Pavese, Tomer Weiss, Ilya Mironov, Gabriele Paganelli, Levent Erkok, Fabian Emmes, David Cok, Etienne Kneuss, Arlen Cox, Matt Lewis, Carsten Otto, Paul Jackson, David Monniaux, Markus Rabe, Martin Pluecker, Jasmin Blanchette, Jules Villard, Andrew Gacek, George Karpenkov, Joerg Pfaehler, and Pablo Aledo
as well as the following Codeplex users that either reported bugs or took part in discussions:
- New parameter setting infrastructure. Now, it is possible to set parameter for Z3 internal modules. Several parameter names changed. Execute `z3 -p` for the new parameter list.
- Added new option to mk_make to allow users to specify where python bindings (Z3Py) will be installed. (Thanks to Dejan Jovanovic for reporting the problem).
- Relax check_logic procedure. Now, it accepts coercions (to_real) automatically introduced by Z3. (Thanks to Paul Jackson). This is a fix for http://z3.codeplex.com/workitem/19.
- Allow negative numerals in the SMT 2.0 frontend. That is, Z3 SMT 2.0 parser now accepts numerals such as "-2". It is not needed to encode them as "(- 2)" anymore.
The parser still accepts -foo as a symbol. That is, it is *not* a shorthand for (- foo).
This feature is disabled when SMTLIB2_COMPLIANT=true is set in the command line.
- Fixed bug in Z3Py. The method that builds Z3 applications could crash if one of the arguments have to be "casted" into the correct sort (Thanks to Dennis Yurichev).
- Fixed bug in datatype theory (Thanks to Ayrat).
- Fixed bug in the definition of MkEmptySet and MkFullSet in the .Net API.
- Display warning message and ignore option CASE_SPLIT=3,4 or 5 when auto configuration is enabled (AUTO_CONFIG=true) (Thanks Tobias from StackOverflow).
- Made the predicates <, <=, > and >= chainable as defined in the SMT 2.0 standard (Thanks to Matthias Weiler).
- Added missing Z3_decl_kind's for datatypes: Z3_OP_DT_CONSTRUCTOR, Z3_OP_DT_ACCESSOR, Z3_OP_DT_RECOGNISER.
- Added support for numbers in scientific notation at Z3_ast Z3_mk_numeral(__in Z3_context c, __in Z3_string numeral, __in Z3_sort ty).
- New builtin symbols in the arithmetic theory: pi, euler, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh, asinh, acosh, atanh. The first two are constants, and the others are unary functions. These symbols are not available if a SMT 2.0 logic is specified (e.g., QF_LRA, QF_NRA, QF_LIA, etc) because these symbols are not defined in these logics. That is, the new symbols are only available if the logic is not specified.
- Fixed bug in term-if-then-else elimination (Thanks to Artur Niewiadomski).
- Fixed bug in difference logic detection code (Thanks to Dejan Jovanovic).
- Fixed bug in the pseudo-boolean preprocessor (Thanks to Adrien Champion).
- Fixed bug in bvsmod preprocessing rules (Thanks to Dejan Jovanovic).
- Fixed bug in Tactic tseitin-cnf (Thanks to Georg Hofferek).
- Added missing simplification step in nlsat.
- Fixed bug in model construction for linear real arithmetic (Thanks to Marcello Bersani).
- Fixed bug in preprocessor that eliminated rational powers (e.g., (^ x (/ 1.0 2.0))), the bug affected only problems where the denominator was even (Thanks to Johannes Eriksson).
- Fixed bug in the k-th root operation in the algebraic number package. The result was correct, but the resulting polynomial could be incorrectly tagged as minimal and trigger nontermination on comparison operations. (Thanks to Johannes Eriksson).
- Fixed bug affecting problems containing patterns with n-ary arithmetic terms such as (p (+ x y 2)). This bug was introduced in Z3 4.0. (Thanks to Paul Jackson).
- Fixed crash when running out of memory.
- Fixed crash reported by Alex Summers. The crash was happening on scripts that contain quantifiers, and use boolean formulas inside terms.
- Fixed crash in the MBQI module (Thanks to Stephan Falke).
- Fixed bug in the E-matching engine. It was missing instances of multi-patterns (Thanks Alex Summers).
- Fixed bug in Z3Py pretty printer.
- The pattern inference module does not generate warning messages by default anymore. This module was responsible for producing messages such as: "WARNING: failed to find a pattern for quantifier (quantifier id: k!199)". The option PI_WARNINGS=true can be used to enable these warning messages.
- Added missing return statements in z3++.h (Thanks to Daniel Neider).
- Removed support for TPTP5 and Simplify input formats.
- Removed support for Z3 (low-level) input format. It is still available in the API.
- Removed support for "SMT 1.5" input format (aka .smtc files). This was a hybrid input format that was implemented while the SMT 2.0 standard was being designed. Users should move to SMT 2.0 format. Note that SMT 1.0 format is still available.
- Made tseitin-cnf tactic more "user friendly". It automatically applies required transformations needed to eliminate operators such as: and, distinct, etc.
- Implemented new PSC (principal subresultant coefficient) algorithm. This was one of the bottlenecks in the new nlsat solver/tactic.
Version 4.0
===========
Z3 4.0 is a major release. The main new features are:
- New C API, and it is backwards compatible, but several methods are marked as deprecated.
In the new API, many solvers can be created in the same context. It also includes support
for user defined strategies using Tactics. It also exposes a new interface for browsing models.
- A thin C++ layer around the C API that illustrates how to
leverage reference counting of ast objects.
Several examples can be found in the directory 'examples/c++'.
- New .NET API together with updated version of the legacy .NET API.
The new .NET API supports the new features, Tactics, Solvers, Goals,
and integration of with reference counting. Terms and sorts life-times
no longer requires a scoping discipline.
- <a class="el" href="http://rise4fun.com/Z3Py/tutorial/guide">Z3Py: Python interface for Z3</a>.
It covers all main features in the Z3 API.
- <a class="el" href="http://research.microsoft.com/apps/pubs/default.aspx?id=159549">NLSAT solver</a> for nonlinear arithmetic.
- The PDR algorithm in muZ.
- iZ3: an interpolating theorem prover built on top of Z3 (\ref iz3documentation). iZ3 is only available for Windows and Linux.
- New logging infrastructure. Z3 logs are used to record every Z3 API call performed by your application.
If you find a bug, just the log need to be sent to the Z3 team.
The following APIs were removed: Z3_trace_to_file, Z3_trace_to_stderr, Z3_trace_to_stdout, Z3_trace_off.
The APIs: Z3_open_log, Z3_append_log and Z3_close_log do not receive a Z3_context anymore.
When creating a log, you must invoke Z3_open_log before any other Z3 function call.
The new logs are much more precise.
However, they still have two limitations. They are not useful for logging applications that use callbacks (e.g., theory plugins)
because the log interpreter does not have access to these callbacks.
They are not precise for applications that are using multiple threads for processing multiple Z3 contexts.
- Z3 (for Linux and OSX) does not depend on GMP anymore.
- Z3 1.x backwards compatibility macros are defined in z3_v1.h. If you still use them, you have to explicitly include this file.
- Fixed all bugs reported at Stackoverflow.
Temporarily disabled features:
- User theories cannot be used with the new Solver API yet. Users may still use them with the deprecated solver API.
- Parallel Z3 is also disabled in this release. However, we have parallel combinators for creating stragegies (See <a href="http://rise4fun.com/Z3/tutorial/strategies"> tutorial</a>).
The two features above will return in future releases.
Here is a list of all <a class="el" href="deprecated.html">deprecated functions</a>.
Version 3.2
===========
This is a bug-fix refresh that fixes reported problems with 3.1.
- Added support for chainable and right associative attributes.
- Fixed model generation for QBVF (aka UFBV) logic. Now, Z3 officially supports the logics BV and UFBV.
These are essentially QF_BV and QF_UFBV with quantifiers.
- Fixed bug in eval and get-value commands. Thanks to Levent Erkok.
- Fixed performance bug that was affecting VCC and Slayer. Thanks to Michal Moskal.
- Fixed time measurement on Linux. Thanks to Ayrat Khalimov.
- Fixed bug in destructive equality resolution (DER=true).
- Fixed bug in map operator in the theory of arrays. Thanks to Shaz Quadeer.
- Improved OCaml build scripts for Windows. Thanks to Josh Berdine.
- Fixed crash in MBQI (when Real variables were used).
- Fixed bugs in quantifier elimination. Thanks to Josh Berdine.
- Fixed crash when an invalid datatype declaration is used.
- Fixed bug in the SMT2 parser.
- Fixed crash in quick checker for quantified formulas. Thanks to Swen Jacobs.
- Fixed bug in the bvsmod simplifier. Thanks to Trevor Hansen.
- New APIs: \c Z3_substitute and \c Z3_substitute_vars.
- Fixed crash in MBQI. Thanks to Dejan Jovanovic.
Version 3.1
===========
This is a bug-fix refresh that fixes reported problems with 3.0.
- Fixed a bug in model generation. Thanks to Arlen Cox and Gordon Fraser.
- Fixed a bug in Z3_check_assumptions that prevented it from being used between satisfiable instances. Thanks to Krystof Hoder.
- Fixed two bugs in quantifier elimination. Thanks to Josh Berdine.
- Fixed bugs in the preprocessor.
- Fixed performance bug in MBQI. Thanks to Kathryn Stolee.
- Improved strategy for QBVF (aka UFBV) logic.
- Added support for negative assumptions in the check-sat command.
Version 3.0
===========
- Fully compliant SMT-LIB 2.0 (SMT2) front-end. The old front-end is still available (command line option -smtc).
The <a class="el" href="http://rise4fun.com/z3/tutorial/guide">Z3 Guide</a> describes the new front-end.
- Parametric inductive datatypes, and parametric user defined types.
- New SAT solver. Z3 can also read dimacs input formulas.
- New Bitvector (QF_BV) solver. The new solver is only available when using the new SMT2 front-end.
- Rewriter that uses universally quantified equations PRE_DEMODULATOR=true (yes, the option name is not good, we will change it in a future release).
- REDUCE_ARGS=true (this transformation is essentially a partial ackermannization for functions where a particular argument is always an interpreted value).
- Better support for macro detection (a macro is a universally quantified formula of the form Forall X. F(X) = T[X]). We also change the option name, now it is called MACRO_FINDER=true.
- ELIM_QUANTIFIERS=true enables quantifier elimination methods. Previous variants called QUANT_ARITH are deprecated.