Using ProB with Z3: Difference between revisions
| Line 38: | Line 38: | ||
>>> :z3 X<Y & Y<X & X:INTEGER | >>> :z3 X<Y & Y<X & X:INTEGER | ||
PREDICATE is FALSE | PREDICATE is FALSE | ||
Here an example that shows that Z3 can be used to solve constraints and obtain solutions for the open variables: | Here an example that shows that Z3 can be used to solve constraints and obtain solutions for the open variables: | ||
Revision as of 07:36, 6 June 2023
The current nightly versions of ProB can make use of Z3 as an alternate way of solving constraints.
How to use Z3 within ProB
One can start a REPL (Read-Eval-Print-Loop) by starting probcli with the '-repl' command line option. Any predicate preceded with :z3 will be solved by Z3 considering the current machine's state. The command :z3-free can be used to solve a constraint without considering the current machine's state. The full integration of Z3 and ProB’s kernel can be enabled by setting the corresponding preference by passing
-p SMT SUPPORTED INTERPRETER TRUE
on the command line.
How to install Z3 for ProB
For Linux and Mac OS, the extension is built on our infrastructure and ships with the regular ProB download. You don't need to install Z3 on your system.
What can be translated
Currently, the Z3 translation is unable to cope with the following constructs:
- Generalised concatenation
- Permutation
- Iteration and Closure
When using Z3 alone, the solver will report "unsupported_type_or_expression" if it can not handle parts of a constraint.
When used together with ProB, everything Z3 can not be coped with will be handled by ProB alone automatically.
Examples
Using the repl, one can try out different examples.
First an example which can be solved by Z3 and not by ProB:
>>> X<Y & Y<X & X:INTEGER % Timeout when posting constraint: % kernel_objects:(_981727#>0) ### Warning: enumerating X : INTEGER : inf:sup ---> -1:3 Existentially Quantified Predicate over X,Y is UNKNOWN [FALSE with ** ENUMERATION WARNING **]
Using the Z3 translation it can be solved:
>>> :z3 X<Y & Y<X & X:INTEGER PREDICATE is FALSE
Here an example that shows that Z3 can be used to solve constraints and obtain solutions for the open variables:
>>> :z3 {x} /\ {y} /= {} & x:1000000..20000000 & y>=0 & y<2000000
PREDICATE is TRUE
Solution:
x = 1000000
y = 1000000
As of version 1.10.0-beta4 you can also issue the <t>:z3-version</t> command in the REPL to obtain version information.
More details
A paper describing the integration of ProB and Z3 has been published at iFM 2016. You can download the
- raw data from our benchmarks including the R scripts to generate the
- resulting graphs.