\myheading{School-level system of equations} This is school-level system of equations copy-pasted from Wikipedia \footnote{\url{https://en.wikipedia.org/wiki/System_of_linear_equations}}: \begin{alignat*}{7} 3x &&\; + \;&& 2y &&\; - \;&& z &&\; = \;&& 1 & \\ 2x &&\; - \;&& 2y &&\; + \;&& 4z &&\; = \;&& -2 & \\ -x &&\; + \;&& \tfrac{1}{2} y &&\; - \;&& z &&\; = \;&& 0 & \end{alignat*} Will it be possible to solve it using Z3? Here it is: \begin{lstlisting} #!/usr/bin/python from z3 import * x = Real('x') y = Real('y') z = Real('z') s = Solver() s.add(3*x + 2*y - z == 1) s.add(2*x - 2*y + 4*z == -2) s.add(-x + 0.5*y - z == 0) print s.check() print s.model() \end{lstlisting} We see this after run: \begin{lstlisting} sat [z = -2, y = -2, x = 1] \end{lstlisting} If we change any equation in some way so it will have no solution, s.check() will return ``unsat''. I've used ``Real'' \emph{sort} (some kind of data type in \ac{SMT}-solvers) because the last expression equals to $\frac{1}{2}$, which is, of course, a real number. For the integer system of equations, ``Int'' \emph{sort} would work fine. Python (and other high-level \ac{PL}s like C\#) interface is highly popular, because it's practical, but in fact, there is a standard language for \ac{SMT}-solvers called SMT-LIB \footnote{\url{http://smtlib.cs.uiowa.edu/papers/smt-lib-reference-v2.6-r2017-07-18.pdf}}. Our example rewritten to it looks like this: \begin{lstlisting} (declare-const x Real) (declare-const y Real) (declare-const z Real) (assert (=(-(+(* 3 x) (* 2 y)) z) 1)) (assert (=(+(-(* 2 x) (* 2 y)) (* 4 z)) -2)) (assert (=(-(+ (- 0 x) (* 0.5 y)) z) 0)) (check-sat) (get-model) \end{lstlisting} This language is very close to LISP, but is somewhat hard to read for untrained eyes. Now we run it: \begin{lstlisting} % z3 -smt2 example.smt sat (model (define-fun z () Real (- 2.0)) (define-fun y () Real (- 2.0)) (define-fun x () Real 1.0) ) \end{lstlisting} So when you look back to my Python code, you may feel that these 3 expressions could be executed. This is not true: Z3Py API offers overloaded operators, so expressions are constructed and passed into the guts of Z3 without any execution \footnote{\url{https://github.com/Z3Prover/z3/blob/6e852762baf568af2aad1e35019fdf41189e4e12/src/api/python/z3.py}}. I would call it ``embedded \ac{DSL}''. Same thing for Z3 C++ API, you may find there ``operator+'' declarations and many more \footnote{\url{https://github.com/Z3Prover/z3/blob/6e852762baf568af2aad1e35019fdf41189e4e12/src/api/c\%2B\%2B/z3\%2B\%2B.h}}. Z3 \ac{API}s for Java, ML and .NET are also exist \footnote{\url{https://github.com/Z3Prover/z3/tree/6e852762baf568af2aad1e35019fdf41189e4e12/src/api}}.\\ \\ Z3Py tutorial: \url{https://github.com/ericpony/z3py-tutorial}. Z3 tutorial which uses SMT-LIB language: \url{http://rise4fun.com/Z3/tutorial/guide}.