9"""Z3 is a high performance theorem prover developed at Microsoft Research.
11Z3 is used in many applications such as: software/hardware verification and testing,
12constraint solving, analysis of hybrid systems, security, biology (in silico analysis),
13and geometrical problems.
16Please send feedback, comments and/or corrections on the Issue tracker for
17https://github.com/Z3prover/z3.git. Your comments are very valuable.
38... x = BitVec('x', 32)
40... # the expression x + y is type incorrect
42... except Z3Exception as ex:
43... print("failed: %s" % ex)
49from .z3consts
import *
50from .z3printer
import *
51from fractions
import Fraction
56if sys.version_info.major >= 3:
57 from typing
import Iterable, Iterator
59from collections.abc
import Callable
75if sys.version_info.major < 3:
77 return isinstance(v, (int, long))
80 return isinstance(v, int)
92 major = ctypes.c_uint(0)
93 minor = ctypes.c_uint(0)
94 build = ctypes.c_uint(0)
95 rev = ctypes.c_uint(0)
97 return "%s.%s.%s" % (major.value, minor.value, build.value)
101 major = ctypes.c_uint(0)
102 minor = ctypes.c_uint(0)
103 build = ctypes.c_uint(0)
104 rev = ctypes.c_uint(0)
106 return (major.value, minor.value, build.value, rev.value)
115 raise Z3Exception(msg)
119 _z3_assert(ctypes.c_int(n).value == n, name +
" is too large")
123 """Log interaction to a file. This function must be invoked immediately after init(). """
128 """Append user-defined string to interaction log. """
133 """Convert an integer or string into a Z3 symbol."""
141 """Convert a Z3 symbol back into a Python object. """
154 if len(args) == 1
and (isinstance(args[0], tuple)
or isinstance(args[0], list)):
156 elif len(args) == 1
and (isinstance(args[0], set)
or isinstance(args[0], AstVector)):
157 return [arg
for arg
in args[0]]
158 elif len(args) == 1
and isinstance(args[0], Iterator):
170 if isinstance(args, (set, AstVector, tuple)):
171 return [arg
for arg
in args]
179 if isinstance(val, bool):
180 return "true" if val
else "false"
191 """A Context manages all other Z3 objects, global configuration options, etc.
193 Z3Py uses a default global context. For most applications this is sufficient.
194 An application may use multiple Z3 contexts. Objects created in one context
195 cannot be used in another one. However, several objects may be "translated" from
196 one context to another. It is not safe to access Z3 objects from multiple threads.
197 The only exception is the method `interrupt()` that can be used to interrupt() a long
199 The initialization method receives global configuration options for the new context.
204 _z3_assert(len(args) % 2 == 0,
"Argument list must have an even number of elements.")
223 if Z3_del_context
is not None and self.
owner:
229 """Return a reference to the actual C pointer to the Z3 context."""
233 """Interrupt a solver performing a satisfiability test, a tactic processing a goal, or simplify functions.
235 This method can be invoked from a thread different from the one executing the
236 interruptible procedure.
241 """Return the global parameter description set."""
245 """Set the pretty printing mode for ASTs.
247 The following modes are available:
248 - Z3_PRINT_SMTLIB_FULL (0): Print AST nodes in SMTLIB verbose format.
249 - Z3_PRINT_LOW_LEVEL (1): Print AST nodes using a low-level format.
250 - Z3_PRINT_SMTLIB2_COMPLIANT (2): Print AST nodes in SMTLIB 2.x compliant format.
255 >>> c.set_ast_print_mode(Z3_PRINT_SMTLIB2_COMPLIANT)
267 """Return a reference to the global Z3 context.
270 >>> x.ctx == main_ctx()
275 >>> x2 = Real('x', c)
282 if _main_ctx
is None:
299 """Set Z3 global (or module) parameters.
301 >>> set_param(precision=10)
304 _z3_assert(len(args) % 2 == 0,
"Argument list must have an even number of elements.")
308 if not set_pp_option(k, v):
323 """Reset all global (or module) parameters.
329 """Alias for 'set_param' for backward compatibility.
335 """Return the value of a Z3 global (or module) parameter
337 >>> get_param('nlsat.reorder')
340 ptr = (ctypes.c_char_p * 1)()
342 r = z3core._to_pystr(ptr[0])
344 raise Z3Exception(
"failed to retrieve value for '%s'" % name)
356 """Superclass for all Z3 objects that have support for pretty printing."""
362 in_html = in_html_mode()
365 set_html_mode(in_html)
370 """AST are Direct Acyclic Graphs (DAGs) used to represent sorts, declarations and expressions."""
378 if self.
ctx.ref()
is not None and self.
ast is not None and Z3_dec_ref
is not None:
386 return obj_to_string(self)
389 return obj_to_string(self)
392 return self.
eq(other)
405 elif is_eq(self)
and self.num_args() == 2:
406 return self.arg(0).
eq(self.arg(1))
408 raise Z3Exception(
"Symbolic expressions cannot be cast to concrete Boolean values.")
411 """Return a string representing the AST node in s-expression notation.
414 >>> ((x + 1)*x).sexpr()
420 """Return a pointer to the corresponding C Z3_ast object."""
424 """Return unique identifier for object. It can be used for hash-tables and maps."""
428 """Return a reference to the C context where this AST node is stored."""
429 return self.
ctx.ref()
432 """Return `True` if `self` and `other` are structurally identical.
439 >>> n1 = simplify(n1)
440 >>> n2 = simplify(n2)
449 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
455 >>> # Nodes in different contexts can't be mixed.
456 >>> # However, we can translate nodes from one context to another.
457 >>> x.translate(c2) + y
461 _z3_assert(isinstance(target, Context),
"argument must be a Z3 context")
468 """Return a hashcode for the `self`.
470 >>> n1 = simplify(Int('x') + 1)
471 >>> n2 = simplify(2 + Int('x') - 1)
472 >>> n1.hash() == n2.hash()
478 """Return a Python value that is equivalent to `self`."""
483 """Return `True` if `a` is an AST node.
487 >>> is_ast(IntVal(10))
491 >>> is_ast(BoolSort())
493 >>> is_ast(Function('f', IntSort(), IntSort()))
500 return isinstance(a, AstRef)
503def eq(a : AstRef, b : AstRef) -> bool:
504 """Return `True` if `a` and `b` are structurally identical AST nodes.
514 >>> eq(simplify(x + 1), simplify(1 + x))
548 _args = (FuncDecl * sz)()
550 _args[i] = args[i].as_func_decl()
558 _args[i] = args[i].as_ast()
566 _args[i] = args[i].as_ast()
574 elif k == Z3_FUNC_DECL_AST:
591 """A Sort is essentially a type. Every Z3 expression has a sort. A sort is an AST node."""
600 """Return the Z3 internal kind of a sort.
601 This method can be used to test if `self` is one of the Z3 builtin sorts.
604 >>> b.kind() == Z3_BOOL_SORT
606 >>> b.kind() == Z3_INT_SORT
608 >>> A = ArraySort(IntSort(), IntSort())
609 >>> A.kind() == Z3_ARRAY_SORT
611 >>> A.kind() == Z3_INT_SORT
617 """Return `True` if `self` is a subsort of `other`.
619 >>> IntSort().subsort(RealSort())
625 """Try to cast `val` as an element of sort `self`.
627 This method is used in Z3Py to convert Python objects such as integers,
628 floats, longs and strings into Z3 expressions.
631 >>> RealSort().cast(x)
640 """Return the name (string) of sort `self`.
642 >>> BoolSort().name()
644 >>> ArraySort(IntSort(), IntSort()).name()
650 """Return `True` if `self` and `other` are the same Z3 sort.
653 >>> p.sort() == BoolSort()
655 >>> p.sort() == IntSort()
663 """Return `True` if `self` and `other` are not the same Z3 sort.
666 >>> p.sort() != BoolSort()
668 >>> p.sort() != IntSort()
674 """Create the function space Array(self, other)"""
679 return AstRef.__hash__(self)
683 """Return `True` if `s` is a Z3 sort.
685 >>> is_sort(IntSort())
687 >>> is_sort(Int('x'))
689 >>> is_expr(Int('x'))
692 return isinstance(s, SortRef)
697 _z3_assert(isinstance(s, Sort),
"Z3 Sort expected")
701 if k == Z3_BOOL_SORT:
703 elif k == Z3_INT_SORT
or k == Z3_REAL_SORT:
705 elif k == Z3_BV_SORT:
707 elif k == Z3_ARRAY_SORT:
709 elif k == Z3_DATATYPE_SORT:
711 elif k == Z3_FINITE_FIELD_SORT:
713 elif k == Z3_FINITE_DOMAIN_SORT:
715 elif k == Z3_FLOATING_POINT_SORT:
717 elif k == Z3_ROUNDING_MODE_SORT:
719 elif k == Z3_RE_SORT:
721 elif k == Z3_SEQ_SORT:
723 elif k == Z3_CHAR_SORT:
725 elif k == Z3_TYPE_VAR:
730def _sort(ctx : Context, a : Any) -> SortRef:
735 """Create a new uninterpreted sort named `name`.
737 If `ctx=None`, then the new sort is declared in the global Z3Py context.
739 >>> A = DeclareSort('A')
740 >>> a = Const('a', A)
741 >>> b = Const('b', A)
753 """Type variable reference"""
763 """Create a new type variable named `name`.
765 If `ctx=None`, then the new sort is declared in the global Z3Py context.
780 """Function declaration. Every constant and function have an associated declaration.
782 The declaration assigns a name, a sort (i.e., type), and for function
783 the sort (i.e., type) of each of its arguments. Note that, in Z3,
784 a constant is a function with 0 arguments.
797 """Return the name of the function declaration `self`.
799 >>> f = Function('f', IntSort(), IntSort())
802 >>> isinstance(f.name(), str)
808 """Return the number of arguments of a function declaration.
809 If `self` is a constant, then `self.arity()` is 0.
811 >>> f = Function('f', IntSort(), RealSort(), BoolSort())
818 """Return the sort of the argument `i` of a function declaration.
819 This method assumes that `0 <= i < self.arity()`.
821 >>> f = Function('f', IntSort(), RealSort(), BoolSort())
830 """Return the sort of the range of a function declaration.
831 For constants, this is the sort of the constant.
833 >>> f = Function('f', IntSort(), RealSort(), BoolSort())
840 """Return the internal kind of a function declaration.
841 It can be used to identify Z3 built-in functions such as addition, multiplication, etc.
844 >>> d = (x + 1).decl()
845 >>> d.kind() == Z3_OP_ADD
847 >>> d.kind() == Z3_OP_MUL
855 result = [
None for i
in range(n)]
858 if k == Z3_PARAMETER_INT:
860 elif k == Z3_PARAMETER_DOUBLE:
862 elif k == Z3_PARAMETER_RATIONAL:
864 elif k == Z3_PARAMETER_SYMBOL:
866 elif k == Z3_PARAMETER_SORT:
868 elif k == Z3_PARAMETER_AST:
870 elif k == Z3_PARAMETER_FUNC_DECL:
872 elif k == Z3_PARAMETER_INTERNAL:
873 result[i] =
"internal parameter"
874 elif k == Z3_PARAMETER_ZSTRING:
875 result[i] =
"internal string"
877 raise Z3Exception(
"Unexpected parameter kind")
881 """Create a Z3 application expression using the function `self`, and the given arguments.
883 The arguments must be Z3 expressions. This method assumes that
884 the sorts of the elements in `args` match the sorts of the
885 domain. Limited coercion is supported. For example, if
886 args[0] is a Python integer, and the function expects a Z3
887 integer, then the argument is automatically converted into a
890 >>> f = Function('f', IntSort(), RealSort(), BoolSort())
900 _args = (Ast * num)()
905 tmp = self.
domain(i).cast(args[i])
907 _args[i] = tmp.as_ast()
912 """Return `True` if `a` is a Z3 function declaration.
914 >>> f = Function('f', IntSort(), IntSort())
921 return isinstance(a, FuncDeclRef)
925 """Create a new Z3 uninterpreted function with the given sorts.
927 >>> f = Function('f', IntSort(), IntSort())
933 _z3_assert(len(sig) > 0,
"At least two arguments expected")
938 dom = (Sort * arity)()
939 for i
in range(arity):
948 """Create a new fresh Z3 uninterpreted function with the given sorts.
952 _z3_assert(len(sig) > 0,
"At least two arguments expected")
957 dom = (z3.Sort * arity)()
958 for i
in range(arity):
971 """Create a new Z3 recursive with the given sorts."""
974 _z3_assert(len(sig) > 0,
"At least two arguments expected")
979 dom = (Sort * arity)()
980 for i
in range(arity):
989 """Set the body of a recursive function.
990 Recursive definitions can be simplified if they are applied to ground
993 >>> fac = RecFunction('fac', IntSort(ctx), IntSort(ctx))
994 >>> n = Int('n', ctx)
995 >>> RecAddDefinition(fac, n, If(n == 0, 1, n*fac(n-1)))
998 >>> s = Solver(ctx=ctx)
999 >>> s.add(fac(n) < 3)
1002 >>> s.model().eval(fac(5))
1012 _args[i] = args[i].ast
1023 """Constraints, formulas and terms are expressions in Z3.
1025 Expressions are ASTs. Every expression has a sort.
1026 There are three main kinds of expressions:
1027 function applications, quantifiers and bounded variables.
1028 A constant is a function application with 0 arguments.
1029 For quantifier free problems, all expressions are
1030 function applications.
1040 """Return the sort of expression `self`.
1052 """Shorthand for `self.sort().kind()`.
1054 >>> a = Array('a', IntSort(), IntSort())
1055 >>> a.sort_kind() == Z3_ARRAY_SORT
1057 >>> a.sort_kind() == Z3_INT_SORT
1063 """Return a Z3 expression that represents the constraint `self == other`.
1065 If `other` is `None`, then this method simply returns `False`.
1081 return AstRef.__hash__(self)
1084 """Return a Z3 expression that represents the constraint `self != other`.
1086 If `other` is `None`, then this method simply returns `True`.
1105 """Return the Z3 function declaration associated with a Z3 application.
1107 >>> f = Function('f', IntSort(), IntSort())
1120 """Return the Z3 internal kind of a function application."""
1127 """Return the number of arguments of a Z3 application.
1131 >>> (a + b).num_args()
1133 >>> f = Function('f', IntSort(), IntSort(), IntSort(), IntSort())
1143 """Return argument `idx` of the application `self`.
1145 This method assumes that `self` is a function application with at least `idx+1` arguments.
1149 >>> f = Function('f', IntSort(), IntSort(), IntSort(), IntSort())
1164 """Return a list containing the children of the given expression
1168 >>> f = Function('f', IntSort(), IntSort(), IntSort(), IntSort())
1174 return [self.
arg(i)
for i
in range(self.
num_args())]
1179 """Update the arguments of the expression.
1181 Return a new expression with the same function declaration and updated arguments.
1182 The number of new arguments must match the current number of arguments.
1184 >>> f = Function('f', IntSort(), IntSort(), IntSort())
1197 _args = (Ast * num)()
1198 for i
in range(num):
1199 _args[i] = args[i].
as_ast()
1212 """inverse function to the serialize method on ExprRef.
1213 It is made available to make it easier for users to serialize expressions back and forth between
1214 strings. Solvers can be serialized using the 'sexpr()' method.
1218 if len(s.assertions()) != 1:
1219 raise Z3Exception(
"single assertion expected")
1220 fml = s.assertions()[0]
1221 if fml.num_args() != 1:
1222 raise Z3Exception(
"dummy function 'F' expected")
1226 if isinstance(a, Pattern):
1230 if k == Z3_QUANTIFIER_AST:
1237 if sk == Z3_BOOL_SORT:
1239 if sk == Z3_INT_SORT:
1240 if k == Z3_NUMERAL_AST:
1243 if sk == Z3_REAL_SORT:
1244 if k == Z3_NUMERAL_AST:
1249 if sk == Z3_BV_SORT:
1250 if k == Z3_NUMERAL_AST:
1254 if sk == Z3_ARRAY_SORT:
1256 if sk == Z3_DATATYPE_SORT:
1258 if sk == Z3_FLOATING_POINT_SORT:
1262 return FPRef(a, ctx)
1263 if sk == Z3_FINITE_FIELD_SORT:
1265 if sk == Z3_FINITE_DOMAIN_SORT:
1266 if k == Z3_NUMERAL_AST:
1270 if sk == Z3_ROUNDING_MODE_SORT:
1272 if sk == Z3_SEQ_SORT:
1274 if sk == Z3_CHAR_SORT:
1276 if sk == Z3_RE_SORT:
1277 return ReRef(a, ctx)
1294 _z3_assert(s1.ctx == s.ctx,
"context mismatch")
1300 if not isinstance(a, ExprRef):
1302 if not isinstance(b, ExprRef):
1316 if isinstance(a, str)
and isinstance(b, SeqRef):
1318 if isinstance(b, str)
and isinstance(a, SeqRef):
1320 if isinstance(a, float)
and isinstance(b, ArithRef):
1322 if isinstance(b, float)
and isinstance(a, ArithRef):
1338 for element
in sequence:
1339 result = func(result, element)
1350 alist = [
_py2expr(a, ctx)
for a
in alist]
1351 s =
_reduce(_coerce_expr_merge, alist,
None)
1352 return [s.cast(a)
for a
in alist]
1356 """Return `True` if `a` is a Z3 expression.
1363 >>> is_expr(IntSort())
1367 >>> is_expr(IntVal(1))
1370 >>> is_expr(ForAll(x, x >= 0))
1372 >>> is_expr(FPVal(1.0))
1375 return isinstance(a, ExprRef)
1379 """Return `True` if `a` is a Z3 function application.
1381 Note that, constants are function applications with 0 arguments.
1388 >>> is_app(IntSort())
1392 >>> is_app(IntVal(1))
1395 >>> is_app(ForAll(x, x >= 0))
1398 if not isinstance(a, ExprRef):
1401 return k == Z3_NUMERAL_AST
or k == Z3_APP_AST
1405 """Return `True` if `a` is Z3 constant/variable expression.
1414 >>> is_const(IntVal(1))
1417 >>> is_const(ForAll(x, x >= 0))
1420 return is_app(a)
and a.num_args() == 0
1424 """Return `True` if `a` is variable.
1426 Z3 uses de-Bruijn indices for representing bound variables in
1434 >>> f = Function('f', IntSort(), IntSort())
1435 >>> # Z3 replaces x with bound variables when ForAll is executed.
1436 >>> q = ForAll(x, f(x) == x)
1442 >>> is_var(b.arg(1))
1449 """Return the de-Bruijn index of the Z3 bounded variable `a`.
1457 >>> f = Function('f', IntSort(), IntSort(), IntSort())
1458 >>> # Z3 replaces x and y with bound variables when ForAll is executed.
1459 >>> q = ForAll([x, y], f(x, y) == x + y)
1461 f(Var(1), Var(0)) == Var(1) + Var(0)
1465 >>> v1 = b.arg(0).arg(0)
1466 >>> v2 = b.arg(0).arg(1)
1471 >>> get_var_index(v1)
1473 >>> get_var_index(v2)
1482 """Return `True` if `a` is an application of the given kind `k`.
1486 >>> is_app_of(n, Z3_OP_ADD)
1488 >>> is_app_of(n, Z3_OP_MUL)
1491 return is_app(a)
and a.kind() == k
1494def If(a, b, c, ctx=None):
1495 """Create a Z3 if-then-else expression.
1499 >>> max = If(x > y, x, y)
1505 if isinstance(a, Probe)
or isinstance(b, Tactic)
or isinstance(c, Tactic):
1506 return Cond(a, b, c, ctx)
1513 _z3_assert(a.ctx == b.ctx,
"Context mismatch")
1518 """Create a Z3 distinct expression.
1525 >>> Distinct(x, y, z)
1527 >>> simplify(Distinct(x, y, z))
1529 >>> simplify(Distinct(x, y, z), blast_distinct=True)
1530 And(Not(x == y), Not(x == z), Not(y == z))
1535 _z3_assert(ctx
is not None,
"At least one of the arguments must be a Z3 expression")
1544 _z3_assert(a.ctx == b.ctx,
"Context mismatch")
1545 args[0] = a.as_ast()
1546 args[1] = b.as_ast()
1547 return f(a.ctx.ref(), 2, args)
1551 """Create a constant of the given sort.
1553 >>> Const('x', IntSort())
1557 _z3_assert(isinstance(sort, SortRef),
"Z3 sort expected")
1563 """Create several constants of the given sort.
1565 `names` is a string containing the names of all constants to be created.
1566 Blank spaces separate the names of different constants.
1568 >>> x, y, z = Consts('x y z', IntSort())
1572 if isinstance(names, str):
1573 names = names.split(
" ")
1574 return [
Const(name, sort)
for name
in names]
1578 """Create a fresh constant of a specified sort"""
1585def Var(idx : int, s : SortRef) -> ExprRef:
1586 """Create a Z3 free variable. Free variables are used to create quantified formulas.
1587 A free variable with index n is bound when it occurs within the scope of n+1 quantified
1590 >>> Var(0, IntSort())
1592 >>> eq(Var(0, IntSort()), Var(0, BoolSort()))
1602 Create a real free variable. Free variables are used to create quantified formulas.
1603 They are also used to create polynomials.
1612 Create a list of Real free variables.
1613 The variables have ids: 0, 1, ..., n-1
1615 >>> x0, x1, x2, x3 = RealVarVector(4)
1619 return [
RealVar(i, ctx)
for i
in range(n)]
1632 """Try to cast `val` as a Boolean.
1634 >>> x = BoolSort().cast(True)
1644 if isinstance(val, bool):
1648 msg =
"True, False or Z3 Boolean expression expected. Received %s of type %s"
1650 if not self.
eq(val.sort()):
1651 _z3_assert(self.
eq(val.sort()),
"Value cannot be converted into a Z3 Boolean value")
1655 return isinstance(other, ArithSortRef)
1665 """All Boolean expressions are instances of this class."""
1671 if isinstance(other, BoolRef):
1672 other =
If(other, 1, 0)
1673 return If(self, 1, 0) + other
1682 """Create the Z3 expression `self * other`.
1684 if isinstance(other, int)
and other == 1:
1685 return If(self, 1, 0)
1686 if isinstance(other, int)
and other == 0:
1688 if isinstance(other, BoolRef):
1689 other =
If(other, 1, 0)
1690 return If(self, other, 0)
1693 return And(self, other)
1696 return Or(self, other)
1699 return Xor(self, other)
1715 """Return `True` if `a` is a Z3 Boolean expression.
1721 >>> is_bool(And(p, q))
1729 return isinstance(a, BoolRef)
1733 """Return `True` if `a` is the Z3 true expression.
1738 >>> is_true(simplify(p == p))
1743 >>> # True is a Python Boolean expression
1751 """Return `True` if `a` is the Z3 false expression.
1758 >>> is_false(BoolVal(False))
1765 """Return `True` if `a` is a Z3 and expression.
1767 >>> p, q = Bools('p q')
1768 >>> is_and(And(p, q))
1770 >>> is_and(Or(p, q))
1777 """Return `True` if `a` is a Z3 or expression.
1779 >>> p, q = Bools('p q')
1782 >>> is_or(And(p, q))
1789 """Return `True` if `a` is a Z3 implication expression.
1791 >>> p, q = Bools('p q')
1792 >>> is_implies(Implies(p, q))
1794 >>> is_implies(And(p, q))
1801 """Return `True` if `a` is a Z3 not expression.
1813 """Return `True` if `a` is a Z3 equality expression.
1815 >>> x, y = Ints('x y')
1823 """Return `True` if `a` is a Z3 distinct expression.
1825 >>> x, y, z = Ints('x y z')
1826 >>> is_distinct(x == y)
1828 >>> is_distinct(Distinct(x, y, z))
1835 """Return the Boolean Z3 sort. If `ctx=None`, then the global context is used.
1839 >>> p = Const('p', BoolSort())
1842 >>> r = Function('r', IntSort(), IntSort(), BoolSort())
1845 >>> is_bool(r(0, 1))
1853 """Return the Boolean value `True` or `False`. If `ctx=None`, then the global context is used.
1857 >>> is_true(BoolVal(True))
1861 >>> is_false(BoolVal(False))
1872 """Return a Boolean constant named `name`. If `ctx=None`, then the global context is used.
1884 """Return a tuple of Boolean constants.
1886 `names` is a single string containing all names separated by blank spaces.
1887 If `ctx=None`, then the global context is used.
1889 >>> p, q, r = Bools('p q r')
1890 >>> And(p, Or(q, r))
1894 if isinstance(names, str):
1895 names = names.split(
" ")
1896 return [
Bool(name, ctx)
for name
in names]
1900 """Return a list of Boolean constants of size `sz`.
1902 The constants are named using the given prefix.
1903 If `ctx=None`, then the global context is used.
1905 >>> P = BoolVector('p', 3)
1909 And(p__0, p__1, p__2)
1911 return [
Bool(
"%s__%s" % (prefix, i))
for i
in range(sz)]
1915 """Return a fresh Boolean constant in the given context using the given prefix.
1917 If `ctx=None`, then the global context is used.
1919 >>> b1 = FreshBool()
1920 >>> b2 = FreshBool()
1929 """Create a Z3 implies expression.
1931 >>> p, q = Bools('p q')
1943 """Create a Z3 Xor expression.
1945 >>> p, q = Bools('p q')
1948 >>> simplify(Xor(p, q))
1959 """Create a Z3 not expression or probe.
1964 >>> simplify(Not(Not(p)))
1985 """Return `True` if one of the elements of the given collection is a Z3 probe."""
1993 """Create a Z3 and-expression or and-probe.
1995 >>> p, q, r = Bools('p q r')
1998 >>> P = BoolVector('p', 5)
2000 And(p__0, p__1, p__2, p__3, p__4)
2004 last_arg = args[len(args) - 1]
2005 if isinstance(last_arg, Context):
2006 ctx = args[len(args) - 1]
2007 args = args[:len(args) - 1]
2008 elif len(args) == 1
and isinstance(args[0], AstVector):
2010 args = [a
for a
in args[0]]
2016 _z3_assert(ctx
is not None,
"At least one of the arguments must be a Z3 expression or probe")
2026 """Create a Z3 or-expression or or-probe.
2028 >>> p, q, r = Bools('p q r')
2031 >>> P = BoolVector('p', 5)
2033 Or(p__0, p__1, p__2, p__3, p__4)
2037 last_arg = args[len(args) - 1]
2038 if isinstance(last_arg, Context):
2039 ctx = args[len(args) - 1]
2040 args = args[:len(args) - 1]
2041 elif len(args) == 1
and isinstance(args[0], AstVector):
2043 args = [a
for a
in args[0]]
2049 _z3_assert(ctx
is not None,
"At least one of the arguments must be a Z3 expression or probe")
2065 """Patterns are hints for quantifier instantiation.
2077 """Return `True` if `a` is a Z3 pattern (hint for quantifier instantiation.
2079 >>> f = Function('f', IntSort(), IntSort())
2081 >>> q = ForAll(x, f(x) == 0, patterns = [ f(x) ])
2083 ForAll(x, f(x) == 0)
2084 >>> q.num_patterns()
2086 >>> is_pattern(q.pattern(0))
2091 return isinstance(a, PatternRef)
2095 """Create a Z3 multi-pattern using the given expressions `*args`
2097 >>> f = Function('f', IntSort(), IntSort())
2098 >>> g = Function('g', IntSort(), IntSort())
2100 >>> q = ForAll(x, f(x) != g(x), patterns = [ MultiPattern(f(x), g(x)) ])
2102 ForAll(x, f(x) != g(x))
2103 >>> q.num_patterns()
2105 >>> is_pattern(q.pattern(0))
2108 MultiPattern(f(Var(0)), g(Var(0)))
2111 _z3_assert(len(args) > 0,
"At least one argument expected")
2132 """Universally and Existentially quantified formulas."""
2141 """Return the Boolean sort or sort of Lambda."""
2147 """Return `True` if `self` is a universal quantifier.
2149 >>> f = Function('f', IntSort(), IntSort())
2151 >>> q = ForAll(x, f(x) == 0)
2154 >>> q = Exists(x, f(x) != 0)
2161 """Return `True` if `self` is an existential quantifier.
2163 >>> f = Function('f', IntSort(), IntSort())
2165 >>> q = ForAll(x, f(x) == 0)
2168 >>> q = Exists(x, f(x) != 0)
2175 """Return `True` if `self` is a lambda expression.
2177 >>> f = Function('f', IntSort(), IntSort())
2179 >>> q = Lambda(x, f(x))
2182 >>> q = Exists(x, f(x) != 0)
2189 """Return the Z3 expression `self[arg]`.
2196 """Return the weight annotation of `self`.
2198 >>> f = Function('f', IntSort(), IntSort())
2200 >>> q = ForAll(x, f(x) == 0)
2203 >>> q = ForAll(x, f(x) == 0, weight=10)
2210 """Return the skolem id of `self`.
2215 """Return the quantifier id of `self`.
2220 """Return the number of patterns (i.e., quantifier instantiation hints) in `self`.
2222 >>> f = Function('f', IntSort(), IntSort())
2223 >>> g = Function('g', IntSort(), IntSort())
2225 >>> q = ForAll(x, f(x) != g(x), patterns = [ f(x), g(x) ])
2226 >>> q.num_patterns()
2232 """Return a pattern (i.e., quantifier instantiation hints) in `self`.
2234 >>> f = Function('f', IntSort(), IntSort())
2235 >>> g = Function('g', IntSort(), IntSort())
2237 >>> q = ForAll(x, f(x) != g(x), patterns = [ f(x), g(x) ])
2238 >>> q.num_patterns()
2250 """Return the number of no-patterns."""
2254 """Return a no-pattern."""
2260 """Return the expression being quantified.
2262 >>> f = Function('f', IntSort(), IntSort())
2264 >>> q = ForAll(x, f(x) == 0)
2271 """Return the number of variables bounded by this quantifier.
2273 >>> f = Function('f', IntSort(), IntSort(), IntSort())
2276 >>> q = ForAll([x, y], f(x, y) >= x)
2283 """Return a string representing a name used when displaying the quantifier.
2285 >>> f = Function('f', IntSort(), IntSort(), IntSort())
2288 >>> q = ForAll([x, y], f(x, y) >= x)
2299 """Return the sort of a bound variable.
2301 >>> f = Function('f', IntSort(), RealSort(), IntSort())
2304 >>> q = ForAll([x, y], f(x, y) >= x)
2315 """Return a list containing a single element self.body()
2317 >>> f = Function('f', IntSort(), IntSort())
2319 >>> q = ForAll(x, f(x) == 0)
2323 return [self.
body()]
2327 """Return `True` if `a` is a Z3 quantifier.
2329 >>> f = Function('f', IntSort(), IntSort())
2331 >>> q = ForAll(x, f(x) == 0)
2332 >>> is_quantifier(q)
2334 >>> is_quantifier(f(x))
2337 return isinstance(a, QuantifierRef)
2340def _mk_quantifier(is_forall, vs, body, weight=1, qid="", skid="", patterns=[], no_patterns=[]):
2345 _z3_assert(all([
is_expr(p)
for p
in no_patterns]),
"no patterns are Z3 expressions")
2356 _vs = (Ast * num_vars)()
2357 for i
in range(num_vars):
2359 _vs[i] = vs[i].as_ast()
2361 num_pats = len(patterns)
2362 _pats = (Pattern * num_pats)()
2363 for i
in range(num_pats):
2364 _pats[i] = patterns[i].ast
2371 num_no_pats, _no_pats,
2372 body.as_ast()), ctx)
2375def ForAll(vs, body, weight=1, qid="", skid="", patterns=[], no_patterns=[]):
2376 """Create a Z3 forall formula.
2378 The parameters `weight`, `qid`, `skid`, `patterns` and `no_patterns` are optional annotations.
2380 >>> f = Function('f', IntSort(), IntSort(), IntSort())
2383 >>> ForAll([x, y], f(x, y) >= x)
2384 ForAll([x, y], f(x, y) >= x)
2385 >>> ForAll([x, y], f(x, y) >= x, patterns=[ f(x, y) ])
2386 ForAll([x, y], f(x, y) >= x)
2387 >>> ForAll([x, y], f(x, y) >= x, weight=10)
2388 ForAll([x, y], f(x, y) >= x)
2390 return _mk_quantifier(
True, vs, body, weight, qid, skid, patterns, no_patterns)
2393def Exists(vs, body, weight=1, qid="", skid="", patterns=[], no_patterns=[]):
2394 """Create a Z3 exists formula.
2396 The parameters `weight`, `qif`, `skid`, `patterns` and `no_patterns` are optional annotations.
2399 >>> f = Function('f', IntSort(), IntSort(), IntSort())
2402 >>> q = Exists([x, y], f(x, y) >= x, skid="foo")
2404 Exists([x, y], f(x, y) >= x)
2405 >>> is_quantifier(q)
2407 >>> r = Tactic('nnf')(q).as_expr()
2408 >>> is_quantifier(r)
2411 return _mk_quantifier(
False, vs, body, weight, qid, skid, patterns, no_patterns)
2415 """Create a Z3 lambda expression.
2417 >>> f = Function('f', IntSort(), IntSort(), IntSort())
2418 >>> mem0 = Array('mem0', IntSort(), IntSort())
2419 >>> lo, hi, e, i = Ints('lo hi e i')
2420 >>> mem1 = Lambda([i], If(And(lo <= i, i <= hi), e, mem0[i]))
2422 Lambda(i, If(And(lo <= i, i <= hi), e, mem0[i]))
2428 _vs = (Ast * num_vars)()
2429 for i
in range(num_vars):
2431 _vs[i] = vs[i].as_ast()
2442 """Real and Integer sorts."""
2445 """Return `True` if `self` is of the sort Real.
2450 >>> (x + 1).is_real()
2456 return self.
kind() == Z3_REAL_SORT
2459 """Return `True` if `self` is of the sort Integer.
2464 >>> (x + 1).is_int()
2470 return self.
kind() == Z3_INT_SORT
2476 """Return `True` if `self` is a subsort of `other`."""
2480 """Try to cast `val` as an Integer or Real.
2482 >>> IntSort().cast(10)
2484 >>> is_int(IntSort().cast(10))
2488 >>> RealSort().cast(10)
2490 >>> is_real(RealSort().cast(10))
2499 if val_s.is_int()
and self.
is_real():
2501 if val_s.is_bool()
and self.
is_int():
2502 return If(val, 1, 0)
2503 if val_s.is_bool()
and self.
is_real():
2506 _z3_assert(
False,
"Z3 Integer/Real expression expected")
2513 msg =
"int, long, float, string (numeral), or Z3 Integer/Real expression expected. Got %s"
2518 """Return `True` if s is an arithmetical sort (type).
2520 >>> is_arith_sort(IntSort())
2522 >>> is_arith_sort(RealSort())
2524 >>> is_arith_sort(BoolSort())
2526 >>> n = Int('x') + 1
2527 >>> is_arith_sort(n.sort())
2530 return isinstance(s, ArithSortRef)
2534 """Integer and Real expressions."""
2537 """Return the sort (type) of the arithmetical expression `self`.
2541 >>> (Real('x') + 1).sort()
2547 """Return `True` if `self` is an integer expression.
2552 >>> (x + 1).is_int()
2555 >>> (x + y).is_int()
2561 """Return `True` if `self` is an real expression.
2566 >>> (x + 1).is_real()
2572 """Create the Z3 expression `self + other`.
2585 """Create the Z3 expression `other + self`.
2595 """Create the Z3 expression `self * other`.
2604 if isinstance(other, BoolRef):
2605 return If(other, self, 0)
2610 """Create the Z3 expression `other * self`.
2620 """Create the Z3 expression `self - other`.
2633 """Create the Z3 expression `other - self`.
2643 """Create the Z3 expression `self**other` (** is the power operator).
2650 >>> simplify(IntVal(2)**8)
2657 """Create the Z3 expression `other**self` (** is the power operator).
2664 >>> simplify(2**IntVal(8))
2671 """Create the Z3 expression `other/self`.
2694 """Create the Z3 expression `other/self`."""
2698 """Create the Z3 expression `other/self`.
2715 """Create the Z3 expression `other/self`."""
2719 """Create the Z3 expression `other%self`.
2725 >>> simplify(IntVal(10) % IntVal(3))
2730 _z3_assert(a.is_int(),
"Z3 integer expression expected")
2734 """Create the Z3 expression `other%self`.
2742 _z3_assert(a.is_int(),
"Z3 integer expression expected")
2746 """Return an expression representing `-self`.
2766 """Create the Z3 expression `other <= self`.
2768 >>> x, y = Ints('x y')
2779 """Create the Z3 expression `other < self`.
2781 >>> x, y = Ints('x y')
2792 """Create the Z3 expression `other > self`.
2794 >>> x, y = Ints('x y')
2805 """Create the Z3 expression `other >= self`.
2807 >>> x, y = Ints('x y')
2818 """Return an expression representing `abs(self)`.
2823 >>> eq(abs(x), Abs(x))
2830 """Return `True` if `a` is an arithmetical expression.
2839 >>> is_arith(IntVal(1))
2847 return isinstance(a, ArithRef)
2851 """Return `True` if `a` is an integer expression.
2858 >>> is_int(IntVal(1))
2870 """Return `True` if `a` is a real expression.
2882 >>> is_real(RealVal(1))
2897 """Return `True` if `a` is an integer value of sort Int.
2899 >>> is_int_value(IntVal(1))
2903 >>> is_int_value(Int('x'))
2905 >>> n = Int('x') + 1
2910 >>> is_int_value(n.arg(1))
2912 >>> is_int_value(RealVal("1/3"))
2914 >>> is_int_value(RealVal(1))
2921 """Return `True` if `a` is rational value of sort Real.
2923 >>> is_rational_value(RealVal(1))
2925 >>> is_rational_value(RealVal("3/5"))
2927 >>> is_rational_value(IntVal(1))
2929 >>> is_rational_value(1)
2931 >>> n = Real('x') + 1
2934 >>> is_rational_value(n.arg(1))
2936 >>> is_rational_value(Real('x'))
2943 """Return `True` if `a` is an algebraic value of sort Real.
2945 >>> is_algebraic_value(RealVal("3/5"))
2947 >>> n = simplify(Sqrt(2))
2950 >>> is_algebraic_value(n)
2957 """Return `True` if `a` is an expression of the form b + c.
2959 >>> x, y = Ints('x y')
2969 """Return `True` if `a` is an expression of the form b * c.
2971 >>> x, y = Ints('x y')
2981 """Return `True` if `a` is an expression of the form b - c.
2983 >>> x, y = Ints('x y')
2993 """Return `True` if `a` is an expression of the form b / c.
2995 >>> x, y = Reals('x y')
3000 >>> x, y = Ints('x y')
3010 """Return `True` if `a` is an expression of the form b div c.
3012 >>> x, y = Ints('x y')
3022 """Return `True` if `a` is an expression of the form b % c.
3024 >>> x, y = Ints('x y')
3034 """Return `True` if `a` is an expression of the form b <= c.
3036 >>> x, y = Ints('x y')
3046 """Return `True` if `a` is an expression of the form b < c.
3048 >>> x, y = Ints('x y')
3058 """Return `True` if `a` is an expression of the form b >= c.
3060 >>> x, y = Ints('x y')
3070 """Return `True` if `a` is an expression of the form b > c.
3072 >>> x, y = Ints('x y')
3082 """Return `True` if `a` is an expression of the form IsInt(b).
3085 >>> is_is_int(IsInt(x))
3094 """Return `True` if `a` is an expression of the form ToReal(b).
3109 """Return `True` if `a` is an expression of the form ToInt(b).
3124 """Integer values."""
3127 """Return a Z3 integer numeral as a Python long (bignum) numeral.
3140 """Return a Z3 integer numeral as a Python string.
3148 """Return a Z3 integer numeral as a Python binary string.
3150 >>> v.as_binary_string()
3160 """Rational values."""
3163 """ Return the numerator of a Z3 rational numeral.
3165 >>> is_rational_value(RealVal("3/5"))
3167 >>> n = RealVal("3/5")
3170 >>> is_rational_value(Q(3,5))
3172 >>> Q(3,5).numerator()
3178 """ Return the denominator of a Z3 rational numeral.
3180 >>> is_rational_value(Q(3,5))
3189 """ Return the numerator as a Python long.
3191 >>> v = RealVal(10000000000)
3196 >>> v.numerator_as_long() + 1 == 10000000001
3202 """ Return the denominator as a Python long.
3204 >>> v = RealVal("1/3")
3207 >>> v.denominator_as_long()
3226 """ Return a Z3 rational value as a string in decimal notation using at most `prec` decimal places.
3228 >>> v = RealVal("1/5")
3231 >>> v = RealVal("1/3")
3238 """Return a Z3 rational numeral as a Python string.
3247 """Return a Z3 rational as a Python Fraction object.
3249 >>> v = RealVal("1/5")
3260 """Algebraic irrational values."""
3263 """Return a Z3 rational number that approximates the algebraic number `self`.
3264 The result `r` is such that |r - self| <= 1/10^precision
3266 >>> x = simplify(Sqrt(2))
3268 6838717160008073720548335/4835703278458516698824704
3275 """Return a string representation of the algebraic number `self` in decimal notation
3276 using `prec` decimal places.
3278 >>> x = simplify(Sqrt(2))
3279 >>> x.as_decimal(10)
3281 >>> x.as_decimal(20)
3282 '1.41421356237309504880?'
3294 if isinstance(a, bool):
3298 if isinstance(a, float):
3300 if isinstance(a, str):
3305 _z3_assert(
False,
"Python bool, int, long or float expected")
3309 """Return the integer sort in the given context. If `ctx=None`, then the global context is used.
3313 >>> x = Const('x', IntSort())
3316 >>> x.sort() == IntSort()
3318 >>> x.sort() == BoolSort()
3326 """Return the real sort in the given context. If `ctx=None`, then the global context is used.
3330 >>> x = Const('x', RealSort())
3335 >>> x.sort() == RealSort()
3343 if isinstance(val, float):
3344 return str(int(val))
3345 elif isinstance(val, bool):
3355 """Return a Z3 integer value. If `ctx=None`, then the global context is used.
3367 """Return a Z3 real value.
3369 `val` may be a Python int, long, float or string representing a number in decimal or rational notation.
3370 If `ctx=None`, then the global context is used.
3374 >>> RealVal(1).sort()
3386 """Return a Z3 rational a/b.
3388 If `ctx=None`, then the global context is used.
3390 Note: Division by zero (b == 0) is allowed in Z3 symbolic expressions.
3391 Z3 can reason about such expressions symbolically.
3395 >>> RatVal(3,5).sort()
3399 _z3_assert(
_is_int(a)
or isinstance(a, str),
"First argument cannot be converted into an integer")
3400 _z3_assert(
_is_int(b)
or isinstance(b, str),
"Second argument cannot be converted into an integer")
3405def Q(a, b, ctx=None):
3406 """Return a Z3 rational a/b.
3408 If `ctx=None`, then the global context is used.
3419 """Return an integer constant named `name`. If `ctx=None`, then the global context is used.
3432 """Return a tuple of Integer constants.
3434 >>> x, y, z = Ints('x y z')
3439 if isinstance(names, str):
3440 names = names.split(
" ")
3441 return [
Int(name, ctx)
for name
in names]
3445 """Return a list of integer constants of size `sz`.
3447 >>> X = IntVector('x', 3)
3454 return [
Int(
"%s__%s" % (prefix, i), ctx)
for i
in range(sz)]
3458 """Return a fresh integer constant in the given context using the given prefix.
3472 """Return a real constant named `name`. If `ctx=None`, then the global context is used.
3485 """Return a tuple of real constants.
3487 >>> x, y, z = Reals('x y z')
3490 >>> Sum(x, y, z).sort()
3494 if isinstance(names, str):
3495 names = names.split(
" ")
3496 return [
Real(name, ctx)
for name
in names]
3500 """Return a list of real constants of size `sz`.
3502 >>> X = RealVector('x', 3)
3511 return [
Real(
"%s__%s" % (prefix, i), ctx)
for i
in range(sz)]
3515 """Return a fresh real constant in the given context using the given prefix.
3529 """ Return the Z3 expression ToReal(a).
3541 if isinstance(a, BoolRef):
3544 _z3_assert(a.is_int(),
"Z3 integer expression expected.")
3549 """ Return the Z3 expression ToInt(a).
3561 _z3_assert(a.is_real(),
"Z3 real expression expected.")
3567 """ Return the Z3 predicate IsInt(a).
3570 >>> IsInt(x + "1/2")
3572 >>> solve(IsInt(x + "1/2"), x > 0, x < 1)
3574 >>> solve(IsInt(x + "1/2"), x > 0, x < 1, x != "1/2")
3578 _z3_assert(a.is_real(),
"Z3 real expression expected.")
3584 """ Return a Z3 expression which represents the square root of a.
3597 """ Return a Z3 expression which represents the cubic root of a.
3616 """Bit-vector sort."""
3619 """Return the size (number of bits) of the bit-vector sort `self`.
3621 >>> b = BitVecSort(32)
3631 """Try to cast `val` as a Bit-Vector.
3633 >>> b = BitVecSort(32)
3636 >>> b.cast(10).sexpr()
3649 """Return True if `s` is a Z3 bit-vector sort.
3651 >>> is_bv_sort(BitVecSort(32))
3653 >>> is_bv_sort(IntSort())
3656 return isinstance(s, BitVecSortRef)
3660 """Bit-vector expressions."""
3663 """Return the sort of the bit-vector expression `self`.
3665 >>> x = BitVec('x', 32)
3668 >>> x.sort() == BitVecSort(32)
3674 """Return the number of bits of the bit-vector expression `self`.
3676 >>> x = BitVec('x', 32)
3679 >>> Concat(x, x).size()
3685 """Create the Z3 expression `self + other`.
3687 >>> x = BitVec('x', 32)
3688 >>> y = BitVec('y', 32)
3698 """Create the Z3 expression `other + self`.
3700 >>> x = BitVec('x', 32)
3708 """Create the Z3 expression `self * other`.
3710 >>> x = BitVec('x', 32)
3711 >>> y = BitVec('y', 32)
3721 """Create the Z3 expression `other * self`.
3723 >>> x = BitVec('x', 32)
3731 """Create the Z3 expression `self - other`.
3733 >>> x = BitVec('x', 32)
3734 >>> y = BitVec('y', 32)
3744 """Create the Z3 expression `other - self`.
3746 >>> x = BitVec('x', 32)
3754 """Create the Z3 expression bitwise-or `self | other`.
3756 >>> x = BitVec('x', 32)
3757 >>> y = BitVec('y', 32)
3767 """Create the Z3 expression bitwise-or `other | self`.
3769 >>> x = BitVec('x', 32)
3777 """Create the Z3 expression bitwise-and `self & other`.
3779 >>> x = BitVec('x', 32)
3780 >>> y = BitVec('y', 32)
3790 """Create the Z3 expression bitwise-or `other & self`.
3792 >>> x = BitVec('x', 32)
3800 """Create the Z3 expression bitwise-xor `self ^ other`.
3802 >>> x = BitVec('x', 32)
3803 >>> y = BitVec('y', 32)
3813 """Create the Z3 expression bitwise-xor `other ^ self`.
3815 >>> x = BitVec('x', 32)
3825 >>> x = BitVec('x', 32)
3832 """Return an expression representing `-self`.
3834 >>> x = BitVec('x', 32)
3843 """Create the Z3 expression bitwise-not `~self`.
3845 >>> x = BitVec('x', 32)
3854 """Create the Z3 expression (signed) division `self / other`.
3856 Use the function UDiv() for unsigned division.
3858 >>> x = BitVec('x', 32)
3859 >>> y = BitVec('y', 32)
3866 >>> UDiv(x, y).sexpr()
3873 """Create the Z3 expression (signed) division `self / other`."""
3877 """Create the Z3 expression (signed) division `other / self`.
3879 Use the function UDiv() for unsigned division.
3881 >>> x = BitVec('x', 32)
3884 >>> (10 / x).sexpr()
3885 '(bvsdiv #x0000000a x)'
3886 >>> UDiv(10, x).sexpr()
3887 '(bvudiv #x0000000a x)'
3893 """Create the Z3 expression (signed) division `other / self`."""
3897 """Create the Z3 expression (signed) mod `self % other`.
3899 Use the function URem() for unsigned remainder, and SRem() for signed remainder.
3901 >>> x = BitVec('x', 32)
3902 >>> y = BitVec('y', 32)
3909 >>> URem(x, y).sexpr()
3911 >>> SRem(x, y).sexpr()
3918 """Create the Z3 expression (signed) mod `other % self`.
3920 Use the function URem() for unsigned remainder, and SRem() for signed remainder.
3922 >>> x = BitVec('x', 32)
3925 >>> (10 % x).sexpr()
3926 '(bvsmod #x0000000a x)'
3927 >>> URem(10, x).sexpr()
3928 '(bvurem #x0000000a x)'
3929 >>> SRem(10, x).sexpr()
3930 '(bvsrem #x0000000a x)'
3936 """Create the Z3 expression (signed) `other <= self`.
3938 Use the function ULE() for unsigned less than or equal to.
3940 >>> x, y = BitVecs('x y', 32)
3943 >>> (x <= y).sexpr()
3945 >>> ULE(x, y).sexpr()
3952 """Create the Z3 expression (signed) `other < self`.
3954 Use the function ULT() for unsigned less than.
3956 >>> x, y = BitVecs('x y', 32)
3961 >>> ULT(x, y).sexpr()
3968 """Create the Z3 expression (signed) `other > self`.
3970 Use the function UGT() for unsigned greater than.
3972 >>> x, y = BitVecs('x y', 32)
3977 >>> UGT(x, y).sexpr()
3984 """Create the Z3 expression (signed) `other >= self`.
3986 Use the function UGE() for unsigned greater than or equal to.
3988 >>> x, y = BitVecs('x y', 32)
3991 >>> (x >= y).sexpr()
3993 >>> UGE(x, y).sexpr()
4000 """Create the Z3 expression (arithmetical) right shift `self >> other`
4002 Use the function LShR() for the right logical shift
4004 >>> x, y = BitVecs('x y', 32)
4007 >>> (x >> y).sexpr()
4009 >>> LShR(x, y).sexpr()
4013 >>> BitVecVal(4, 3).as_signed_long()
4015 >>> simplify(BitVecVal(4, 3) >> 1).as_signed_long()
4017 >>> simplify(BitVecVal(4, 3) >> 1)
4019 >>> simplify(LShR(BitVecVal(4, 3), 1))
4021 >>> simplify(BitVecVal(2, 3) >> 1)
4023 >>> simplify(LShR(BitVecVal(2, 3), 1))
4030 """Create the Z3 expression left shift `self << other`
4032 >>> x, y = BitVecs('x y', 32)
4035 >>> (x << y).sexpr()
4037 >>> simplify(BitVecVal(2, 3) << 1)
4044 """Create the Z3 expression (arithmetical) right shift `other` >> `self`.
4046 Use the function LShR() for the right logical shift
4048 >>> x = BitVec('x', 32)
4051 >>> (10 >> x).sexpr()
4052 '(bvashr #x0000000a x)'
4058 """Create the Z3 expression left shift `other << self`.
4060 Use the function LShR() for the right logical shift
4062 >>> x = BitVec('x', 32)
4065 >>> (10 << x).sexpr()
4066 '(bvshl #x0000000a x)'
4073 """Bit-vector values."""
4076 """Return a Z3 bit-vector numeral as a Python long (bignum) numeral.
4078 >>> v = BitVecVal(0xbadc0de, 32)
4081 >>> print("0x%.8x" % v.as_long())
4087 """Return a Z3 bit-vector numeral as a Python long (bignum) numeral.
4088 The most significant bit is assumed to be the sign.
4090 >>> BitVecVal(4, 3).as_signed_long()
4092 >>> BitVecVal(7, 3).as_signed_long()
4094 >>> BitVecVal(3, 3).as_signed_long()
4096 >>> BitVecVal(2**32 - 1, 32).as_signed_long()
4098 >>> BitVecVal(2**64 - 1, 64).as_signed_long()
4103 if val >= 2**(sz - 1):
4105 if val < -2**(sz - 1):
4116 """Return the Python value of a Z3 bit-vector numeral."""
4122 """Return `True` if `a` is a Z3 bit-vector expression.
4124 >>> b = BitVec('b', 32)
4132 return isinstance(a, BitVecRef)
4136 """Return `True` if `a` is a Z3 bit-vector numeral value.
4138 >>> b = BitVec('b', 32)
4141 >>> b = BitVecVal(10, 32)
4151 """Return the Z3 expression BV2Int(a).
4153 >>> b = BitVec('b', 3)
4154 >>> BV2Int(b).sort()
4159 >>> x > BV2Int(b, is_signed=False)
4161 >>> x > BV2Int(b, is_signed=True)
4162 x > If(b < 0, BV2Int(b) - 8, BV2Int(b))
4163 >>> solve(x > BV2Int(b), b == 1, x < 3)
4167 _z3_assert(
is_bv(a),
"First argument must be a Z3 bit-vector expression")
4174 """Return the z3 expression Int2BV(a, num_bits).
4175 It is a bit-vector of width num_bits and represents the
4176 modulo of a by 2^num_bits
4183 """Return a Z3 bit-vector sort of the given size. If `ctx=None`, then the global context is used.
4185 >>> Byte = BitVecSort(8)
4186 >>> Word = BitVecSort(16)
4189 >>> x = Const('x', Byte)
4190 >>> eq(x, BitVec('x', 8))
4198 """Return a bit-vector value with the given number of bits. If `ctx=None`, then the global context is used.
4200 >>> v = BitVecVal(10, 32)
4203 >>> print("0x%.8x" % v.as_long())
4215 """Return a bit-vector constant named `name`. `bv` may be the number of bits of a bit-vector sort.
4216 If `ctx=None`, then the global context is used.
4218 >>> x = BitVec('x', 16)
4225 >>> word = BitVecSort(16)
4226 >>> x2 = BitVec('x', word)
4230 if isinstance(bv, BitVecSortRef):
4239 """Return a tuple of bit-vector constants of size bv.
4241 >>> x, y, z = BitVecs('x y z', 16)
4248 >>> Product(x, y, z)
4250 >>> simplify(Product(x, y, z))
4254 if isinstance(names, str):
4255 names = names.split(
" ")
4256 return [
BitVec(name, bv, ctx)
for name
in names]
4260 """Create a Z3 bit-vector concatenation expression.
4262 >>> v = BitVecVal(1, 4)
4263 >>> Concat(v, v+1, v)
4264 Concat(Concat(1, 1 + 1), 1)
4265 >>> simplify(Concat(v, v+1, v))
4267 >>> print("%.3x" % simplify(Concat(v, v+1, v)).as_long())
4273 _z3_assert(sz >= 2,
"At least two arguments expected.")
4280 if is_seq(args[0])
or isinstance(args[0], str):
4283 _z3_assert(all([
is_seq(a)
for a
in args]),
"All arguments must be sequence expressions.")
4286 v[i] = args[i].as_ast()
4291 _z3_assert(all([
is_re(a)
for a
in args]),
"All arguments must be regular expressions.")
4294 v[i] = args[i].as_ast()
4298 _z3_assert(all([
is_bv(a)
for a
in args]),
"All arguments must be Z3 bit-vector expressions.")
4300 for i
in range(sz - 1):
4306 """Create a Z3 bit-vector extraction expression or sequence extraction expression.
4308 Extract is overloaded to work with both bit-vectors and sequences:
4310 **Bit-vector extraction**: Extract(high, low, bitvector)
4311 Extracts bits from position `high` down to position `low` (both inclusive).
4312 - high: int - the highest bit position to extract (0-indexed from right)
4313 - low: int - the lowest bit position to extract (0-indexed from right)
4314 - bitvector: BitVecRef - the bit-vector to extract from
4315 Returns a new bit-vector containing bits [high:low]
4317 **Sequence extraction**: Extract(sequence, offset, length)
4318 Extracts a subsequence starting at the given offset with the specified length.
4319 The functions SubString and SubSeq are redirected to this form of Extract.
4320 - sequence: SeqRef or str - the sequence to extract from
4321 - offset: int - the starting position (0-indexed)
4322 - length: int - the number of elements to extract
4323 Returns a new sequence containing the extracted subsequence
4325 >>> # Bit-vector extraction examples
4326 >>> x = BitVec('x', 8)
4327 >>> Extract(6, 2, x) # Extract bits 6 down to 2 (5 bits total)
4329 >>> Extract(6, 2, x).sort() # Result is a 5-bit vector
4331 >>> Extract(7, 0, x) # Extract all 8 bits
4333 >>> Extract(3, 3, x) # Extract single bit at position 3
4336 >>> # Sequence extraction examples
4337 >>> s = StringVal("hello")
4338 >>> Extract(s, 1, 3) # Extract 3 characters starting at position 1
4339 str.substr("hello", 1, 3)
4340 >>> simplify(Extract(StringVal("abcd"), 2, 1)) # Extract 1 character at position 2
4342 >>> simplify(Extract(StringVal("abcd"), 0, 2)) # Extract first 2 characters
4345 if isinstance(high, str):
4352 _z3_assert(low <= high,
"First argument must be greater than or equal to second argument")
4354 "First and second arguments must be non negative integers")
4355 _z3_assert(
is_bv(a),
"Third argument must be a Z3 bit-vector expression")
4361 _z3_assert(
is_bv(a)
or is_bv(b),
"First or second argument must be a Z3 bit-vector expression")
4365 """Create the Z3 expression (unsigned) `other <= self`.
4367 Use the operator <= for signed less than or equal to.
4369 >>> x, y = BitVecs('x y', 32)
4372 >>> (x <= y).sexpr()
4374 >>> ULE(x, y).sexpr()
4383 """Create the Z3 expression (unsigned) `other < self`.
4385 Use the operator < for signed less than.
4387 >>> x, y = BitVecs('x y', 32)
4392 >>> ULT(x, y).sexpr()
4401 """Create the Z3 expression (unsigned) `other >= self`.
4403 Use the operator >= for signed greater than or equal to.
4405 >>> x, y = BitVecs('x y', 32)
4408 >>> (x >= y).sexpr()
4410 >>> UGE(x, y).sexpr()
4419 """Create the Z3 expression (unsigned) `other > self`.
4421 Use the operator > for signed greater than.
4423 >>> x, y = BitVecs('x y', 32)
4428 >>> UGT(x, y).sexpr()
4437 """Create the Z3 expression (unsigned) division `self / other`.
4439 Use the operator / for signed division.
4441 >>> x = BitVec('x', 32)
4442 >>> y = BitVec('y', 32)
4445 >>> UDiv(x, y).sort()
4449 >>> UDiv(x, y).sexpr()
4458 """Create the Z3 expression (unsigned) remainder `self % other`.
4460 Use the operator % for signed modulus, and SRem() for signed remainder.
4462 >>> x = BitVec('x', 32)
4463 >>> y = BitVec('y', 32)
4466 >>> URem(x, y).sort()
4470 >>> URem(x, y).sexpr()
4479 """Create the Z3 expression signed remainder.
4481 Use the operator % for signed modulus, and URem() for unsigned remainder.
4483 >>> x = BitVec('x', 32)
4484 >>> y = BitVec('y', 32)
4487 >>> SRem(x, y).sort()
4491 >>> SRem(x, y).sexpr()
4500 """Create the Z3 expression logical right shift.
4502 Use the operator >> for the arithmetical right shift.
4504 >>> x, y = BitVecs('x y', 32)
4507 >>> (x >> y).sexpr()
4509 >>> LShR(x, y).sexpr()
4513 >>> BitVecVal(4, 3).as_signed_long()
4515 >>> simplify(BitVecVal(4, 3) >> 1).as_signed_long()
4517 >>> simplify(BitVecVal(4, 3) >> 1)
4519 >>> simplify(LShR(BitVecVal(4, 3), 1))
4521 >>> simplify(BitVecVal(2, 3) >> 1)
4523 >>> simplify(LShR(BitVecVal(2, 3), 1))
4532 """Return an expression representing `a` rotated to the left `b` times.
4534 >>> a, b = BitVecs('a b', 16)
4535 >>> RotateLeft(a, b)
4537 >>> simplify(RotateLeft(a, 0))
4539 >>> simplify(RotateLeft(a, 16))
4548 """Return an expression representing `a` rotated to the right `b` times.
4550 >>> a, b = BitVecs('a b', 16)
4551 >>> RotateRight(a, b)
4553 >>> simplify(RotateRight(a, 0))
4555 >>> simplify(RotateRight(a, 16))
4564 """Return a bit-vector expression with `n` extra sign-bits.
4566 >>> x = BitVec('x', 16)
4567 >>> n = SignExt(8, x)
4574 >>> v0 = BitVecVal(2, 2)
4579 >>> v = simplify(SignExt(6, v0))
4584 >>> print("%.x" % v.as_long())
4589 _z3_assert(
is_bv(a),
"Second argument must be a Z3 bit-vector expression")
4594 """Return a bit-vector expression with `n` extra zero-bits.
4596 >>> x = BitVec('x', 16)
4597 >>> n = ZeroExt(8, x)
4604 >>> v0 = BitVecVal(2, 2)
4609 >>> v = simplify(ZeroExt(6, v0))
4617 _z3_assert(
is_bv(a),
"Second argument must be a Z3 bit-vector expression")
4622 """Return an expression representing `n` copies of `a`.
4624 >>> x = BitVec('x', 8)
4625 >>> n = RepeatBitVec(4, x)
4630 >>> v0 = BitVecVal(10, 4)
4631 >>> print("%.x" % v0.as_long())
4633 >>> v = simplify(RepeatBitVec(4, v0))
4636 >>> print("%.x" % v.as_long())
4641 _z3_assert(
is_bv(a),
"Second argument must be a Z3 bit-vector expression")
4646 """Return the reduction-and expression of `a`."""
4648 _z3_assert(
is_bv(a),
"First argument must be a Z3 bit-vector expression")
4653 """Return the reduction-or expression of `a`."""
4655 _z3_assert(
is_bv(a),
"First argument must be a Z3 bit-vector expression")
4660 """Return the bitwise NAND of `a` and `b`.
4662 >>> x = BitVec('x', 8)
4663 >>> y = BitVec('y', 8)
4673 """Return the bitwise NOR of `a` and `b`.
4675 >>> x = BitVec('x', 8)
4676 >>> y = BitVec('y', 8)
4686 """Return the bitwise XNOR of `a` and `b`.
4688 >>> x = BitVec('x', 8)
4689 >>> y = BitVec('y', 8)
4699 """A predicate the determines that bit-vector addition does not overflow"""
4706 """A predicate the determines that signed bit-vector addition does not underflow"""
4713 """A predicate the determines that bit-vector subtraction does not overflow"""
4720 """A predicate the determines that bit-vector subtraction does not underflow"""
4727 """A predicate the determines that bit-vector signed division does not overflow"""
4734 """A predicate the determines that bit-vector unary negation does not overflow"""
4736 _z3_assert(
is_bv(a),
"First argument must be a Z3 bit-vector expression")
4741 """A predicate the determines that bit-vector multiplication does not overflow"""
4748 """A predicate the determines that bit-vector signed multiplication does not underflow"""
4764 """Return the domain of the array sort `self`.
4766 >>> A = ArraySort(IntSort(), BoolSort())
4773 """Return the domain of the array sort `self`.
4778 """Return the range of the array sort `self`.
4780 >>> A = ArraySort(IntSort(), BoolSort())
4788 """Array expressions. """
4791 """Return the array sort of the array expression `self`.
4793 >>> a = Array('a', IntSort(), BoolSort())
4800 """Shorthand for `self.sort().domain()`.
4802 >>> a = Array('a', IntSort(), BoolSort())
4809 """Shorthand for self.sort().domain_n(i)`."""
4813 """Shorthand for `self.sort().range()`.
4815 >>> a = Array('a', IntSort(), BoolSort())
4822 """Return the Z3 expression `self[arg]`.
4824 >>> a = Array('a', IntSort(), BoolSort())
4838 if isinstance(arg, tuple):
4839 args = [ar.sort().domain_n(i).cast(arg[i])
for i
in range(len(arg))]
4842 arg = ar.sort().domain().cast(arg)
4851 """Return `True` if `a` is a Z3 array expression.
4853 >>> a = Array('a', IntSort(), IntSort())
4856 >>> is_array(Store(a, 0, 1))
4861 return isinstance(a, ArrayRef)
4865 """Return `True` if `a` is a Z3 constant array.
4867 >>> a = K(IntSort(), 10)
4868 >>> is_const_array(a)
4870 >>> a = Array('a', IntSort(), IntSort())
4871 >>> is_const_array(a)
4878 """Return `True` if `a` is a Z3 constant array.
4880 >>> a = K(IntSort(), 10)
4883 >>> a = Array('a', IntSort(), IntSort())
4891 """Return `True` if `a` is a Z3 map array expression.
4893 >>> f = Function('f', IntSort(), IntSort())
4894 >>> b = Array('b', IntSort(), IntSort())
4907 """Return `True` if `a` is a Z3 default array expression.
4908 >>> d = Default(K(IntSort(), 10))
4912 return is_app_of(a, Z3_OP_ARRAY_DEFAULT)
4916 """Return the function declaration associated with a Z3 map array expression.
4918 >>> f = Function('f', IntSort(), IntSort())
4919 >>> b = Array('b', IntSort(), IntSort())
4921 >>> eq(f, get_map_func(a))
4925 >>> get_map_func(a)(0)
4940 """Return the Z3 array sort with the given domain and range sorts.
4942 >>> A = ArraySort(IntSort(), BoolSort())
4949 >>> AA = ArraySort(IntSort(), A)
4951 Array(Int, Array(Int, Bool))
4952 >>> ArraySort(IntSort(), BoolSort(), RealSort())
4953 Array(Int, Bool, Real)
4957 _z3_assert(len(sig) > 1,
"At least two arguments expected")
4958 arity = len(sig) - 1
4964 _z3_assert(s.ctx == r.ctx,
"Context mismatch")
4968 dom = (Sort * arity)()
4969 for i
in range(arity):
4975 """Return an array constant named `name` with the given domain and range sorts.
4977 >>> a = Array('a', IntSort(), IntSort())
4989 """Return a Z3 store array expression.
4991 >>> a = Array('a', IntSort(), IntSort())
4992 >>> i, v = Ints('i v')
4993 >>> s = Update(a, i, v)
4996 >>> prove(s[i] == v)
4999 >>> prove(Implies(i != j, s[j] == a[j]))
5007 raise Z3Exception(
"array update requires index and value arguments")
5011 i = a.sort().domain().cast(i)
5012 v = a.sort().range().cast(v)
5014 v = a.sort().range().cast(args[-1])
5015 idxs = [a.sort().domain_n(i).cast(args[i])
for i
in range(len(args)-1)]
5021 """ Return a default value for array expression.
5022 >>> b = K(IntSort(), 1)
5023 >>> prove(Default(b) == 1)
5032 """Return a Z3 store array expression.
5034 >>> a = Array('a', IntSort(), IntSort())
5035 >>> i, v = Ints('i v')
5036 >>> s = Store(a, i, v)
5039 >>> prove(s[i] == v)
5042 >>> prove(Implies(i != j, s[j] == a[j]))
5049 """Return a Z3 select array expression.
5051 >>> a = Array('a', IntSort(), IntSort())
5055 >>> eq(Select(a, i), a[i])
5065 """Return a Z3 map array expression.
5067 >>> f = Function('f', IntSort(), IntSort(), IntSort())
5068 >>> a1 = Array('a1', IntSort(), IntSort())
5069 >>> a2 = Array('a2', IntSort(), IntSort())
5070 >>> b = Map(f, a1, a2)
5073 >>> prove(b[0] == f(a1[0], a2[0]))
5078 _z3_assert(len(args) > 0,
"At least one Z3 array expression expected")
5081 _z3_assert(len(args) == f.arity(),
"Number of arguments mismatch")
5088 """Return a Z3 constant array expression.
5090 >>> a = K(IntSort(), 10)
5110 """Return extensionality index for one-dimensional arrays.
5111 >> a, b = Consts('a b', SetSort(IntSort()))
5122 """Return a Z3 as-array expression for the given function declaration.
5124 >>> f = Function('f', IntSort(), IntSort())
5130 >>> get_as_array_func(a) == f
5134 _z3_assert(isinstance(f, FuncDeclRef),
"function declaration expected")
5140 """Return `True` if `a` is a Z3 array select application.
5142 >>> a = Array('a', IntSort(), IntSort())
5153 """Return `True` if `a` is a Z3 array store application.
5155 >>> a = Array('a', IntSort(), IntSort())
5158 >>> is_store(Store(a, 0, 1))
5171 """ Create a set sort over element sort s"""
5176 """Create the empty set
5177 >>> EmptySet(IntSort())
5187 """Create the full set
5188 >>> FullSet(IntSort())
5196 """ Take the union of sets
5197 >>> a = Const('a', SetSort(IntSort()))
5198 >>> b = Const('b', SetSort(IntSort()))
5204 from functools
import reduce
5205 return reduce(FiniteSetUnion, args)
5212 """ Take the union of sets
5213 >>> a = Const('a', SetSort(IntSort()))
5214 >>> b = Const('b', SetSort(IntSort()))
5215 >>> SetIntersect(a, b)
5221 from functools
import reduce
5222 return reduce(FiniteSetIntersect, args)
5228 """ Add element e to set s
5229 >>> a = Const('a', SetSort(IntSort()))
5236 return FiniteSetSingleton(e) | s
5241 """ Remove element e to set s
5242 >>> a = Const('a', SetSort(IntSort()))
5249 return s - FiniteSetSingleton(e)
5254 """ The complement of set s
5255 >>> a = Const('a', SetSort(IntSort()))
5256 >>> SetComplement(a)
5264 """ The set difference of a and b
5265 >>> a = Const('a', SetSort(IntSort()))
5266 >>> b = Const('b', SetSort(IntSort()))
5267 >>> SetDifference(a, b)
5277 """ Check if e is a member of set s
5278 >>> a = Const('a', SetSort(IntSort()))
5285 return FiniteSetIsMember(e, s)
5290 """ Check if a is a subset of b
5291 >>> a = Const('a', SetSort(IntSort()))
5292 >>> b = Const('b', SetSort(IntSort()))
5298 return FiniteSetIsSubset(a, b)
5310 """Finite set sort."""
5313 """Return the element sort of this finite set sort."""
5317 """Try to cast val as a finite set expression."""
5319 if self.
eq(val.sort()):
5322 _z3_assert(
False,
"Cannot cast to finite set sort")
5323 if isinstance(val, set):
5329 _z3_assert(
False,
"Cannot cast to finite set sort")
5351 """Return True if a is a Z3 finite set expression.
5352 >>> s = FiniteSetSort(IntSort())
5353 >>> is_finite_set(FiniteSetEmpty(s))
5355 >>> is_finite_set(IntVal(1))
5358 return isinstance(a, FiniteSetRef)
5362 """Return True if s is a Z3 finite set sort.
5363 >>> is_finite_set_sort(FiniteSetSort(IntSort()))
5365 >>> is_finite_set_sort(IntSort())
5368 return isinstance(s, FiniteSetSortRef)
5372 """Finite set expression."""
5378 """Return the union of self and other."""
5382 """Return the intersection of self and other."""
5386 """Return the set difference of self and other."""
5391 """Create a finite set sort over element sort elem_sort.
5392 >>> s = FiniteSetSort(IntSort())
5400 """Create an empty finite set of the given sort.
5401 >>> s = FiniteSetSort(IntSort())
5402 >>> FiniteSetEmpty(s)
5410 """Create a singleton finite set containing elem.
5411 >>> Singleton(IntVal(1))
5419 """Create the union of two finite sets.
5420 >>> a = Const('a', FiniteSetSort(IntSort()))
5421 >>> b = Const('b', FiniteSetSort(IntSort()))
5422 >>> FiniteSetUnion(a, b)
5430 """Create the intersection of two finite sets.
5431 >>> a = Const('a', FiniteSetSort(IntSort()))
5432 >>> b = Const('b', FiniteSetSort(IntSort()))
5433 >>> FiniteSetIntersect(a, b)
5441 """Create the set difference of two finite sets.
5442 >>> a = Const('a', FiniteSetSort(IntSort()))
5443 >>> b = Const('b', FiniteSetSort(IntSort()))
5444 >>> FiniteSetDifference(a, b)
5445 set.difference(a, b)
5452 """Check if elem is a member of the finite set.
5453 >>> a = Const('a', FiniteSetSort(IntSort()))
5454 >>> FiniteSetMember(IntVal(1), a)
5464 """Get the size (cardinality) of a finite set.
5465 >>> a = Const('a', FiniteSetSort(IntSort()))
5466 >>> FiniteSetSize(a)
5474 """Check if s1 is a subset of s2.
5475 >>> a = Const('a', FiniteSetSort(IntSort()))
5476 >>> b = Const('b', FiniteSetSort(IntSort()))
5477 >>> FiniteSetSubset(a, b)
5485 """Apply function f to all elements of the finite set.
5486 >>> f = Array('f', IntSort(), IntSort())
5487 >>> a = Const('a', FiniteSetSort(IntSort()))
5488 >>> FiniteSetMap(f, a)
5491 if isinstance(f, FuncDeclRef):
5498 """Filter a finite set using predicate f.
5499 >>> f = Array('f', IntSort(), BoolSort())
5500 >>> a = Const('a', FiniteSetSort(IntSort()))
5501 >>> FiniteSetFilter(f, a)
5504 if isinstance(f, FuncDeclRef):
5511 """Create a finite set of integers in the range [low, high).
5512 >>> FiniteSetRange(IntVal(0), IntVal(5))
5526 """Return `True` if acc is pair of the form (String, Datatype or Sort). """
5527 if not isinstance(acc, tuple):
5531 return isinstance(acc[0], str)
and (isinstance(acc[1], Datatype)
or is_sort(acc[1]))
5535 """Helper class for declaring Z3 datatypes.
5537 >>> List = Datatype('List')
5538 >>> List.declare('cons', ('car', IntSort()), ('cdr', List))
5539 >>> List.declare('nil')
5540 >>> List = List.create()
5541 >>> # List is now a Z3 declaration
5544 >>> List.cons(10, List.nil)
5546 >>> List.cons(10, List.nil).sort()
5548 >>> cons = List.cons
5552 >>> n = cons(1, cons(0, nil))
5554 cons(1, cons(0, nil))
5555 >>> simplify(cdr(n))
5557 >>> simplify(car(n))
5573 _z3_assert(isinstance(name, str),
"String expected")
5574 _z3_assert(isinstance(rec_name, str),
"String expected")
5577 "Valid list of accessors expected. An accessor is a pair of the form (String, Datatype|Sort)",
5582 """Declare constructor named `name` with the given accessors `args`.
5583 Each accessor is a pair `(name, sort)`, where `name` is a string and `sort` a Z3 sort
5584 or a reference to the datatypes being declared.
5586 In the following example `List.declare('cons', ('car', IntSort()), ('cdr', List))`
5587 declares the constructor named `cons` that builds a new List using an integer and a List.
5588 It also declares the accessors `car` and `cdr`. The accessor `car` extracts the integer
5589 of a `cons` cell, and `cdr` the list of a `cons` cell. After all constructors were declared,
5590 we use the method create() to create the actual datatype in Z3.
5592 >>> List = Datatype('List')
5593 >>> List.declare('cons', ('car', IntSort()), ('cdr', List))
5594 >>> List.declare('nil')
5595 >>> List = List.create()
5598 _z3_assert(isinstance(name, str),
"String expected")
5599 _z3_assert(name !=
"",
"Constructor name cannot be empty")
5606 """Create a Z3 datatype based on the constructors declared using the method `declare()`.
5608 The function `CreateDatatypes()` must be used to define mutually recursive datatypes.
5610 >>> List = Datatype('List')
5611 >>> List.declare('cons', ('car', IntSort()), ('cdr', List))
5612 >>> List.declare('nil')
5613 >>> List = List.create()
5616 >>> List.cons(10, List.nil)
5622 """Create a polymorphic Z3 datatype with explicit type variables.
5624 `type_params` is a list of type variables created with `DeclareTypeVar`.
5625 Constructor field sorts may reference these type variables.
5626 Self-recursive fields may reference this datatype directly.
5628 >>> A = DeclareTypeVar('A')
5629 >>> Pair = Datatype('Pair')
5630 >>> Pair.declare('pair', ('fst', A), ('snd', A))
5631 >>> Pair = Pair.create_polymorphic([A])
5637 """Auxiliary object used to create Z3 datatypes."""
5644 if self.
ctx.ref()
is not None and Z3_del_constructor
is not None:
5649 """Auxiliary object used to create Z3 datatypes."""
5656 if self.
ctx.ref()
is not None and Z3_del_constructor_list
is not None:
5661 """Create mutually recursive Z3 datatypes using 1 or more Datatype helper objects.
5663 In the following example we define a Tree-List using two mutually recursive datatypes.
5665 >>> TreeList = Datatype('TreeList')
5666 >>> Tree = Datatype('Tree')
5667 >>> # Tree has two constructors: leaf and node
5668 >>> Tree.declare('leaf', ('val', IntSort()))
5669 >>> # a node contains a list of trees
5670 >>> Tree.declare('node', ('children', TreeList))
5671 >>> TreeList.declare('nil')
5672 >>> TreeList.declare('cons', ('car', Tree), ('cdr', TreeList))
5673 >>> Tree, TreeList = CreateDatatypes(Tree, TreeList)
5674 >>> Tree.val(Tree.leaf(10))
5676 >>> simplify(Tree.val(Tree.leaf(10)))
5678 >>> n1 = Tree.node(TreeList.cons(Tree.leaf(10), TreeList.cons(Tree.leaf(20), TreeList.nil)))
5680 node(cons(leaf(10), cons(leaf(20), nil)))
5681 >>> n2 = Tree.node(TreeList.cons(n1, TreeList.nil))
5682 >>> simplify(n2 == n1)
5684 >>> simplify(TreeList.car(Tree.children(n2)) == n1)
5689 _z3_assert(len(ds) > 0,
"At least one Datatype must be specified")
5690 _z3_assert(all([isinstance(d, Datatype)
for d
in ds]),
"Arguments must be Datatypes")
5691 _z3_assert(all([d.ctx == ds[0].ctx
for d
in ds]),
"Context mismatch")
5692 _z3_assert(all([d.constructors != []
for d
in ds]),
"Non-empty Datatypes expected")
5695 names = (Symbol * num)()
5696 out = (Sort * num)()
5697 clists = (ConstructorList * num)()
5699 for i
in range(num):
5702 num_cs = len(d.constructors)
5703 cs = (Constructor * num_cs)()
5704 for j
in range(num_cs):
5705 c = d.constructors[j]
5710 fnames = (Symbol * num_fs)()
5711 sorts = (Sort * num_fs)()
5712 refs = (ctypes.c_uint * num_fs)()
5713 for k
in range(num_fs):
5717 if isinstance(ftype, Datatype):
5720 ds.count(ftype) == 1,
5721 "One and only one occurrence of each datatype is expected",
5724 refs[k] = ds.index(ftype)
5728 sorts[k] = ftype.ast
5737 for i
in range(num):
5739 num_cs = dref.num_constructors()
5740 for j
in range(num_cs):
5741 cref = dref.constructor(j)
5742 cref_name = cref.name()
5743 cref_arity = cref.arity()
5744 if cref.arity() == 0:
5746 setattr(dref, cref_name, cref)
5747 rref = dref.recognizer(j)
5748 setattr(dref,
"is_" + cref_name, rref)
5749 for k
in range(cref_arity):
5750 aref = dref.accessor(j, k)
5751 setattr(dref, aref.name(), aref)
5753 return tuple(result)
5757 """Create a single polymorphic Z3 datatype with explicit type parameters.
5759 `d` is a `Datatype` helper object whose constructors have been declared.
5760 `type_params` is a list of type variables created with `DeclareTypeVar`.
5761 Constructor field sorts may reference these type variables, and self-recursive
5762 fields may reference `d` directly.
5764 >>> A = DeclareTypeVar('A')
5765 >>> Pair = Datatype('Pair')
5766 >>> Pair.declare('pair', ('fst', A), ('snd', A))
5767 >>> Pair = CreatePolymorphicDatatype(Pair, [A])
5770 _z3_assert(isinstance(d, Datatype),
"Datatype expected")
5771 _z3_assert(d.constructors != [],
"Non-empty Datatype expected")
5774 num_params = len(type_params)
5775 params_arr = (Sort * num_params)()
5776 for i, p
in enumerate(type_params):
5779 params_arr[i] = p.ast
5780 num_cs = len(d.constructors)
5781 cs = (Constructor * num_cs)()
5783 for j
in range(num_cs):
5784 c = d.constructors[j]
5789 fnames = (Symbol * num_fs)()
5790 sorts = (Sort * num_fs)()
5791 refs = (ctypes.c_uint * num_fs)()
5792 for k
in range(num_fs):
5796 if isinstance(ftype, Datatype):
5798 _z3_assert(ftype
is d,
"Only self-recursive references are supported in polymorphic datatypes. Use CreateDatatypes for mutually recursive datatypes.")
5804 sorts[k] = ftype.ast
5810 num_cs_actual = dref.num_constructors()
5811 for j
in range(num_cs_actual):
5812 cref = dref.constructor(j)
5813 cref_name = cref.name()
5814 cref_arity = cref.arity()
5817 setattr(dref, cref_name, cref)
5818 rref = dref.recognizer(j)
5819 setattr(dref,
"is_" + cref_name, rref)
5820 for k
in range(cref_arity):
5821 aref = dref.accessor(j, k)
5822 setattr(dref, aref.name(), aref)
5827 """Datatype sorts."""
5830 """Return the number of constructors in the given Z3 datatype.
5832 >>> List = Datatype('List')
5833 >>> List.declare('cons', ('car', IntSort()), ('cdr', List))
5834 >>> List.declare('nil')
5835 >>> List = List.create()
5836 >>> # List is now a Z3 declaration
5837 >>> List.num_constructors()
5843 """Return a constructor of the datatype `self`.
5845 >>> List = Datatype('List')
5846 >>> List.declare('cons', ('car', IntSort()), ('cdr', List))
5847 >>> List.declare('nil')
5848 >>> List = List.create()
5849 >>> # List is now a Z3 declaration
5850 >>> List.num_constructors()
5852 >>> List.constructor(0)
5854 >>> List.constructor(1)
5862 """In Z3, each constructor has an associated recognizer predicate.
5864 If the constructor is named `name`, then the recognizer `is_name`.
5866 >>> List = Datatype('List')
5867 >>> List.declare('cons', ('car', IntSort()), ('cdr', List))
5868 >>> List.declare('nil')
5869 >>> List = List.create()
5870 >>> # List is now a Z3 declaration
5871 >>> List.num_constructors()
5873 >>> List.recognizer(0)
5875 >>> List.recognizer(1)
5877 >>> simplify(List.is_nil(List.cons(10, List.nil)))
5879 >>> simplify(List.is_cons(List.cons(10, List.nil)))
5881 >>> l = Const('l', List)
5882 >>> simplify(List.is_cons(l))
5890 """In Z3, each constructor has 0 or more accessor.
5891 The number of accessors is equal to the arity of the constructor.
5893 >>> List = Datatype('List')
5894 >>> List.declare('cons', ('car', IntSort()), ('cdr', List))
5895 >>> List.declare('nil')
5896 >>> List = List.create()
5897 >>> List.num_constructors()
5899 >>> List.constructor(0)
5901 >>> num_accs = List.constructor(0).arity()
5904 >>> List.accessor(0, 0)
5906 >>> List.accessor(0, 1)
5908 >>> List.constructor(1)
5910 >>> num_accs = List.constructor(1).arity()
5924 """Datatype expressions."""
5927 """Return the datatype sort of the datatype expression `self`."""
5931 """Return a new datatype expression with the specified field updated.
5934 field_accessor: The accessor function declaration for the field to update
5935 new_value: The new value for the field
5938 A new datatype expression with the field updated, other fields unchanged
5941 >>> Person = Datatype('Person')
5942 >>> Person.declare('person', ('name', StringSort()), ('age', IntSort()))
5943 >>> Person = Person.create()
5944 >>> person_age = Person.accessor(0, 1) # age accessor
5945 >>> p = Const('p', Person)
5946 >>> p2 = p.update_field(person_age, IntVal(30))
5957 """Create a reference to a sort that was declared, or will be declared, as a recursive datatype.
5960 name: name of the datatype sort
5961 params: optional list/tuple of sort parameters for parametric datatypes
5962 ctx: Z3 context (optional)
5965 >>> # Non-parametric datatype
5966 >>> TreeRef = DatatypeSort('Tree')
5967 >>> # Parametric datatype with one parameter
5968 >>> ListIntRef = DatatypeSort('List', [IntSort()])
5969 >>> # Parametric datatype with multiple parameters
5970 >>> PairRef = DatatypeSort('Pair', [IntSort(), BoolSort()])
5973 if params
is None or len(params) == 0:
5976 _params = (Sort * len(params))()
5977 for i
in range(len(params)):
5978 _params[i] = params[i].ast
5982 """Create a named tuple sort base on a set of underlying sorts
5984 >>> pair, mk_pair, (first, second) = TupleSort("pair", [IntSort(), StringSort()])
5987 projects = [(
"project%d" % i, sorts[i])
for i
in range(len(sorts))]
5988 tuple.declare(name, *projects)
5989 tuple = tuple.create()
5990 return tuple, tuple.constructor(0), [tuple.accessor(0, i)
for i
in range(len(sorts))]
5994 """Create a named tagged union sort base on a set of underlying sorts
5996 >>> sum, ((inject0, extract0), (inject1, extract1)) = DisjointSum("+", [IntSort(), StringSort()])
5999 for i
in range(len(sorts)):
6000 sum.declare(
"inject%d" % i, (
"project%d" % i, sorts[i]))
6002 return sum, [(sum.constructor(i), sum.accessor(i, 0))
for i
in range(len(sorts))]
6006 """Return a new enumeration sort named `name` containing the given values.
6008 The result is a pair (sort, list of constants).
6010 >>> Color, (red, green, blue) = EnumSort('Color', ['red', 'green', 'blue'])
6013 _z3_assert(isinstance(name, str),
"Name must be a string")
6014 _z3_assert(all([isinstance(v, str)
for v
in values]),
"Enumeration sort values must be strings")
6015 _z3_assert(len(values) > 0,
"At least one value expected")
6018 _val_names = (Symbol * num)()
6019 for i
in range(num):
6020 _val_names[i] =
to_symbol(values[i], ctx)
6021 _values = (FuncDecl * num)()
6022 _testers = (FuncDecl * num)()
6026 for i
in range(num):
6028 V = [a()
for a
in V]
6039 """Set of parameters used to configure Solvers, Tactics and Simplifiers in Z3.
6041 Consider using the function `args2params` to create instances of this object.
6056 if self.
ctx.ref()
is not None and Z3_params_dec_ref
is not None:
6060 """Set parameter name with value val."""
6062 _z3_assert(isinstance(name, str),
"parameter name must be a string")
6064 if isinstance(val, bool):
6068 elif isinstance(val, float):
6070 elif isinstance(val, str):
6080 _z3_assert(isinstance(ds, ParamDescrsRef),
"parameter description set expected")
6085 """Convert python arguments into a Z3_params object.
6086 A ':' is added to the keywords, and '_' is replaced with '-'
6088 >>> args2params(['model', True, 'relevancy', 2], {'elim_and' : True})
6089 (params model true relevancy 2 elim_and true)
6092 _z3_assert(len(arguments) % 2 == 0,
"Argument list must have an even number of elements.")
6108 """Set of parameter descriptions for Solvers, Tactics and Simplifiers in Z3.
6112 _z3_assert(isinstance(descr, ParamDescrs),
"parameter description object expected")
6118 return ParamsDescrsRef(self.
descr, self.
ctx)
6121 if self.
ctx.ref()
is not None and Z3_param_descrs_dec_ref
is not None:
6125 """Return the size of in the parameter description `self`.
6130 """Return the size of in the parameter description `self`.
6135 """Return the i-th parameter name in the parameter description `self`.
6140 """Return the kind of the parameter named `n`.
6145 """Return the documentation string of the parameter named `n`.
6166 """Goal is a collection of constraints we want to find a solution or show to be unsatisfiable (infeasible).
6168 Goals are processed using Tactics. A Tactic transforms a goal into a set of subgoals.
6169 A goal has a solution if one of its subgoals has a solution.
6170 A goal is unsatisfiable if all subgoals are unsatisfiable.
6173 def __init__(self, models=True, unsat_cores=False, proofs=False, ctx=None, goal=None):
6176 "If goal is different from None, then ctx must be also different from None")
6179 if self.
goal is None:
6184 if self.
goal is not None and self.
ctx.ref()
is not None and Z3_goal_dec_ref
is not None:
6188 """Return the depth of the goal `self`.
6189 The depth corresponds to the number of tactics applied to `self`.
6191 >>> x, y = Ints('x y')
6193 >>> g.add(x == 0, y >= x + 1)
6196 >>> r = Then('simplify', 'solve-eqs')(g)
6197 >>> # r has 1 subgoal
6206 """Return `True` if `self` contains the `False` constraints.
6208 >>> x, y = Ints('x y')
6210 >>> g.inconsistent()
6212 >>> g.add(x == 0, x == 1)
6215 >>> g.inconsistent()
6217 >>> g2 = Tactic('propagate-values')(g)[0]
6218 >>> g2.inconsistent()
6224 """Return the precision (under-approximation, over-approximation, or precise) of the goal `self`.
6227 >>> g.prec() == Z3_GOAL_PRECISE
6229 >>> x, y = Ints('x y')
6230 >>> g.add(x == y + 1)
6231 >>> g.prec() == Z3_GOAL_PRECISE
6233 >>> t = With(Tactic('add-bounds'), add_bound_lower=0, add_bound_upper=10)
6236 [x == y + 1, x <= 10, x >= 0, y <= 10, y >= 0]
6237 >>> g2.prec() == Z3_GOAL_PRECISE
6239 >>> g2.prec() == Z3_GOAL_UNDER
6245 """Alias for `prec()`.
6248 >>> g.precision() == Z3_GOAL_PRECISE
6254 """Return the number of constraints in the goal `self`.
6259 >>> x, y = Ints('x y')
6260 >>> g.add(x == 0, y > x)
6267 """Return the number of constraints in the goal `self`.
6272 >>> x, y = Ints('x y')
6273 >>> g.add(x == 0, y > x)
6280 """Return a constraint in the goal `self`.
6283 >>> x, y = Ints('x y')
6284 >>> g.add(x == 0, y > x)
6293 """Return a constraint in the goal `self`.
6296 >>> x, y = Ints('x y')
6297 >>> g.add(x == 0, y > x)
6305 if arg < 0
or arg >= len(self):
6307 return self.
get(arg)
6310 """Assert constraints into the goal.
6314 >>> g.assert_exprs(x > 0, x < 2)
6329 >>> g.append(x > 0, x < 2)
6340 >>> g.insert(x > 0, x < 2)
6351 >>> g.add(x > 0, x < 2)
6358 """Retrieve model from a satisfiable goal
6359 >>> a, b = Ints('a b')
6361 >>> g.add(Or(a == 0, a == 1), Or(b == 0, b == 1), a > b)
6362 >>> t = Then(Tactic('split-clause'), Tactic('solve-eqs'))
6365 [Or(b == 0, b == 1), Not(0 <= b)]
6367 [Or(b == 0, b == 1), Not(1 <= b)]
6368 >>> # Remark: the subgoal r[0] is unsatisfiable
6369 >>> # Creating a solver for solving the second subgoal
6376 >>> # Model s.model() does not assign a value to `a`
6377 >>> # It is a model for subgoal `r[1]`, but not for goal `g`
6378 >>> # The method convert_model creates a model for `g` from a model for `r[1]`.
6379 >>> r[1].convert_model(s.model())
6383 _z3_assert(isinstance(model, ModelRef),
"Z3 Model expected")
6387 return obj_to_string(self)
6390 """Return a textual representation of the s-expression representing the goal."""
6394 """Return a textual representation of the goal in DIMACS format."""
6398 """Copy goal `self` to context `target`.
6406 >>> g2 = g.translate(c2)
6409 >>> g.ctx == main_ctx()
6413 >>> g2.ctx == main_ctx()
6417 _z3_assert(isinstance(target, Context),
"target must be a context")
6427 """Return a new simplified goal.
6429 This method is essentially invoking the simplify tactic.
6433 >>> g.add(x + 1 >= 2)
6436 >>> g2 = g.simplify()
6439 >>> # g was not modified
6444 return t.apply(self, *arguments, **keywords)[0]
6447 """Return goal `self` as a single Z3 expression.
6466 return And([self.
get(i)
for i
in range(len(self))], self.
ctx)
6476 """A collection (vector) of ASTs."""
6485 assert ctx
is not None
6490 if self.
vector is not None and self.
ctx.ref()
is not None and Z3_ast_vector_dec_ref
is not None:
6494 """Return the size of the vector `self`.
6499 >>> A.push(Int('x'))
6500 >>> A.push(Int('x'))
6507 """Return the AST at position `i`.
6510 >>> A.push(Int('x') + 1)
6511 >>> A.push(Int('y'))
6518 if isinstance(i, int):
6526 elif isinstance(i, slice):
6528 for ii
in range(*i.indices(self.
__len__())):
6536 """Update AST at position `i`.
6539 >>> A.push(Int('x') + 1)
6540 >>> A.push(Int('y'))
6549 if i < 0
or i >= self.
__len__():
6554 """Add `v` in the end of the vector.
6559 >>> A.push(Int('x'))
6566 """Resize the vector to `sz` elements.
6572 >>> for i in range(10): A[i] = Int('x')
6579 """Return `True` if the vector contains `item`.
6602 """Copy vector `self` to context `other_ctx`.
6608 >>> B = A.translate(c2)
6624 return obj_to_string(self)
6627 """Return a textual representation of the s-expression representing the vector."""
6638 """A mapping from ASTs to ASTs."""
6647 assert ctx
is not None
6655 if self.
map is not None and self.
ctx.ref()
is not None and Z3_ast_map_dec_ref
is not None:
6659 """Return the size of the map.
6665 >>> M[x] = IntVal(1)
6672 """Return `True` if the map contains key `key`.
6685 """Retrieve the value associated with key `key`.
6696 """Add/Update key `k` with value `v`.
6705 >>> M[x] = IntVal(1)
6715 """Remove the entry associated with key `k`.
6729 """Remove all entries from the map.
6734 >>> M[x+x] = IntVal(1)
6744 """Return an AstVector containing all keys in the map.
6749 >>> M[x+x] = IntVal(1)
6763 """Store the value of the interpretation of a function in a particular point."""
6774 if self.
ctx.ref()
is not None and Z3_func_entry_dec_ref
is not None:
6778 """Return the number of arguments in the given entry.
6780 >>> f = Function('f', IntSort(), IntSort(), IntSort())
6782 >>> s.add(f(0, 1) == 10, f(1, 2) == 20, f(1, 0) == 10)
6787 >>> f_i.num_entries()
6789 >>> e = f_i.entry(0)
6796 """Return the value of argument `idx`.
6798 >>> f = Function('f', IntSort(), IntSort(), IntSort())
6800 >>> s.add(f(0, 1) == 10, f(1, 2) == 20, f(1, 0) == 10)
6805 >>> f_i.num_entries()
6807 >>> e = f_i.entry(0)
6818 ... except IndexError:
6819 ... print("index error")
6827 """Return the value of the function at point `self`.
6829 >>> f = Function('f', IntSort(), IntSort(), IntSort())
6831 >>> s.add(f(0, 1) == 10, f(1, 2) == 20, f(1, 0) == 10)
6836 >>> f_i.num_entries()
6838 >>> e = f_i.entry(0)
6849 """Return entry `self` as a Python list.
6850 >>> f = Function('f', IntSort(), IntSort(), IntSort())
6852 >>> s.add(f(0, 1) == 10, f(1, 2) == 20, f(1, 0) == 10)
6857 >>> f_i.num_entries()
6859 >>> e = f_i.entry(0)
6864 args.append(self.
value())
6872 """Stores the interpretation of a function in a Z3 model."""
6877 if self.
f is not None:
6881 if self.
f is not None and self.
ctx.ref()
is not None and Z3_func_interp_dec_ref
is not None:
6886 Return the `else` value for a function interpretation.
6887 Return None if Z3 did not specify the `else` value for
6890 >>> f = Function('f', IntSort(), IntSort())
6892 >>> s.add(f(0) == 1, f(1) == 1, f(2) == 0)
6898 >>> m[f].else_value()
6908 """Return the number of entries/points in the function interpretation `self`.
6910 >>> f = Function('f', IntSort(), IntSort())
6912 >>> s.add(f(0) == 1, f(1) == 1, f(2) == 0)
6918 >>> m[f].num_entries()
6924 """Return the number of arguments for each entry in the function interpretation `self`.
6926 >>> f = Function('f', IntSort(), IntSort())
6928 >>> s.add(f(0) == 1, f(1) == 1, f(2) == 0)
6938 """Return an entry at position `idx < self.num_entries()` in the function interpretation `self`.
6940 >>> f = Function('f', IntSort(), IntSort())
6942 >>> s.add(f(0) == 1, f(1) == 1, f(2) == 0)
6948 >>> m[f].num_entries()
6958 """Copy model 'self' to context 'other_ctx'.
6969 """Return the function interpretation as a Python list.
6970 >>> f = Function('f', IntSort(), IntSort())
6972 >>> s.add(f(0) == 1, f(1) == 1, f(2) == 0)
6986 return obj_to_string(self)
6990 """Model/Solution of a satisfiability problem (aka system of constraints)."""
6993 assert ctx
is not None
6999 if self.
ctx.ref()
is not None and Z3_model_dec_ref
is not None:
7003 return obj_to_string(self)
7006 """Return a textual representation of the s-expression representing the model."""
7009 def eval(self, t, model_completion=False):
7010 """Evaluate the expression `t` in the model `self`.
7011 If `model_completion` is enabled, then a default interpretation is automatically added
7012 for symbols that do not have an interpretation in the model `self`.
7016 >>> s.add(x > 0, x < 2)
7029 >>> m.eval(y, model_completion=True)
7031 >>> # Now, m contains an interpretation for y
7038 raise Z3Exception(
"failed to evaluate expression in the model")
7041 """Alias for `eval`.
7045 >>> s.add(x > 0, x < 2)
7049 >>> m.evaluate(x + 1)
7051 >>> m.evaluate(x == 1)
7054 >>> m.evaluate(y + x)
7058 >>> m.evaluate(y, model_completion=True)
7060 >>> # Now, m contains an interpretation for y
7061 >>> m.evaluate(y + x)
7064 return self.
eval(t, model_completion)
7067 """Return the number of constant and function declarations in the model `self`.
7069 >>> f = Function('f', IntSort(), IntSort())
7072 >>> s.add(x > 0, f(x) != x)
7081 return num_consts + num_funcs
7084 """Return the interpretation for a given declaration or constant.
7086 >>> f = Function('f', IntSort(), IntSort())
7089 >>> s.add(x > 0, x < 2, f(x) == 0)
7099 _z3_assert(isinstance(decl, FuncDeclRef)
or is_const(decl),
"Z3 declaration expected")
7103 if decl.arity() == 0:
7105 if _r.value
is None:
7121 sz = fi.num_entries()
7125 e =
Store(e, fe.arg_value(0), fe.value())
7136 """Return the number of uninterpreted sorts that contain an interpretation in the model `self`.
7138 >>> A = DeclareSort('A')
7139 >>> a, b = Consts('a b', A)
7151 """Return the uninterpreted sort at position `idx` < self.num_sorts().
7153 >>> A = DeclareSort('A')
7154 >>> B = DeclareSort('B')
7155 >>> a1, a2 = Consts('a1 a2', A)
7156 >>> b1, b2 = Consts('b1 b2', B)
7158 >>> s.add(a1 != a2, b1 != b2)
7174 """Return all uninterpreted sorts that have an interpretation in the model `self`.
7176 >>> A = DeclareSort('A')
7177 >>> B = DeclareSort('B')
7178 >>> a1, a2 = Consts('a1 a2', A)
7179 >>> b1, b2 = Consts('b1 b2', B)
7181 >>> s.add(a1 != a2, b1 != b2)
7191 """Return the interpretation for the uninterpreted sort `s` in the model `self`.
7193 >>> A = DeclareSort('A')
7194 >>> a, b = Consts('a b', A)
7200 >>> m.get_universe(A)
7204 _z3_assert(isinstance(s, SortRef),
"Z3 sort expected")
7211 """If `idx` is an integer, then the declaration at position `idx` in the model `self` is returned.
7212 If `idx` is a declaration, then the actual interpretation is returned.
7214 The elements can be retrieved using position or the actual declaration.
7216 >>> f = Function('f', IntSort(), IntSort())
7219 >>> s.add(x > 0, x < 2, f(x) == 0)
7233 >>> for d in m: print("%s -> %s" % (d, m[d]))
7240 if idx < 0
or idx >= len(self):
7243 if (idx < num_consts):
7247 if isinstance(idx, FuncDeclRef):
7251 if isinstance(idx, SortRef):
7254 _z3_assert(
False,
"Integer, Z3 declaration, or Z3 constant expected. Use model.eval instead for complicated expressions")
7258 """Return a list with all symbols that have an interpretation in the model `self`.
7259 >>> f = Function('f', IntSort(), IntSort())
7262 >>> s.add(x > 0, x < 2, f(x) == 0)
7277 """Update the interpretation of a constant"""
7280 if is_func_decl(x)
and x.arity() != 0
and isinstance(value, FuncInterp):
7284 for i
in range(value.num_entries()):
7289 v.push(e.arg_value(j))
7294 raise Z3Exception(
"Expecting 0-ary function or constant expression")
7299 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
7302 _z3_assert(isinstance(target, Context),
"argument must be a Z3 context")
7307 """Perform model-based projection on fml with respect to vars.
7308 Assume that the model satisfies fml. Then compute a projection fml_p, such
7309 that vars do not occur free in fml_p, fml_p is true in the model and
7310 fml_p => exists vars . fml
7312 ctx = self.
ctx.ref()
7313 _vars = (Ast * len(vars))()
7314 for i
in range(len(vars)):
7315 _vars[i] = vars[i].as_ast()
7319 """Perform model-based projection, but also include realizer terms for the projected variables"""
7320 ctx = self.
ctx.ref()
7321 _vars = (Ast * len(vars))()
7322 for i
in range(len(vars)):
7323 _vars[i] = vars[i].as_ast()
7325 result = Z3_qe_model_project_with_witness(ctx, self.
model, len(vars), _vars, fml.ast, defs.map)
7340 for k, v
in eval.items():
7341 mdl.update_value(k, v)
7346 """Return true if n is a Z3 expression of the form (_ as-array f)."""
7347 return isinstance(n, ExprRef)
and Z3_is_as_array(n.ctx.ref(), n.as_ast())
7351 """Return the function declaration f associated with a Z3 expression of the form (_ as-array f)."""
7364 """Statistics for `Solver.check()`."""
7375 if self.
ctx.ref()
is not None and Z3_stats_dec_ref
is not None:
7382 out.write(u(
'<table border="1" cellpadding="2" cellspacing="0">'))
7385 out.write(u(
'<tr style="background-color:#CFCFCF">'))
7388 out.write(u(
"<tr>"))
7390 out.write(u(
"<td>%s</td><td>%s</td></tr>" % (k, v)))
7391 out.write(u(
"</table>"))
7392 return out.getvalue()
7397 """Return the number of statistical counters.
7400 >>> s = Then('simplify', 'nlsat').solver()
7404 >>> st = s.statistics()
7411 """Return the value of statistical counter at position `idx`. The result is a pair (key, value).
7414 >>> s = Then('simplify', 'nlsat').solver()
7418 >>> st = s.statistics()
7422 ('nlsat propagations', 2)
7424 ('nlsat restarts', 1)
7426 if idx >= len(self):
7435 """Return the list of statistical counters.
7438 >>> s = Then('simplify', 'nlsat').solver()
7442 >>> st = s.statistics()
7447 """Return the value of a particular statistical counter.
7450 >>> s = Then('simplify', 'nlsat').solver()
7454 >>> st = s.statistics()
7455 >>> st.get_key_value('nlsat propagations')
7458 for idx
in range(len(self)):
7464 raise Z3Exception(
"unknown key")
7467 """Access the value of statistical using attributes.
7469 Remark: to access a counter containing blank spaces (e.g., 'nlsat propagations'),
7470 we should use '_' (e.g., 'nlsat_propagations').
7473 >>> s = Then('simplify', 'nlsat').solver()
7477 >>> st = s.statistics()
7478 >>> st.nlsat_propagations
7483 key = name.replace(
"_",
" ")
7487 raise AttributeError
7497 """Represents the result of a satisfiability check: sat, unsat, unknown.
7503 >>> isinstance(r, CheckSatResult)
7514 return isinstance(other, CheckSatResult)
and self.
r == other.r
7517 return not self.
__eq__(other)
7521 if self.
r == Z3_L_TRUE:
7523 elif self.
r == Z3_L_FALSE:
7524 return "<b>unsat</b>"
7526 return "<b>unknown</b>"
7528 if self.
r == Z3_L_TRUE:
7530 elif self.
r == Z3_L_FALSE:
7536 in_html = in_html_mode()
7539 set_html_mode(in_html)
7550 Solver API provides methods for implementing the main SMT 2.0 commands:
7551 push, pop, check, get-model, etc.
7554 def __init__(self, solver=None, ctx=None, logFile=None):
7555 assert solver
is None or ctx
is not None
7564 if logFile
is not None:
7565 self.
set(
"smtlib2_log", logFile)
7568 if self.
solver is not None and self.
ctx.ref()
is not None and Z3_solver_dec_ref
is not None:
7579 """Set a configuration option.
7580 The method `help()` return a string containing all available options.
7583 >>> # The option MBQI can be set using three different approaches.
7584 >>> s.set(mbqi=True)
7585 >>> s.set('MBQI', True)
7586 >>> s.set(':mbqi', True)
7592 """Create a backtracking point.
7614 """Backtrack \\c num backtracking points.
7636 """Return the current number of backtracking points.
7654 """Remove all asserted constraints and backtracking points created using `push()`.
7668 """Assert constraints into the solver.
7672 >>> s.assert_exprs(x > 0, x < 2)
7679 if isinstance(arg, Goal)
or isinstance(arg, AstVector):
7687 """Assert constraints into the solver.
7691 >>> s.add(x > 0, x < 2)
7702 """Assert constraints into the solver.
7706 >>> s.append(x > 0, x < 2)
7713 """Assert constraints into the solver.
7717 >>> s.insert(x > 0, x < 2)
7724 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
7726 If `p` is a string, it will be automatically converted into a Boolean constant.
7731 >>> s.set(unsat_core=True)
7732 >>> s.assert_and_track(x > 0, 'p1')
7733 >>> s.assert_and_track(x != 1, 'p2')
7734 >>> s.assert_and_track(x < 0, p3)
7735 >>> print(s.check())
7737 >>> c = s.unsat_core()
7747 if isinstance(p, str):
7749 _z3_assert(isinstance(a, BoolRef),
"Boolean expression expected")
7754 """Check whether the assertions in the given solver plus the optional assumptions are consistent or not.
7760 >>> s.add(x > 0, x < 2)
7763 >>> s.model().eval(x)
7769 >>> s.add(2**x == 4)
7775 num = len(assumptions)
7776 _assumptions = (Ast * num)()
7777 for i
in range(num):
7778 _assumptions[i] = s.cast(assumptions[i]).as_ast()
7783 """Return a model for the last `check()`.
7785 This function raises an exception if
7786 a model is not available (e.g., last `check()` returned unsat).
7790 >>> s.add(a + 2 == 0)
7799 raise Z3Exception(
"model is not available")
7802 """Import model converter from other into the current solver"""
7803 Z3_solver_import_model_converter(self.ctx.ref(), other.solver, self.solver)
7805 def interrupt(self):
7806 """Interrupt the execution of the solver object.
7807 Remarks: This ensures that the interrupt applies only
7808 to the given solver object and it applies only if it is running.
7810 Z3_solver_interrupt(self.ctx.ref(), self.solver)
7812 def unsat_core(self):
7813 """Return a subset (as an AST vector) of the assumptions provided to the last check().
7815 These are the assumptions Z3 used in the unsatisfiability proof.
7816 Assumptions are available in Z3. They are used to extract unsatisfiable cores.
7817 They may be also used to "retract" assumptions. Note that, assumptions are not really
7818 "soft constraints", but they can be used to implement them.
7820 >>> p1, p2, p3 = Bools('p1 p2 p3')
7821 >>> x, y = Ints('x y')
7823 >>> s.add(Implies(p1, x > 0))
7824 >>> s.add(Implies(p2, y > x))
7825 >>> s.add(Implies(p2, y < 1))
7826 >>> s.add(Implies(p3, y > -3))
7827 >>> s.check(p1, p2, p3)
7829 >>> core = s.unsat_core()
7838 >>> # "Retracting" p2
7842 return AstVector(Z3_solver_get_unsat_core(self.ctx.ref(), self.solver), self.ctx)
7844 def consequences(self, assumptions, variables):
7845 """Determine fixed values for the variables based on the solver state and assumptions.
7847 >>> a, b, c, d = Bools('a b c d')
7848 >>> s.add(Implies(a,b), Implies(b, c))
7849 >>> s.consequences([a],[b,c,d])
7850 (sat, [Implies(a, b), Implies(a, c)])
7851 >>> s.consequences([Not(c),d],[a,b,c,d])
7852 (sat, [Implies(d, d), Implies(Not(c), Not(c)), Implies(Not(c), Not(b)), Implies(Not(c), Not(a))])
7854 if isinstance(assumptions, list):
7855 _asms = AstVector(None, self.ctx)
7856 for a in assumptions:
7859 if isinstance(variables, list):
7860 _vars = AstVector(None, self.ctx)
7864 _z3_assert(isinstance(assumptions, AstVector), "ast vector expected")
7865 _z3_assert(isinstance(variables, AstVector), "ast vector expected")
7866 consequences = AstVector(None, self.ctx)
7867 r = Z3_solver_get_consequences(self.ctx.ref(), self.solver, assumptions.vector,
7868 variables.vector, consequences.vector)
7869 sz = len(consequences)
7870 consequences = [consequences[i] for i in range(sz)]
7871 return CheckSatResult(r), consequences
7873 def from_file(self, filename):
7874 """Parse assertions from a file"""
7875 Z3_solver_from_file(self.ctx.ref(), self.solver, filename)
7877 def from_string(self, s):
7878 """Parse assertions from a string"""
7879 Z3_solver_from_string(self.ctx.ref(), self.solver, s)
7881 def cube(self, vars=None):
7883 The method takes an optional set of variables that restrict which
7884 variables may be used as a starting point for cubing.
7885 If vars is not None, then the first case split is based on a variable in
7888 self.cube_vs = AstVector(None, self.ctx)
7889 if vars is not None:
7891 self.cube_vs.push(v)
7893 lvl = self.backtrack_level
7894 self.backtrack_level = 4000000000
7895 r = AstVector(Z3_solver_cube(self.ctx.ref(), self.solver, self.cube_vs.vector, lvl), self.ctx)
7896 if (len(r) == 1 and is_false(r[0])):
7902 def cube_vars(self):
7903 """Access the set of variables that were touched by the most recently generated cube.
7904 This set of variables can be used as a starting point for additional cubes.
7905 The idea is that variables that appear in clauses that are reduced by the most recent
7906 cube are likely more useful to cube on."""
7909 def congruence_root(self, t):
7910 """Retrieve congruence closure root of the term t relative to the current search state
7911 The function primarily works for SimpleSolver. Terms and variables that are
7912 eliminated during pre-processing are not visible to the congruence closure.
7914 t = _py2expr(t, self.ctx)
7915 return _to_expr_ref(Z3_solver_congruence_root(self.ctx.ref(), self.solver, t.ast), self.ctx)
7917 def congruence_next(self, t):
7918 """Retrieve congruence closure sibling of the term t relative to the current search state
7919 The function primarily works for SimpleSolver. Terms and variables that are
7920 eliminated during pre-processing are not visible to the congruence closure.
7922 t = _py2expr(t, self.ctx)
7923 return _to_expr_ref(Z3_solver_congruence_next(self.ctx.ref(), self.solver, t.ast), self.ctx)
7925 def congruence_explain(self, a, b):
7926 """Explain congruence of a and b relative to the current search state"""
7927 a = _py2expr(a, self.ctx)
7928 b = _py2expr(b, self.ctx)
7929 return _to_expr_ref(Z3_solver_congruence_explain(self.ctx.ref(), self.solver, a.ast, b.ast), self.ctx)
7932 def solve_for(self, ts):
7933 """Retrieve a solution for t relative to linear equations maintained in the current state."""
7934 vars = AstVector(ctx=self.ctx);
7935 terms = AstVector(ctx=self.ctx);
7936 guards = AstVector(ctx=self.ctx);
7938 t = _py2expr(t, self.ctx)
7940 Z3_solver_solve_for(self.ctx.ref(), self.solver, vars.vector, terms.vector, guards.vector)
7941 return [(vars[i], terms[i], guards[i]) for i in range(len(vars))]
7945 """Return a proof for the last `check()`. Proof construction must be enabled."""
7946 return _to_expr_ref(Z3_solver_get_proof(self.ctx.ref(), self.solver), self.ctx)
7948 def assertions(self):
7949 """Return an AST vector containing all added constraints.
7960 return AstVector(Z3_solver_get_assertions(self.ctx.ref(), self.solver), self.ctx)
7963 """Return an AST vector containing all currently inferred units.
7965 return AstVector(Z3_solver_get_units(self.ctx.ref(), self.solver), self.ctx)
7967 def non_units(self):
7968 """Return an AST vector containing all atomic formulas in solver state that are not units.
7970 return AstVector(Z3_solver_get_non_units(self.ctx.ref(), self.solver), self.ctx)
7972 def trail_levels(self):
7973 """Return trail and decision levels of the solver state after a check() call.
7975 trail = self.trail()
7976 levels = (ctypes.c_uint * len(trail))()
7977 Z3_solver_get_levels(self.ctx.ref(), self.solver, trail.vector, len(trail), levels)
7978 return trail, levels
7980 def set_initial_value(self, var, value):
7981 """initialize the solver's state by setting the initial value of var to value
7984 value = s.cast(value)
7985 Z3_solver_set_initial_value(self.ctx.ref(), self.solver, var.ast, value.ast)
7988 """Return trail of the solver state after a check() call.
7990 return AstVector(Z3_solver_get_trail(self.ctx.ref(), self.solver), self.ctx)
7992 def statistics(self):
7993 """Return statistics for the last `check()`.
7995 >>> s = SimpleSolver()
8000 >>> st = s.statistics()
8001 >>> st.get_key_value('final checks')
8008 return Statistics(Z3_solver_get_statistics(self.ctx.ref(), self.solver), self.ctx)
8010 def reason_unknown(self):
8011 """Return a string describing why the last `check()` returned `unknown`.
8014 >>> s = SimpleSolver()
8015 >>> s.add(x == 2**x)
8018 >>> s.reason_unknown()
8019 '(incomplete (theory arithmetic))'
8021 return Z3_solver_get_reason_unknown(self.ctx.ref(), self.solver)
8024 """Display a string describing all available options."""
8025 print(Z3_solver_get_help(self.ctx.ref(), self.solver))
8027 def param_descrs(self):
8028 """Return the parameter description set."""
8029 return ParamDescrsRef(Z3_solver_get_param_descrs(self.ctx.ref(), self.solver), self.ctx)
8032 """Return a formatted string with all added constraints."""
8033 return obj_to_string(self)
8035 def translate(self, target):
8036 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
8040 >>> s1 = Solver(ctx=c1)
8041 >>> s2 = s1.translate(c2)
8044 _z3_assert(isinstance(target, Context), "argument must be a Z3 context")
8045 solver = Z3_solver_translate(self.ctx.ref(), self.solver, target.ref())
8046 return Solver(solver, target)
8049 return self.translate(self.ctx)
8051 def __deepcopy__(self, memo={}):
8052 return self.translate(self.ctx)
8055 """Return a formatted string (in Lisp-like format) with all added constraints.
8057 return Z3_solver_to_string(self.ctx.ref(), self.solver)
8059 def dimacs(self, include_names=True):
8060 """Return a textual representation of the solver in DIMACS format."""
8061 return Z3_solver_to_dimacs_string(self.ctx.ref(), self.solver, include_names)
8064 """return SMTLIB2 formatted benchmark for solver's assertions"""
8065 es = self.assertions()
8071 for i in range(sz1):
8072 v[i] = es[i].as_ast()
8074 e = es[sz1].as_ast()
8076 e = BoolVal(True, self.ctx).as_ast()
8077 return Z3_benchmark_to_smtlib_string(
8078 self.ctx.ref(), "benchmark generated from python API", "", "unknown", "", sz1, v, e,
8081 def solutions(self, t):
8082 """Returns an iterator over solutions that satisfy the constraints.
8084 The parameter `t` is an expression whose values should be returned.
8087 >>> x, y, z = Ints("x y z")
8088 >>> s.add(x * x == 4)
8089 >>> print(list(s.solutions(x)))
8092 >>> s.add(x >= 0, x < 10)
8093 >>> print(list(s.solutions(x)))
8094 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8096 >>> s.add(x >= 0, y < 10, y == 2*x)
8097 >>> print(list(s.solutions([x, y])))
8098 [[0, 0], [1, 2], [2, 4], [3, 6], [4, 8]]
8101 s.add(self.assertions())
8103 if isinstance(t, (list, tuple)):
8104 while s.check() == sat:
8105 result = [s.model().eval(t_, model_completion=True) for t_ in t]
8107 s.add(Or(t_ != result_ for t_, result_ in zip(t, result)))
8109 while s.check() == sat:
8110 result = s.model().eval(t, model_completion=True)
8115def SolverFor(logic, ctx=None, logFile=None):
8116 """Create a solver customized for the given logic.
8118 The parameter `logic` is a string. It should be contains
8119 the name of a SMT-LIB logic.
8120 See http://www.smtlib.org/ for the name of all available logics.
8122 >>> s = SolverFor("QF_LIA")
8132 logic = to_symbol(logic)
8133 return Solver(Z3_mk_solver_for_logic(ctx.ref(), logic), ctx, logFile)
8136def SimpleSolver(ctx=None, logFile=None):
8137 """Return a simple general purpose solver with limited amount of preprocessing.
8139 >>> s = SimpleSolver()
8146 return Solver(Z3_mk_simple_solver(ctx.ref()), ctx, logFile)
8148#########################################
8152#########################################
8155class Fixedpoint(Z3PPObject):
8156 """Fixedpoint API provides methods for solving with recursive predicates"""
8158 def __init__(self, fixedpoint=None, ctx=None):
8159 assert fixedpoint is None or ctx is not None
8160 self.ctx = _get_ctx(ctx)
8161 self.fixedpoint = None
8162 if fixedpoint is None:
8163 self.fixedpoint = Z3_mk_fixedpoint(self.ctx.ref())
8165 self.fixedpoint = fixedpoint
8166 Z3_fixedpoint_inc_ref(self.ctx.ref(), self.fixedpoint)
8169 def __deepcopy__(self, memo={}):
8170 return FixedPoint(self.fixedpoint, self.ctx)
8173 if self.fixedpoint is not None and self.ctx.ref() is not None and Z3_fixedpoint_dec_ref is not None:
8174 Z3_fixedpoint_dec_ref(self.ctx.ref(), self.fixedpoint)
8176 def set(self, *args, **keys):
8177 """Set a configuration option. The method `help()` return a string containing all available options.
8179 p = args2params(args, keys, self.ctx)
8180 Z3_fixedpoint_set_params(self.ctx.ref(), self.fixedpoint, p.params)
8183 """Display a string describing all available options."""
8184 print(Z3_fixedpoint_get_help(self.ctx.ref(), self.fixedpoint))
8186 def param_descrs(self):
8187 """Return the parameter description set."""
8188 return ParamDescrsRef(Z3_fixedpoint_get_param_descrs(self.ctx.ref(), self.fixedpoint), self.ctx)
8190 def assert_exprs(self, *args):
8191 """Assert constraints as background axioms for the fixedpoint solver."""
8192 args = _get_args(args)
8193 s = BoolSort(self.ctx)
8195 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8197 f = self.abstract(f)
8198 Z3_fixedpoint_assert(self.ctx.ref(), self.fixedpoint, f.as_ast())
8201 arg = self.abstract(arg)
8202 Z3_fixedpoint_assert(self.ctx.ref(), self.fixedpoint, arg.as_ast())
8204 def add(self, *args):
8205 """Assert constraints as background axioms for the fixedpoint solver. Alias for assert_expr."""
8206 self.assert_exprs(*args)
8208 def __iadd__(self, fml):
8212 def append(self, *args):
8213 """Assert constraints as background axioms for the fixedpoint solver. Alias for assert_expr."""
8214 self.assert_exprs(*args)
8216 def insert(self, *args):
8217 """Assert constraints as background axioms for the fixedpoint solver. Alias for assert_expr."""
8218 self.assert_exprs(*args)
8220 def add_rule(self, head, body=None, name=None):
8221 """Assert rules defining recursive predicates to the fixedpoint solver.
8224 >>> s = Fixedpoint()
8225 >>> s.register_relation(a.decl())
8226 >>> s.register_relation(b.decl())
8234 name = to_symbol(name, self.ctx)
8236 head = self.abstract(head)
8237 Z3_fixedpoint_add_rule(self.ctx.ref(), self.fixedpoint, head.as_ast(), name)
8239 body = _get_args(body)
8240 f = self.abstract(Implies(And(body, self.ctx), head))
8241 Z3_fixedpoint_add_rule(self.ctx.ref(), self.fixedpoint, f.as_ast(), name)
8243 def rule(self, head, body=None, name=None):
8244 """Assert rules defining recursive predicates to the fixedpoint solver. Alias for add_rule."""
8245 self.add_rule(head, body, name)
8247 def fact(self, head, name=None):
8248 """Assert facts defining recursive predicates to the fixedpoint solver. Alias for add_rule."""
8249 self.add_rule(head, None, name)
8251 def query(self, *query):
8252 """Query the fixedpoint engine whether formula is derivable.
8253 You can also pass an tuple or list of recursive predicates.
8255 query = _get_args(query)
8257 if sz >= 1 and isinstance(query[0], FuncDeclRef):
8258 _decls = (FuncDecl * sz)()
8263 r = Z3_fixedpoint_query_relations(self.ctx.ref(), self.fixedpoint, sz, _decls)
8268 query = And(query, self.ctx)
8269 query = self.abstract(query, False)
8270 r = Z3_fixedpoint_query(self.ctx.ref(), self.fixedpoint, query.as_ast())
8271 return CheckSatResult(r)
8273 def query_from_lvl(self, lvl, *query):
8274 """Query the fixedpoint engine whether formula is derivable starting at the given query level.
8276 query = _get_args(query)
8278 if sz >= 1 and isinstance(query[0], FuncDecl):
8279 _z3_assert(False, "unsupported")
8285 query = self.abstract(query, False)
8286 r = Z3_fixedpoint_query_from_lvl(self.ctx.ref(), self.fixedpoint, query.as_ast(), lvl)
8287 return CheckSatResult(r)
8289 def update_rule(self, head, body, name):
8293 name = to_symbol(name, self.ctx)
8294 body = _get_args(body)
8295 f = self.abstract(Implies(And(body, self.ctx), head))
8296 Z3_fixedpoint_update_rule(self.ctx.ref(), self.fixedpoint, f.as_ast(), name)
8298 def get_answer(self):
8299 """Retrieve answer from last query call."""
8300 r = Z3_fixedpoint_get_answer(self.ctx.ref(), self.fixedpoint)
8301 return _to_expr_ref(r, self.ctx)
8303 def get_ground_sat_answer(self):
8304 """Retrieve a ground cex from last query call."""
8305 r = Z3_fixedpoint_get_ground_sat_answer(self.ctx.ref(), self.fixedpoint)
8306 return _to_expr_ref(r, self.ctx)
8308 def get_rules_along_trace(self):
8309 """retrieve rules along the counterexample trace"""
8310 return AstVector(Z3_fixedpoint_get_rules_along_trace(self.ctx.ref(), self.fixedpoint), self.ctx)
8312 def get_rule_names_along_trace(self):
8313 """retrieve rule names along the counterexample trace"""
8314 # this is a hack as I don't know how to return a list of symbols from C++;
8315 # obtain names as a single string separated by semicolons
8316 names = _symbol2py(self.ctx, Z3_fixedpoint_get_rule_names_along_trace(self.ctx.ref(), self.fixedpoint))
8317 # split into individual names
8318 return names.split(";")
8320 def get_num_levels(self, predicate):
8321 """Retrieve number of levels used for predicate in PDR engine"""
8322 return Z3_fixedpoint_get_num_levels(self.ctx.ref(), self.fixedpoint, predicate.ast)
8324 def get_cover_delta(self, level, predicate):
8325 """Retrieve properties known about predicate for the level'th unfolding.
8326 -1 is treated as the limit (infinity)
8328 r = Z3_fixedpoint_get_cover_delta(self.ctx.ref(), self.fixedpoint, level, predicate.ast)
8329 return _to_expr_ref(r, self.ctx)
8331 def add_cover(self, level, predicate, property):
8332 """Add property to predicate for the level'th unfolding.
8333 -1 is treated as infinity (infinity)
8335 Z3_fixedpoint_add_cover(self.ctx.ref(), self.fixedpoint, level, predicate.ast, property.ast)
8337 def register_relation(self, *relations):
8338 """Register relation as recursive"""
8339 relations = _get_args(relations)
8341 Z3_fixedpoint_register_relation(self.ctx.ref(), self.fixedpoint, f.ast)
8343 def set_predicate_representation(self, f, *representations):
8344 """Control how relation is represented"""
8345 representations = _get_args(representations)
8346 representations = [to_symbol(s) for s in representations]
8347 sz = len(representations)
8348 args = (Symbol * sz)()
8350 args[i] = representations[i]
8351 Z3_fixedpoint_set_predicate_representation(self.ctx.ref(), self.fixedpoint, f.ast, sz, args)
8353 def parse_string(self, s):
8354 """Parse rules and queries from a string"""
8355 return AstVector(Z3_fixedpoint_from_string(self.ctx.ref(), self.fixedpoint, s), self.ctx)
8357 def parse_file(self, f):
8358 """Parse rules and queries from a file"""
8359 return AstVector(Z3_fixedpoint_from_file(self.ctx.ref(), self.fixedpoint, f), self.ctx)
8361 def get_rules(self):
8362 """retrieve rules that have been added to fixedpoint context"""
8363 return AstVector(Z3_fixedpoint_get_rules(self.ctx.ref(), self.fixedpoint), self.ctx)
8365 def get_assertions(self):
8366 """retrieve assertions that have been added to fixedpoint context"""
8367 return AstVector(Z3_fixedpoint_get_assertions(self.ctx.ref(), self.fixedpoint), self.ctx)
8370 """Return a formatted string with all added rules and constraints."""
8374 """Return a formatted string (in Lisp-like format) with all added constraints.
8375 We say the string is in s-expression format.
8377 return Z3_fixedpoint_to_string(self.ctx.ref(), self.fixedpoint, 0, (Ast * 0)())
8379 def to_string(self, queries):
8380 """Return a formatted string (in Lisp-like format) with all added constraints.
8381 We say the string is in s-expression format.
8382 Include also queries.
8384 args, len = _to_ast_array(queries)
8385 return Z3_fixedpoint_to_string(self.ctx.ref(), self.fixedpoint, len, args)
8387 def statistics(self):
8388 """Return statistics for the last `query()`.
8390 return Statistics(Z3_fixedpoint_get_statistics(self.ctx.ref(), self.fixedpoint), self.ctx)
8392 def reason_unknown(self):
8393 """Return a string describing why the last `query()` returned `unknown`.
8395 return Z3_fixedpoint_get_reason_unknown(self.ctx.ref(), self.fixedpoint)
8397 def declare_var(self, *vars):
8398 """Add variable or several variables.
8399 The added variable or variables will be bound in the rules
8402 vars = _get_args(vars)
8406 def abstract(self, fml, is_forall=True):
8410 return ForAll(self.vars, fml)
8412 return Exists(self.vars, fml)
8415#########################################
8419#########################################
8421class FiniteDomainSortRef(SortRef):
8422 """Finite domain sort."""
8425 """Return the size of the finite domain sort"""
8426 r = (ctypes.c_ulonglong * 1)()
8427 if Z3_get_finite_domain_sort_size(self.ctx_ref(), self.ast, r):
8430 raise Z3Exception("Failed to retrieve finite domain sort size")
8433def FiniteDomainSort(name, sz, ctx=None):
8434 """Create a named finite domain sort of a given size sz"""
8435 if not isinstance(name, Symbol):
8436 name = to_symbol(name)
8438 return FiniteDomainSortRef(Z3_mk_finite_domain_sort(ctx.ref(), name, sz), ctx)
8441def is_finite_domain_sort(s):
8442 """Return True if `s` is a Z3 finite-domain sort.
8444 >>> is_finite_domain_sort(FiniteDomainSort('S', 100))
8446 >>> is_finite_domain_sort(IntSort())
8449 return isinstance(s, FiniteDomainSortRef)
8452class FiniteDomainRef(ExprRef):
8453 """Finite-domain expressions."""
8456 """Return the sort of the finite-domain expression `self`."""
8457 return FiniteDomainSortRef(Z3_get_sort(self.ctx_ref(), self.as_ast()), self.ctx)
8459 def as_string(self):
8460 """Return a Z3 floating point expression as a Python string."""
8461 return Z3_ast_to_string(self.ctx_ref(), self.as_ast())
8464def is_finite_domain(a):
8465 """Return `True` if `a` is a Z3 finite-domain expression.
8467 >>> s = FiniteDomainSort('S', 100)
8468 >>> b = Const('b', s)
8469 >>> is_finite_domain(b)
8471 >>> is_finite_domain(Int('x'))
8474 return isinstance(a, FiniteDomainRef)
8477class FiniteDomainNumRef(FiniteDomainRef):
8478 """Integer values."""
8481 """Return a Z3 finite-domain numeral as a Python long (bignum) numeral.
8483 >>> s = FiniteDomainSort('S', 100)
8484 >>> v = FiniteDomainVal(3, s)
8490 return int(self.as_string())
8492 def as_string(self):
8493 """Return a Z3 finite-domain numeral as a Python string.
8495 >>> s = FiniteDomainSort('S', 100)
8496 >>> v = FiniteDomainVal(42, s)
8500 return Z3_get_numeral_string(self.ctx_ref(), self.as_ast())
8503def FiniteDomainVal(val, sort, ctx=None):
8504 """Return a Z3 finite-domain value. If `ctx=None`, then the global context is used.
8506 >>> s = FiniteDomainSort('S', 256)
8507 >>> FiniteDomainVal(255, s)
8509 >>> FiniteDomainVal('100', s)
8513 _z3_assert(is_finite_domain_sort(sort), "Expected finite-domain sort")
8515 return FiniteDomainNumRef(Z3_mk_numeral(ctx.ref(), _to_int_str(val), sort.ast), ctx)
8518def is_finite_domain_value(a):
8519 """Return `True` if `a` is a Z3 finite-domain value.
8521 >>> s = FiniteDomainSort('S', 100)
8522 >>> b = Const('b', s)
8523 >>> is_finite_domain_value(b)
8525 >>> b = FiniteDomainVal(10, s)
8528 >>> is_finite_domain_value(b)
8531 return is_finite_domain(a) and _is_numeral(a.ctx, a.as_ast())
8534#########################################
8538#########################################
8540class OptimizeObjective:
8541 def __init__(self, opt, value, is_max):
8544 self._is_max = is_max
8548 return _to_expr_ref(Z3_optimize_get_lower(opt.ctx.ref(), opt.optimize, self._value), opt.ctx)
8552 return _to_expr_ref(Z3_optimize_get_upper(opt.ctx.ref(), opt.optimize, self._value), opt.ctx)
8554 def lower_values(self):
8556 return AstVector(Z3_optimize_get_lower_as_vector(opt.ctx.ref(), opt.optimize, self._value), opt.ctx)
8558 def upper_values(self):
8560 return AstVector(Z3_optimize_get_upper_as_vector(opt.ctx.ref(), opt.optimize, self._value), opt.ctx)
8569 return "%s:%s" % (self._value, self._is_max)
8575def _global_on_model(ctx):
8576 (fn, mdl) = _on_models[ctx]
8580_on_model_eh = on_model_eh_type(_global_on_model)
8583class Optimize(Z3PPObject):
8584 """Optimize API provides methods for solving using objective functions and weighted soft constraints"""
8586 def __init__(self, optimize=None, ctx=None):
8587 self.ctx = _get_ctx(ctx)
8588 if optimize is None:
8589 self.optimize = Z3_mk_optimize(self.ctx.ref())
8591 self.optimize = optimize
8592 self._on_models_id = None
8593 Z3_optimize_inc_ref(self.ctx.ref(), self.optimize)
8596 return self.translate(self.ctx)
8598 def __deepcopy__(self, memo={}):
8599 return self.translate(self.ctx)
8602 if self.optimize is not None and self.ctx.ref() is not None and Z3_optimize_dec_ref is not None:
8603 Z3_optimize_dec_ref(self.ctx.ref(), self.optimize)
8604 if self._on_models_id is not None:
8605 del _on_models[self._on_models_id]
8607 def __enter__(self):
8611 def __exit__(self, *exc_info):
8614 def set(self, *args, **keys):
8615 """Set a configuration option.
8616 The method `help()` return a string containing all available options.
8618 p = args2params(args, keys, self.ctx)
8619 Z3_optimize_set_params(self.ctx.ref(), self.optimize, p.params)
8622 """Display a string describing all available options."""
8623 print(Z3_optimize_get_help(self.ctx.ref(), self.optimize))
8625 def param_descrs(self):
8626 """Return the parameter description set."""
8627 return ParamDescrsRef(Z3_optimize_get_param_descrs(self.ctx.ref(), self.optimize), self.ctx)
8629 def assert_exprs(self, *args):
8630 """Assert constraints as background axioms for the optimize solver."""
8631 args = _get_args(args)
8632 s = BoolSort(self.ctx)
8634 if isinstance(arg, Goal) or isinstance(arg, AstVector):
8636 Z3_optimize_assert(self.ctx.ref(), self.optimize, f.as_ast())
8639 Z3_optimize_assert(self.ctx.ref(), self.optimize, arg.as_ast())
8641 def add(self, *args):
8642 """Assert constraints as background axioms for the optimize solver. Alias for assert_expr."""
8643 self.assert_exprs(*args)
8645 def __iadd__(self, fml):
8649 def assert_and_track(self, a, p):
8650 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
8652 If `p` is a string, it will be automatically converted into a Boolean constant.
8657 >>> s.assert_and_track(x > 0, 'p1')
8658 >>> s.assert_and_track(x != 1, 'p2')
8659 >>> s.assert_and_track(x < 0, p3)
8660 >>> print(s.check())
8662 >>> c = s.unsat_core()
8672 if isinstance(p, str):
8673 p = Bool(p, self.ctx)
8674 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
8675 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
8676 Z3_optimize_assert_and_track(self.ctx.ref(), self.optimize, a.as_ast(), p.as_ast())
8678 def add_soft(self, arg, weight="1", id=None):
8679 """Add soft constraint with optional weight and optional identifier.
8680 If no weight is supplied, then the penalty for violating the soft constraint
8682 Soft constraints are grouped by identifiers. Soft constraints that are
8683 added without identifiers are grouped by default.
8686 weight = "%d" % weight
8687 elif isinstance(weight, float):
8688 weight = "%f" % weight
8689 if not isinstance(weight, str):
8690 raise Z3Exception("weight should be a string or an integer")
8693 id = to_symbol(id, self.ctx)
8696 v = Z3_optimize_assert_soft(self.ctx.ref(), self.optimize, a.as_ast(), weight, id)
8697 return OptimizeObjective(self, v, False)
8698 if sys.version_info.major >= 3 and isinstance(arg, Iterable):
8699 return [asoft(a) for a in arg]
8702 def set_initial_value(self, var, value):
8703 """initialize the solver's state by setting the initial value of var to value
8706 value = s.cast(value)
8707 Z3_optimize_set_initial_value(self.ctx.ref(), self.optimize, var.ast, value.ast)
8709 def maximize(self, arg):
8710 """Add objective function to maximize."""
8711 return OptimizeObjective(
8713 Z3_optimize_maximize(self.ctx.ref(), self.optimize, arg.as_ast()),
8717 def minimize(self, arg):
8718 """Add objective function to minimize."""
8719 return OptimizeObjective(
8721 Z3_optimize_minimize(self.ctx.ref(), self.optimize, arg.as_ast()),
8726 """create a backtracking point for added rules, facts and assertions"""
8727 Z3_optimize_push(self.ctx.ref(), self.optimize)
8730 """restore to previously created backtracking point"""
8731 Z3_optimize_pop(self.ctx.ref(), self.optimize)
8733 def check(self, *assumptions):
8734 """Check consistency and produce optimal values."""
8735 assumptions = _get_args(assumptions)
8736 num = len(assumptions)
8737 _assumptions = (Ast * num)()
8738 for i in range(num):
8739 _assumptions[i] = assumptions[i].as_ast()
8740 return CheckSatResult(Z3_optimize_check(self.ctx.ref(), self.optimize, num, _assumptions))
8742 def reason_unknown(self):
8743 """Return a string that describes why the last `check()` returned `unknown`."""
8744 return Z3_optimize_get_reason_unknown(self.ctx.ref(), self.optimize)
8747 """Return a model for the last check()."""
8749 return ModelRef(Z3_optimize_get_model(self.ctx.ref(), self.optimize), self.ctx)
8751 raise Z3Exception("model is not available")
8753 def unsat_core(self):
8754 return AstVector(Z3_optimize_get_unsat_core(self.ctx.ref(), self.optimize), self.ctx)
8756 def lower(self, obj):
8757 if not isinstance(obj, OptimizeObjective):
8758 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8761 def upper(self, obj):
8762 if not isinstance(obj, OptimizeObjective):
8763 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8766 def lower_values(self, obj):
8767 if not isinstance(obj, OptimizeObjective):
8768 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8769 return obj.lower_values()
8771 def upper_values(self, obj):
8772 if not isinstance(obj, OptimizeObjective):
8773 raise Z3Exception("Expecting objective handle returned by maximize/minimize")
8774 return obj.upper_values()
8776 def from_file(self, filename):
8777 """Parse assertions and objectives from a file"""
8778 Z3_optimize_from_file(self.ctx.ref(), self.optimize, filename)
8780 def from_string(self, s):
8781 """Parse assertions and objectives from a string"""
8782 Z3_optimize_from_string(self.ctx.ref(), self.optimize, s)
8784 def assertions(self):
8785 """Return an AST vector containing all added constraints."""
8786 return AstVector(Z3_optimize_get_assertions(self.ctx.ref(), self.optimize), self.ctx)
8788 def objectives(self):
8789 """returns set of objective functions"""
8790 return AstVector(Z3_optimize_get_objectives(self.ctx.ref(), self.optimize), self.ctx)
8793 """Return a formatted string with all added rules and constraints."""
8797 """Return a formatted string (in Lisp-like format) with all added constraints.
8798 We say the string is in s-expression format.
8800 return Z3_optimize_to_string(self.ctx.ref(), self.optimize)
8802 def statistics(self):
8803 """Return statistics for the last check`.
8805 return Statistics(Z3_optimize_get_statistics(self.ctx.ref(), self.optimize), self.ctx)
8807 def translate(self, target):
8808 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
8812 >>> o1 = Optimize(ctx=c1)
8813 >>> o2 = o1.translate(c2)
8816 _z3_assert(isinstance(target, Context), "argument must be a Z3 context")
8817 opt = Z3_optimize_translate(self.ctx.ref(), self.optimize, target.ref())
8818 return Optimize(opt, target)
8820 def set_on_model(self, on_model):
8821 """Register a callback that is invoked with every incremental improvement to
8822 objective values. The callback takes a model as argument.
8823 The life-time of the model is limited to the callback so the
8824 model has to be (deep) copied if it is to be used after the callback
8826 id = len(_on_models) + 41
8827 mdl = Model(self.ctx)
8828 _on_models[id] = (on_model, mdl)
8829 self._on_models_id = id
8830 Z3_optimize_register_model_eh(
8831 self.ctx.ref(), self.optimize, mdl.model, ctypes.c_void_p(id), _on_model_eh,
8835#########################################
8839#########################################
8840class ApplyResult(Z3PPObject):
8841 """An ApplyResult object contains the subgoals produced by a tactic when applied to a goal.
8842 It also contains model and proof converters.
8845 def __init__(self, result, ctx):
8846 self.result = result
8848 Z3_apply_result_inc_ref(self.ctx.ref(), self.result)
8850 def __deepcopy__(self, memo={}):
8851 return ApplyResult(self.result, self.ctx)
8854 if self.ctx.ref() is not None and Z3_apply_result_dec_ref is not None:
8855 Z3_apply_result_dec_ref(self.ctx.ref(), self.result)
8858 """Return the number of subgoals in `self`.
8860 >>> a, b = Ints('a b')
8862 >>> g.add(Or(a == 0, a == 1), Or(b == 0, b == 1), a > b)
8863 >>> t = Tactic('split-clause')
8867 >>> t = Then(Tactic('split-clause'), Tactic('split-clause'))
8870 >>> t = Then(Tactic('split-clause'), Tactic('split-clause'), Tactic('propagate-values'))
8874 return int(Z3_apply_result_get_num_subgoals(self.ctx.ref(), self.result))
8876 def __getitem__(self, idx):
8877 """Return one of the subgoals stored in ApplyResult object `self`.
8879 >>> a, b = Ints('a b')
8881 >>> g.add(Or(a == 0, a == 1), Or(b == 0, b == 1), a > b)
8882 >>> t = Tactic('split-clause')
8885 [a == 0, Or(b == 0, b == 1), a > b]
8887 [a == 1, Or(b == 0, b == 1), a > b]
8891 if idx < 0 or idx >= len(self):
8893 return Goal(goal=Z3_apply_result_get_subgoal(self.ctx.ref(), self.result, idx), ctx=self.ctx)
8896 return obj_to_string(self)
8899 """Return a textual representation of the s-expression representing the set of subgoals in `self`."""
8900 return Z3_apply_result_to_string(self.ctx.ref(), self.result)
8903 """Return a Z3 expression consisting of all subgoals.
8908 >>> g.add(Or(x == 2, x == 3))
8909 >>> r = Tactic('simplify')(g)
8911 [[Not(x <= 1), Or(x == 2, x == 3)]]
8913 And(Not(x <= 1), Or(x == 2, x == 3))
8914 >>> r = Tactic('split-clause')(g)
8916 [[x > 1, x == 2], [x > 1, x == 3]]
8918 Or(And(x > 1, x == 2), And(x > 1, x == 3))
8922 return BoolVal(False, self.ctx)
8924 return self[0].as_expr()
8926 return Or([self[i].as_expr() for i in range(len(self))])
8928#########################################
8932#########################################
8934def num_simplifiers(ctx=None):
8935 """Return the number of simplifiers supported by the given context."""
8936 return Z3_get_num_simplifiers(_get_ctx(ctx).ref())
8939def simplifier_name(i, ctx=None):
8940 """Return the name of the i-th simplifier supported by the given context."""
8941 return Z3_get_simplifier_name(_get_ctx(ctx).ref(), i)
8944def simplifier_description(name, ctx=None):
8945 """Return the description of the simplifier identified by name."""
8946 return Z3_simplifier_get_descr(_get_ctx(ctx).ref(), name)
8950 """Simplifiers act as pre-processing utilities for solvers.
8951 Build a custom simplifier and add it to a solve
r"""
8953 def __init__(self, simplifier, ctx=None):
8954 self.ctx = _get_ctx(ctx)
8955 self.simplifier = None
8956 if isinstance(simplifier, SimplifierObj):
8957 self.simplifier = simplifier
8958 elif isinstance(simplifier, list):
8959 simps = [Simplifier(s, ctx) for s in simplifier]
8960 self.simplifier = simps[0].simplifier
8961 for i in range(1, len(simps)):
8962 self.simplifier = Z3_simplifier_and_then(self.ctx.ref(), self.simplifier, simps[i].simplifier)
8963 Z3_simplifier_inc_ref(self.ctx.ref(), self.simplifier)
8967 _z3_assert(isinstance(simplifier, str), "simplifier name expected")
8969 self.simplifier = Z3_mk_simplifier(self.ctx.ref(), str(simplifier))
8971 raise Z3Exception("unknown simplifier '%s'" % simplifier)
8972 Z3_simplifier_inc_ref(self.ctx.ref(), self.simplifier)
8974 def __deepcopy__(self, memo={}):
8975 return Simplifier(self.simplifier, self.ctx)
8978 if self.simplifier is not None and self.ctx.ref() is not None and Z3_simplifier_dec_ref is not None:
8979 Z3_simplifier_dec_ref(self.ctx.ref(), self.simplifier)
8981 def using_params(self, *args, **keys):
8982 """Return a simplifier that uses the given configuration options"""
8983 p = args2params(args, keys, self.ctx)
8984 return Simplifier(Z3_simplifier_using_params(self.ctx.ref(), self.simplifier, p.params), self.ctx)
8986 def add(self, solver):
8987 """Return a solver that applies the simplification pre-processing specified by the simplifie
r"""
8988 return Solver(Z3_solver_add_simplifier(self.ctx.ref(), solver.solver, self.simplifier), self.ctx)
8991 """Display a string containing a description of the available options for the `self` simplifier."""
8992 print(Z3_simplifier_get_help(self.ctx.ref(), self.simplifier))
8994 def param_descrs(self):
8995 """Return the parameter description set."""
8996 return ParamDescrsRef(Z3_simplifier_get_param_descrs(self.ctx.ref(), self.simplifier), self.ctx)
8999#########################################
9003#########################################
9007 """Tactics transform, solver and/or simplify sets of constraints (Goal).
9008 A Tactic can be converted into a Solver using the method solver().
9010 Several combinators are available for creating new tactics using the built-in ones:
9011 Then(), OrElse(), FailIf(), Repeat(), When(), Cond().
9014 def __init__(self, tactic, ctx=None):
9015 self.ctx = _get_ctx(ctx)
9017 if isinstance(tactic, TacticObj):
9018 self.tactic = tactic
9021 _z3_assert(isinstance(tactic, str), "tactic name expected")
9023 self.tactic = Z3_mk_tactic(self.ctx.ref(), str(tactic))
9025 raise Z3Exception("unknown tactic '%s'" % tactic)
9026 Z3_tactic_inc_ref(self.ctx.ref(), self.tactic)
9028 def __deepcopy__(self, memo={}):
9029 return Tactic(self.tactic, self.ctx)
9032 if self.tactic is not None and self.ctx.ref() is not None and Z3_tactic_dec_ref is not None:
9033 Z3_tactic_dec_ref(self.ctx.ref(), self.tactic)
9035 def solver(self, logFile=None):
9036 """Create a solver using the tactic `self`.
9038 The solver supports the methods `push()` and `pop()`, but it
9039 will always solve each `check()` from scratch.
9041 >>> t = Then('simplify', 'nlsat')
9044 >>> s.add(x**2 == 2, x > 0)
9050 return Solver(Z3_mk_solver_from_tactic(self.ctx.ref(), self.tactic), self.ctx, logFile)
9052 def apply(self, goal, *arguments, **keywords):
9053 """Apply tactic `self` to the given goal or Z3 Boolean expression using the given options.
9055 >>> x, y = Ints('x y')
9056 >>> t = Tactic('solve-eqs')
9057 >>> t.apply(And(x == 0, y >= x + 1))
9061 _z3_assert(isinstance(goal, (Goal, BoolRef)), "Z3 Goal or Boolean expressions expected")
9062 goal = _to_goal(goal)
9063 if len(arguments) > 0 or len(keywords) > 0:
9064 p = args2params(arguments, keywords, self.ctx)
9065 return ApplyResult(Z3_tactic_apply_ex(self.ctx.ref(), self.tactic, goal.goal, p.params), self.ctx)
9067 return ApplyResult(Z3_tactic_apply(self.ctx.ref(), self.tactic, goal.goal), self.ctx)
9069 def __call__(self, goal, *arguments, **keywords):
9070 """Apply tactic `self` to the given goal or Z3 Boolean expression using the given options.
9072 >>> x, y = Ints('x y')
9073 >>> t = Tactic('solve-eqs')
9074 >>> t(And(x == 0, y >= x + 1))
9077 return self.apply(goal, *arguments, **keywords)
9080 """Display a string containing a description of the available options for the `self` tactic."""
9081 print(Z3_tactic_get_help(self.ctx.ref(), self.tactic))
9083 def param_descrs(self):
9084 """Return the parameter description set."""
9085 return ParamDescrsRef(Z3_tactic_get_param_descrs(self.ctx.ref(), self.tactic), self.ctx)
9089 if isinstance(a, BoolRef):
9090 goal = Goal(ctx=a.ctx)
9097def _to_tactic(t, ctx=None):
9098 if isinstance(t, Tactic):
9101 return Tactic(t, ctx)
9104def _and_then(t1, t2, ctx=None):
9105 t1 = _to_tactic(t1, ctx)
9106 t2 = _to_tactic(t2, ctx)
9108 _z3_assert(t1.ctx == t2.ctx, "Context mismatch")
9109 return Tactic(Z3_tactic_and_then(t1.ctx.ref(), t1.tactic, t2.tactic), t1.ctx)
9112def _or_else(t1, t2, ctx=None):
9113 t1 = _to_tactic(t1, ctx)
9114 t2 = _to_tactic(t2, ctx)
9116 _z3_assert(t1.ctx == t2.ctx, "Context mismatch")
9117 return Tactic(Z3_tactic_or_else(t1.ctx.ref(), t1.tactic, t2.tactic), t1.ctx)
9120def AndThen(*ts, **ks):
9121 """Return a tactic that applies the tactics in `*ts` in sequence.
9123 >>> x, y = Ints('x y')
9124 >>> t = AndThen(Tactic('simplify'), Tactic('solve-eqs'))
9125 >>> t(And(x == 0, y > x + 1))
9127 >>> t(And(x == 0, y > x + 1)).as_expr()
9131 _z3_assert(len(ts) >= 2, "At least two arguments expected")
9132 ctx = ks.get("ctx", None)
9135 for i in range(num - 1):
9136 r = _and_then(r, ts[i + 1], ctx)
9141 """Return a tactic that applies the tactics in `*ts` in sequence. Shorthand for AndThen(*ts, **ks).
9143 >>> x, y = Ints('x y')
9144 >>> t = Then(Tactic('simplify'), Tactic('solve-eqs'))
9145 >>> t(And(x == 0, y > x + 1))
9147 >>> t(And(x == 0, y > x + 1)).as_expr()
9150 return AndThen(*ts, **ks)
9153def OrElse(*ts, **ks):
9154 """Return a tactic that applies the tactics in `*ts` until one of them succeeds (it doesn't fail).
9157 >>> t = OrElse(Tactic('split-clause'), Tactic('skip'))
9158 >>> # Tactic split-clause fails if there is no clause in the given goal.
9161 >>> t(Or(x == 0, x == 1))
9162 [[x == 0], [x == 1]]
9165 _z3_assert(len(ts) >= 2, "At least two arguments expected")
9166 ctx = ks.get("ctx", None)
9169 for i in range(num - 1):
9170 r = _or_else(r, ts[i + 1], ctx)
9174def ParOr(*ts, **ks):
9175 """Return a tactic that applies the tactics in `*ts` in parallel until one of them succeeds (it doesn't fail).
9178 >>> t = ParOr(Tactic('simplify'), Tactic('fail'))
9183 _z3_assert(len(ts) >= 2, "At least two arguments expected")
9184 ctx = _get_ctx(ks.get("ctx", None))
9185 ts = [_to_tactic(t, ctx) for t in ts]
9187 _args = (TacticObj * sz)()
9189 _args[i] = ts[i].tactic
9190 return Tactic(Z3_tactic_par_or(ctx.ref(), sz, _args), ctx)
9193def ParThen(t1, t2, ctx=None):
9194 """Return a tactic that applies t1 and then t2 to every subgoal produced by t1.
9195 The subgoals are processed in parallel.
9197 >>> x, y = Ints('x y')
9198 >>> t = ParThen(Tactic('split-clause'), Tactic('propagate-values'))
9199 >>> t(And(Or(x == 1, x == 2), y == x + 1))
9200 [[x == 1, y == 2], [x == 2, y == 3]]
9202 t1 = _to_tactic(t1, ctx)
9203 t2 = _to_tactic(t2, ctx)
9205 _z3_assert(t1.ctx == t2.ctx, "Context mismatch")
9206 return Tactic(Z3_tactic_par_and_then(t1.ctx.ref(), t1.tactic, t2.tactic), t1.ctx)
9209def ParAndThen(t1, t2, ctx=None):
9210 """Alias for ParThen(t1, t2, ctx)."""
9211 return ParThen(t1, t2, ctx)
9214def With(t, *args, **keys):
9215 """Return a tactic that applies tactic `t` using the given configuration options.
9217 >>> x, y = Ints('x y')
9218 >>> t = With(Tactic('simplify'), som=True)
9219 >>> t((x + 1)*(y + 2) == 0)
9220 [[2*x + y + x*y == -2]]
9222 ctx = keys.pop("ctx", None)
9223 t = _to_tactic(t, ctx)
9224 p = args2params(args, keys, t.ctx)
9225 return Tactic(Z3_tactic_using_params(t.ctx.ref(), t.tactic, p.params), t.ctx)
9228def WithParams(t, p):
9229 """Return a tactic that applies tactic `t` using the given configuration options.
9231 >>> x, y = Ints('x y')
9233 >>> p.set("som", True)
9234 >>> t = WithParams(Tactic('simplify'), p)
9235 >>> t((x + 1)*(y + 2) == 0)
9236 [[2*x + y + x*y == -2]]
9238 t = _to_tactic(t, None)
9239 return Tactic(Z3_tactic_using_params(t.ctx.ref(), t.tactic, p.params), t.ctx)
9242def Repeat(t, max=4294967295, ctx=None):
9243 """Return a tactic that keeps applying `t` until the goal is not modified anymore
9244 or the maximum number of iterations `max` is reached.
9246 >>> x, y = Ints('x y')
9247 >>> c = And(Or(x == 0, x == 1), Or(y == 0, y == 1), x > y)
9248 >>> t = Repeat(OrElse(Tactic('split-clause'), Tactic('skip')))
9250 >>> for subgoal in r: print(subgoal)
9251 [x == 0, y == 0, x > y]
9252 [x == 0, y == 1, x > y]
9253 [x == 1, y == 0, x > y]
9254 [x == 1, y == 1, x > y]
9255 >>> t = Then(t, Tactic('propagate-values'))
9259 t = _to_tactic(t, ctx)
9260 return Tactic(Z3_tactic_repeat(t.ctx.ref(), t.tactic, max), t.ctx)
9263def TryFor(t, ms, ctx=None):
9264 """Return a tactic that applies `t` to a given goal for `ms` milliseconds.
9266 If `t` does not terminate in `ms` milliseconds, then it fails.
9268 t = _to_tactic(t, ctx)
9269 return Tactic(Z3_tactic_try_for(t.ctx.ref(), t.tactic, ms), t.ctx)
9272def tactics(ctx=None):
9273 """Return a list of all available tactics in Z3.
9276 >>> l.count('simplify') == 1
9280 return [Z3_get_tactic_name(ctx.ref(), i) for i in range(Z3_get_num_tactics(ctx.ref()))]
9283def tactic_description(name, ctx=None):
9284 """Return a short description for the tactic named `name`.
9286 >>> d = tactic_description('simplify')
9289 return Z3_tactic_get_descr(ctx.ref(), name)
9292def describe_tactics():
9293 """Display a (tabular) description of all available tactics in Z3."""
9296 print('<table border="1" cellpadding="2" cellspacing="0">')
9299 print('<tr style="background-color:#CFCFCF">')
9304 print("<td>%s</td><td>%s</td></tr>" % (t, insert_line_breaks(tactic_description(t), 40)))
9308 print("%s : %s" % (t, tactic_description(t)))
9312 """Probes are used to inspect a goal (aka problem) and collect information that may be used
9313 to decide which solver and/or preprocessing step will be used.
9316 def __init__(self, probe, ctx=None):
9317 self.ctx = _get_ctx(ctx)
9319 if isinstance(probe, ProbeObj):
9321 elif isinstance(probe, float):
9322 self.probe = Z3_probe_const(self.ctx.ref(), probe)
9323 elif _is_int(probe):
9324 self.probe = Z3_probe_const(self.ctx.ref(), float(probe))
9325 elif isinstance(probe, bool):
9327 self.probe = Z3_probe_const(self.ctx.ref(), 1.0)
9329 self.probe = Z3_probe_const(self.ctx.ref(), 0.0)
9332 _z3_assert(isinstance(probe, str), "probe name expected")
9334 self.probe = Z3_mk_probe(self.ctx.ref(), probe)
9336 raise Z3Exception("unknown probe '%s'" % probe)
9337 Z3_probe_inc_ref(self.ctx.ref(), self.probe)
9339 def __deepcopy__(self, memo={}):
9340 return Probe(self.probe, self.ctx)
9343 if self.probe is not None and self.ctx.ref() is not None and Z3_probe_dec_ref is not None:
9344 Z3_probe_dec_ref(self.ctx.ref(), self.probe)
9346 def __lt__(self, other):
9347 """Return a probe that evaluates to "true" when the value returned by `self`
9348 is less than the value returned by `other`.
9350 >>> p = Probe('size') < 10
9358 return Probe(Z3_probe_lt(self.ctx.ref(), self.probe, _to_probe(other, self.ctx).probe), self.ctx)
9360 def __gt__(self, other):
9361 """Return a probe that evaluates to "true" when the value returned by `self`
9362 is greater than the value returned by `other`.
9364 >>> p = Probe('size') > 10
9372 return Probe(Z3_probe_gt(self.ctx.ref(), self.probe, _to_probe(other, self.ctx).probe), self.ctx)
9374 def __le__(self, other):
9375 """Return a probe that evaluates to "true" when the value returned by `self`
9376 is less than or equal to the value returned by `other`.
9378 >>> p = Probe('size') <= 2
9386 return Probe(Z3_probe_le(self.ctx.ref(), self.probe, _to_probe(other, self.ctx).probe), self.ctx)
9388 def __ge__(self, other):
9389 """Return a probe that evaluates to "true" when the value returned by `self`
9390 is greater than or equal to the value returned by `other`.
9392 >>> p = Probe('size') >= 2
9400 return Probe(Z3_probe_ge(self.ctx.ref(), self.probe, _to_probe(other, self.ctx).probe), self.ctx)
9402 def __eq__(self, other):
9403 """Return a probe that evaluates to "true" when the value returned by `self`
9404 is equal to the value returned by `other`.
9406 >>> p = Probe('size') == 2
9414 return Probe(Z3_probe_eq(self.ctx.ref(), self.probe, _to_probe(other, self.ctx).probe), self.ctx)
9416 def __ne__(self, other):
9417 """Return a probe that evaluates to "true" when the value returned by `self`
9418 is not equal to the value returned by `other`.
9420 >>> p = Probe('size') != 2
9428 p = self.__eq__(other)
9429 return Probe(Z3_probe_not(self.ctx.ref(), p.probe), self.ctx)
9431 def __call__(self, goal):
9432 """Evaluate the probe `self` in the given goal.
9434 >>> p = Probe('size')
9444 >>> p = Probe('num-consts')
9447 >>> p = Probe('is-propositional')
9450 >>> p = Probe('is-qflia')
9455 _z3_assert(isinstance(goal, (Goal, BoolRef)), "Z3 Goal or Boolean expression expected")
9456 goal = _to_goal(goal)
9457 return Z3_probe_apply(self.ctx.ref(), self.probe, goal.goal)
9461 """Return `True` if `p` is a Z3 probe.
9463 >>> is_probe(Int('x'))
9465 >>> is_probe(Probe('memory'))
9468 return isinstance(p, Probe)
9471def _to_probe(p, ctx=None):
9475 return Probe(p, ctx)
9478def probes(ctx=None):
9479 """Return a list of all available probes in Z3.
9482 >>> l.count('memory') == 1
9486 return [Z3_get_probe_name(ctx.ref(), i) for i in range(Z3_get_num_probes(ctx.ref()))]
9489def probe_description(name, ctx=None):
9490 """Return a short description for the probe named `name`.
9492 >>> d = probe_description('memory')
9495 return Z3_probe_get_descr(ctx.ref(), name)
9498def describe_probes():
9499 """Display a (tabular) description of all available probes in Z3."""
9502 print('<table border="1" cellpadding="2" cellspacing="0">')
9505 print('<tr style="background-color:#CFCFCF">')
9510 print("<td>%s</td><td>%s</td></tr>" % (p, insert_line_breaks(probe_description(p), 40)))
9514 print("%s : %s" % (p, probe_description(p)))
9517def _probe_nary(f, args, ctx):
9519 _z3_assert(len(args) > 0, "At least one argument expected")
9521 r = _to_probe(args[0], ctx)
9522 for i in range(num - 1):
9523 r = Probe(f(ctx.ref(), r.probe, _to_probe(args[i + 1], ctx).probe), ctx)
9527def _probe_and(args, ctx):
9528 return _probe_nary(Z3_probe_and, args, ctx)
9531def _probe_or(args, ctx):
9532 return _probe_nary(Z3_probe_or, args, ctx)
9535def FailIf(p, ctx=None):
9536 """Return a tactic that fails if the probe `p` evaluates to true.
9537 Otherwise, it returns the input goal unmodified.
9539 In the following example, the tactic applies 'simplify' if and only if there are
9540 more than 2 constraints in the goal.
9542 >>> t = OrElse(FailIf(Probe('size') > 2), Tactic('simplify'))
9543 >>> x, y = Ints('x y')
9549 >>> g.add(x == y + 1)
9551 [[Not(x <= 0), Not(y <= 0), x == 1 + y]]
9553 p = _to_probe(p, ctx)
9554 return Tactic(Z3_tactic_fail_if(p.ctx.ref(), p.probe), p.ctx)
9557def When(p, t, ctx=None):
9558 """Return a tactic that applies tactic `t` only if probe `p` evaluates to true.
9559 Otherwise, it returns the input goal unmodified.
9561 >>> t = When(Probe('size') > 2, Tactic('simplify'))
9562 >>> x, y = Ints('x y')
9568 >>> g.add(x == y + 1)
9570 [[Not(x <= 0), Not(y <= 0), x == 1 + y]]
9572 p = _to_probe(p, ctx)
9573 t = _to_tactic(t, ctx)
9574 return Tactic(Z3_tactic_when(t.ctx.ref(), p.probe, t.tactic), t.ctx)
9577def Cond(p, t1, t2, ctx=None):
9578 """Return a tactic that applies tactic `t1` to a goal if probe `p` evaluates to true, and `t2` otherwise.
9580 >>> t = Cond(Probe('is-qfnra'), Tactic('qfnra'), Tactic('smt'))
9582 p = _to_probe(p, ctx)
9583 t1 = _to_tactic(t1, ctx)
9584 t2 = _to_tactic(t2, ctx)
9585 return Tactic(Z3_tactic_cond(t1.ctx.ref(), p.probe, t1.tactic, t2.tactic), t1.ctx)
9587#########################################
9591#########################################
9594def simplify(a, *arguments, **keywords):
9595 """Simplify the expression `a` using the given options.
9597 This function has many options. Use `help_simplify` to obtain the complete list.
9601 >>> simplify(x + 1 + y + x + 1)
9603 >>> simplify((x + 1)*(y + 1), som=True)
9605 >>> simplify(Distinct(x, y, 1), blast_distinct=True)
9606 And(Not(x == y), Not(x == 1), Not(y == 1))
9607 >>> simplify(And(x == 0, y == 1), elim_and=True)
9608 Not(Or(Not(x == 0), Not(y == 1)))
9611 _z3_assert(is_expr(a), "Z3 expression expected")
9612 if len(arguments) > 0 or len(keywords) > 0:
9613 p = args2params(arguments, keywords, a.ctx)
9614 return _to_expr_ref(Z3_simplify_ex(a.ctx_ref(), a.as_ast(), p.params), a.ctx)
9616 return _to_expr_ref(Z3_simplify(a.ctx_ref(), a.as_ast()), a.ctx)
9620 """Return a string describing all options available for Z3 `simplify` procedure."""
9621 print(Z3_simplify_get_help(main_ctx().ref()))
9624def simplify_param_descrs():
9625 """Return the set of parameter descriptions for Z3 `simplify` procedure."""
9626 return ParamDescrsRef(Z3_simplify_get_param_descrs(main_ctx().ref()), main_ctx())
9629def substitute(t, *m):
9630 """Apply substitution m on t, m is a list of pairs of the form (from, to).
9631 Every occurrence in t of from is replaced with to.
9635 >>> substitute(x + 1, (x, y + 1))
9637 >>> f = Function('f', IntSort(), IntSort())
9638 >>> substitute(f(x) + f(y), (f(x), IntVal(1)), (f(y), IntVal(1)))
9641 if isinstance(m, tuple):
9643 if isinstance(m1, list) and all(isinstance(p, tuple) for p in m1):
9646 _z3_assert(is_expr(t), "Z3 expression expected")
9648 all([isinstance(p, tuple) and is_expr(p[0]) and is_expr(p[1]) for p in m]),
9649 "Z3 invalid substitution, expression pairs expected.")
9651 all([p[0].sort().eq(p[1].sort()) for p in m]),
9652 'Z3 invalid substitution, mismatching "from" and "to" sorts.')
9654 _from = (Ast * num)()
9656 for i in range(num):
9657 _from[i] = m[i][0].as_ast()
9658 _to[i] = m[i][1].as_ast()
9659 return _to_expr_ref(Z3_substitute(t.ctx.ref(), t.as_ast(), num, _from, _to), t.ctx)
9662def substitute_vars(t, *m):
9663 """Substitute the free variables in t with the expression in m.
9665 >>> v0 = Var(0, IntSort())
9666 >>> v1 = Var(1, IntSort())
9668 >>> f = Function('f', IntSort(), IntSort(), IntSort())
9669 >>> # replace v0 with x+1 and v1 with x
9670 >>> substitute_vars(f(v0, v1), x + 1, x)
9674 _z3_assert(is_expr(t), "Z3 expression expected")
9675 _z3_assert(all([is_expr(n) for n in m]), "Z3 invalid substitution, list of expressions expected.")
9678 for i in range(num):
9679 _to[i] = m[i].as_ast()
9680 return _to_expr_ref(Z3_substitute_vars(t.ctx.ref(), t.as_ast(), num, _to), t.ctx)
9682def substitute_funs(t, *m):
9683 """Apply substitution m on t, m is a list of pairs of a function and expression (from, to)
9684 Every occurrence in to of the function from is replaced with the expression to.
9685 The expression to can have free variables, that refer to the arguments of from.
9688 if isinstance(m, tuple):
9690 if isinstance(m1, list) and all(isinstance(p, tuple) for p in m1):
9693 _z3_assert(is_expr(t), "Z3 expression expected")
9694 _z3_assert(all([isinstance(p, tuple) and is_func_decl(p[0]) and is_expr(p[1]) for p in m]), "Z3 invalid substitution, function pairs expected.")
9696 _from = (FuncDecl * num)()
9698 for i in range(num):
9699 _from[i] = m[i][0].as_func_decl()
9700 _to[i] = m[i][1].as_ast()
9701 return _to_expr_ref(Z3_substitute_funs(t.ctx.ref(), t.as_ast(), num, _from, _to), t.ctx)
9705 """Create the sum of the Z3 expressions.
9707 >>> a, b, c = Ints('a b c')
9712 >>> A = IntVector('a', 5)
9714 a__0 + a__1 + a__2 + a__3 + a__4
9716 args = _get_args(args)
9719 ctx = _ctx_from_ast_arg_list(args)
9721 return _reduce(lambda a, b: a + b, args, 0)
9722 args = _coerce_expr_list(args, ctx)
9723 if is_bv(args[0]) or isinstance(args[0], FiniteFieldRef):
9724 return _reduce(lambda a, b: a + b, args, 0)
9726 _args, sz = _to_ast_array(args)
9727 return ArithRef(Z3_mk_add(ctx.ref(), sz, _args), ctx)
9731 """Create the product of the Z3 expressions.
9733 >>> a, b, c = Ints('a b c')
9734 >>> Product(a, b, c)
9736 >>> Product([a, b, c])
9738 >>> A = IntVector('a', 5)
9740 a__0*a__1*a__2*a__3*a__4
9742 args = _get_args(args)
9745 ctx = _ctx_from_ast_arg_list(args)
9747 return _reduce(lambda a, b: a * b, args, 1)
9748 args = _coerce_expr_list(args, ctx)
9749 if is_bv(args[0]) or isinstance(args[0], FiniteFieldRef):
9750 return _reduce(lambda a, b: a * b, args, 1)
9752 _args, sz = _to_ast_array(args)
9753 return ArithRef(Z3_mk_mul(ctx.ref(), sz, _args), ctx)
9756 """Create the absolute value of an arithmetic expression"""
9757 return If(arg > 0, arg, -arg)
9761 """Create an at-most Pseudo-Boolean k constraint.
9763 >>> a, b, c = Bools('a b c')
9764 >>> f = AtMost(a, b, c, 2)
9766 args = _get_args(args)
9768 _z3_assert(len(args) > 1, "Non empty list of arguments expected")
9769 ctx = _ctx_from_ast_arg_list(args)
9771 _z3_assert(ctx is not None, "At least one of the arguments must be a Z3 expression")
9772 args1 = _coerce_expr_list(args[:-1], ctx)
9774 _args, sz = _to_ast_array(args1)
9775 return BoolRef(Z3_mk_atmost(ctx.ref(), sz, _args, k), ctx)
9779 """Create an at-least Pseudo-Boolean k constraint.
9781 >>> a, b, c = Bools('a b c')
9782 >>> f = AtLeast(a, b, c, 2)
9784 args = _get_args(args)
9786 _z3_assert(len(args) > 1, "Non empty list of arguments expected")
9787 ctx = _ctx_from_ast_arg_list(args)
9789 _z3_assert(ctx is not None, "At least one of the arguments must be a Z3 expression")
9790 args1 = _coerce_expr_list(args[:-1], ctx)
9792 _args, sz = _to_ast_array(args1)
9793 return BoolRef(Z3_mk_atleast(ctx.ref(), sz, _args, k), ctx)
9796def _reorder_pb_arg(arg):
9798 if not _is_int(b) and _is_int(a):
9803def _pb_args_coeffs(args, default_ctx=None):
9804 args = _get_args_ast_list(args)
9806 return _get_ctx(default_ctx), 0, (Ast * 0)(), (ctypes.c_int * 0)()
9807 args = [_reorder_pb_arg(arg) for arg in args]
9808 args, coeffs = zip(*args)
9810 _z3_assert(len(args) > 0, "Non empty list of arguments expected")
9811 ctx = _ctx_from_ast_arg_list(args)
9813 _z3_assert(ctx is not None, "At least one of the arguments must be a Z3 expression")
9814 args = _coerce_expr_list(args, ctx)
9815 _args, sz = _to_ast_array(args)
9816 _coeffs = (ctypes.c_int * len(coeffs))()
9817 for i in range(len(coeffs)):
9818 _z3_check_cint_overflow(coeffs[i], "coefficient")
9819 _coeffs[i] = coeffs[i]
9820 return ctx, sz, _args, _coeffs, args
9824 """Create a Pseudo-Boolean inequality k constraint.
9826 >>> a, b, c = Bools('a b c')
9827 >>> f = PbLe(((a,1),(b,3),(c,2)), 3)
9829 _z3_check_cint_overflow(k, "k")
9830 ctx, sz, _args, _coeffs, args = _pb_args_coeffs(args)
9831 return BoolRef(Z3_mk_pble(ctx.ref(), sz, _args, _coeffs, k), ctx)
9835 """Create a Pseudo-Boolean inequality k constraint.
9837 >>> a, b, c = Bools('a b c')
9838 >>> f = PbGe(((a,1),(b,3),(c,2)), 3)
9840 _z3_check_cint_overflow(k, "k")
9841 ctx, sz, _args, _coeffs, args = _pb_args_coeffs(args)
9842 return BoolRef(Z3_mk_pbge(ctx.ref(), sz, _args, _coeffs, k), ctx)
9845def PbEq(args, k, ctx=None):
9846 """Create a Pseudo-Boolean equality k constraint.
9848 >>> a, b, c = Bools('a b c')
9849 >>> f = PbEq(((a,1),(b,3),(c,2)), 3)
9851 _z3_check_cint_overflow(k, "k")
9852 ctx, sz, _args, _coeffs, args = _pb_args_coeffs(args)
9853 return BoolRef(Z3_mk_pbeq(ctx.ref(), sz, _args, _coeffs, k), ctx)
9856def solve(*args, **keywords):
9857 """Solve the constraints `*args`.
9859 This is a simple function for creating demonstrations. It creates a solver,
9860 configure it using the options in `keywords`, adds the constraints
9861 in `args`, and invokes check.
9864 >>> solve(a > 0, a < 2)
9867 show = keywords.pop("show", False)
9875 print("no solution")
9877 print("failed to solve")
9886def solve_using(s, *args, **keywords):
9887 """Solve the constraints `*args` using solver `s`.
9889 This is a simple function for creating demonstrations. It is similar to `solve`,
9890 but it uses the given solver `s`.
9891 It configures solver `s` using the options in `keywords`, adds the constraints
9892 in `args`, and invokes check.
9894 show = keywords.pop("show", False)
9896 _z3_assert(isinstance(s, Solver), "Solver object expected")
9904 print("no solution")
9906 print("failed to solve")
9917def prove(claim, show=False, **keywords):
9918 """Try to prove the given claim.
9920 This is a simple function for creating demonstrations. It tries to prove
9921 `claim` by showing the negation is unsatisfiable.
9923 >>> p, q = Bools('p q')
9924 >>> prove(Not(And(p, q)) == Or(Not(p), Not(q)))
9928 _z3_assert(is_bool(claim), "Z3 Boolean expression expected")
9938 print("failed to prove")
9941 print("counterexample")
9945def _solve_html(*args, **keywords):
9946 """Version of function `solve` that renders HTML output."""
9947 show = keywords.pop("show", False)
9952 print("<b>Problem:</b>")
9956 print("<b>no solution</b>")
9958 print("<b>failed to solve</b>")
9965 print("<b>Solution:</b>")
9969def _solve_using_html(s, *args, **keywords):
9970 """Version of function `solve_using` that renders HTML."""
9971 show = keywords.pop("show", False)
9973 _z3_assert(isinstance(s, Solver), "Solver object expected")
9977 print("<b>Problem:</b>")
9981 print("<b>no solution</b>")
9983 print("<b>failed to solve</b>")
9990 print("<b>Solution:</b>")
9994def _prove_html(claim, show=False, **keywords):
9995 """Version of function `prove` that renders HTML."""
9997 _z3_assert(is_bool(claim), "Z3 Boolean expression expected")
10005 print("<b>proved</b>")
10007 print("<b>failed to prove</b>")
10010 print("<b>counterexample</b>")
10014def _dict2sarray(sorts, ctx):
10016 _names = (Symbol * sz)()
10017 _sorts = (Sort * sz)()
10022 _z3_assert(isinstance(k, str), "String expected")
10023 _z3_assert(is_sort(v), "Z3 sort expected")
10024 _names[i] = to_symbol(k, ctx)
10027 return sz, _names, _sorts
10030def _dict2darray(decls, ctx):
10032 _names = (Symbol * sz)()
10033 _decls = (FuncDecl * sz)()
10038 _z3_assert(isinstance(k, str), "String expected")
10039 _z3_assert(is_func_decl(v) or is_const(v), "Z3 declaration or constant expected")
10040 _names[i] = to_symbol(k, ctx)
10042 _decls[i] = v.decl().ast
10046 return sz, _names, _decls
10048class ParserContext:
10049 def __init__(self, ctx= None):
10050 self.ctx = _get_ctx(ctx)
10051 self.pctx = Z3_mk_parser_context(self.ctx.ref())
10052 Z3_parser_context_inc_ref(self.ctx.ref(), self.pctx)
10055 if self.ctx.ref() is not None and self.pctx is not None and Z3_parser_context_dec_ref is not None:
10056 Z3_parser_context_dec_ref(self.ctx.ref(), self.pctx)
10059 def add_sort(self, sort):
10060 Z3_parser_context_add_sort(self.ctx.ref(), self.pctx, sort.as_ast())
10062 def add_decl(self, decl):
10063 Z3_parser_context_add_decl(self.ctx.ref(), self.pctx, decl.as_ast())
10065 def from_string(self, s):
10066 return AstVector(Z3_parser_context_from_string(self.ctx.ref(), self.pctx, s), self.ctx)
10068def parse_smt2_string(s, sorts={}, decls={}, ctx=None):
10069 """Parse a string in SMT 2.0 format using the given sorts and decls.
10071 The arguments sorts and decls are Python dictionaries used to initialize
10072 the symbol table used for the SMT 2.0 parser.
10074 >>> parse_smt2_string('(declare-const x Int) (assert (> x 0)) (assert (< x 10))')
10076 >>> x, y = Ints('x y')
10077 >>> f = Function('f', IntSort(), IntSort())
10078 >>> parse_smt2_string('(assert (> (+ foo (g bar)) 0))', decls={ 'foo' : x, 'bar' : y, 'g' : f})
10080 >>> parse_smt2_string('(declare-const a U) (assert (> a 0))', sorts={ 'U' : IntSort() })
10083 ctx = _get_ctx(ctx)
10084 ssz, snames, ssorts = _dict2sarray(sorts, ctx)
10085 dsz, dnames, ddecls = _dict2darray(decls, ctx)
10086 return AstVector(Z3_parse_smtlib2_string(ctx.ref(), s, ssz, snames, ssorts, dsz, dnames, ddecls), ctx)
10089def parse_smt2_file(f, sorts={}, decls={}, ctx=None):
10090 """Parse a file in SMT 2.0 format using the given sorts and decls.
10092 This function is similar to parse_smt2_string().
10094 ctx = _get_ctx(ctx)
10095 ssz, snames, ssorts = _dict2sarray(sorts, ctx)
10096 dsz, dnames, ddecls = _dict2darray(decls, ctx)
10097 return AstVector(Z3_parse_smtlib2_file(ctx.ref(), f, ssz, snames, ssorts, dsz, dnames, ddecls), ctx)
10100#########################################
10102# Floating-Point Arithmetic
10104#########################################
10107# Global default rounding mode
10108_dflt_rounding_mode = Z3_OP_FPA_RM_NEAREST_TIES_TO_EVEN
10109_dflt_fpsort_ebits = 11
10110_dflt_fpsort_sbits = 53
10113def get_default_rounding_mode(ctx=None):
10114 """Retrieves the global default rounding mode."""
10115 global _dflt_rounding_mode
10116 if _dflt_rounding_mode == Z3_OP_FPA_RM_TOWARD_ZERO:
10118 elif _dflt_rounding_mode == Z3_OP_FPA_RM_TOWARD_NEGATIVE:
10120 elif _dflt_rounding_mode == Z3_OP_FPA_RM_TOWARD_POSITIVE:
10122 elif _dflt_rounding_mode == Z3_OP_FPA_RM_NEAREST_TIES_TO_EVEN:
10124 elif _dflt_rounding_mode == Z3_OP_FPA_RM_NEAREST_TIES_TO_AWAY:
10128_ROUNDING_MODES = frozenset({
10129 Z3_OP_FPA_RM_TOWARD_ZERO,
10130 Z3_OP_FPA_RM_TOWARD_NEGATIVE,
10131 Z3_OP_FPA_RM_TOWARD_POSITIVE,
10132 Z3_OP_FPA_RM_NEAREST_TIES_TO_EVEN,
10133 Z3_OP_FPA_RM_NEAREST_TIES_TO_AWAY
10137def set_default_rounding_mode(rm, ctx=None):
10138 global _dflt_rounding_mode
10139 if is_fprm_value(rm):
10140 _dflt_rounding_mode = rm.kind()
10142 _z3_assert(_dflt_rounding_mode in _ROUNDING_MODES, "illegal rounding mode")
10143 _dflt_rounding_mode = rm
10146def get_default_fp_sort(ctx=None):
10147 return FPSort(_dflt_fpsort_ebits, _dflt_fpsort_sbits, ctx)
10150def set_default_fp_sort(ebits, sbits, ctx=None):
10151 global _dflt_fpsort_ebits
10152 global _dflt_fpsort_sbits
10153 _dflt_fpsort_ebits = ebits
10154 _dflt_fpsort_sbits = sbits
10157def _dflt_rm(ctx=None):
10158 return get_default_rounding_mode(ctx)
10161def _dflt_fps(ctx=None):
10162 return get_default_fp_sort(ctx)
10165def _coerce_fp_expr_list(alist, ctx):
10166 first_fp_sort = None
10169 if first_fp_sort is None:
10170 first_fp_sort = a.sort()
10171 elif first_fp_sort == a.sort():
10172 pass # OK, same as before
10174 # we saw at least 2 different float sorts; something will
10175 # throw a sort mismatch later, for now assume None.
10176 first_fp_sort = None
10180 for i in range(len(alist)):
10182 is_repr = isinstance(a, str) and a.contains("2**(") and a.endswith(")")
10183 if is_repr or _is_int(a) or isinstance(a, (float, bool)):
10184 r.append(FPVal(a, None, first_fp_sort, ctx))
10187 return _coerce_expr_list(r, ctx)
10192class FPSortRef(SortRef):
10193 """Floating-point sort."""
10196 """Retrieves the number of bits reserved for the exponent in the FloatingPoint sort `self`.
10197 >>> b = FPSort(8, 24)
10201 return int(Z3_fpa_get_ebits(self.ctx_ref(), self.ast))
10204 """Retrieves the number of bits reserved for the significand in the FloatingPoint sort `self`.
10205 >>> b = FPSort(8, 24)
10209 return int(Z3_fpa_get_sbits(self.ctx_ref(), self.ast))
10211 def cast(self, val):
10212 """Try to cast `val` as a floating-point expression.
10213 >>> b = FPSort(8, 24)
10216 >>> b.cast(1.0).sexpr()
10217 '(fp #b0 #x7f #b00000000000000000000000)'
10221 _z3_assert(self.ctx == val.ctx, "Context mismatch")
10224 return FPVal(val, None, self, self.ctx)
10227def Float16(ctx=None):
10228 """Floating-point 16-bit (half) sort."""
10229 ctx = _get_ctx(ctx)
10230 return FPSortRef(Z3_mk_fpa_sort_16(ctx.ref()), ctx)
10233def FloatHalf(ctx=None):
10234 """Floating-point 16-bit (half) sort."""
10235 ctx = _get_ctx(ctx)
10236 return FPSortRef(Z3_mk_fpa_sort_half(ctx.ref()), ctx)
10239def Float32(ctx=None):
10240 """Floating-point 32-bit (single) sort."""
10241 ctx = _get_ctx(ctx)
10242 return FPSortRef(Z3_mk_fpa_sort_32(ctx.ref()), ctx)
10245def FloatSingle(ctx=None):
10246 """Floating-point 32-bit (single) sort."""
10247 ctx = _get_ctx(ctx)
10248 return FPSortRef(Z3_mk_fpa_sort_single(ctx.ref()), ctx)
10251def Float64(ctx=None):
10252 """Floating-point 64-bit (double) sort."""
10253 ctx = _get_ctx(ctx)
10254 return FPSortRef(Z3_mk_fpa_sort_64(ctx.ref()), ctx)
10257def FloatDouble(ctx=None):
10258 """Floating-point 64-bit (double) sort."""
10259 ctx = _get_ctx(ctx)
10260 return FPSortRef(Z3_mk_fpa_sort_double(ctx.ref()), ctx)
10263def Float128(ctx=None):
10264 """Floating-point 128-bit (quadruple) sort."""
10265 ctx = _get_ctx(ctx)
10266 return FPSortRef(Z3_mk_fpa_sort_128(ctx.ref()), ctx)
10269def FloatQuadruple(ctx=None):
10270 """Floating-point 128-bit (quadruple) sort."""
10271 ctx = _get_ctx(ctx)
10272 return FPSortRef(Z3_mk_fpa_sort_quadruple(ctx.ref()), ctx)
10275class FPRMSortRef(SortRef):
10276 """"Floating-point rounding mode sort."""
10280 """Return True if `s` is a Z3 floating-point sort.
10282 >>> is_fp_sort(FPSort(8, 24))
10284 >>> is_fp_sort(IntSort())
10287 return isinstance(s, FPSortRef)
10290def is_fprm_sort(s):
10291 """Return True if `s` is a Z3 floating-point rounding mode sort.
10293 >>> is_fprm_sort(FPSort(8, 24))
10295 >>> is_fprm_sort(RNE().sort())
10298 return isinstance(s, FPRMSortRef)
10303class FPRef(ExprRef):
10304 """Floating-point expressions."""
10307 """Return the sort of the floating-point expression `self`.
10309 >>> x = FP('1.0', FPSort(8, 24))
10312 >>> x.sort() == FPSort(8, 24)
10315 return FPSortRef(Z3_get_sort(self.ctx_ref(), self.as_ast()), self.ctx)
10318 """Retrieves the number of bits reserved for the exponent in the FloatingPoint expression `self`.
10319 >>> b = FPSort(8, 24)
10323 return self.sort().ebits()
10326 """Retrieves the number of bits reserved for the exponent in the FloatingPoint expression `self`.
10327 >>> b = FPSort(8, 24)
10331 return self.sort().sbits()
10333 def as_string(self):
10334 """Return a Z3 floating point expression as a Python string."""
10335 return Z3_ast_to_string(self.ctx_ref(), self.as_ast())
10337 def __le__(self, other):
10338 return fpLEQ(self, other, self.ctx)
10340 def __lt__(self, other):
10341 return fpLT(self, other, self.ctx)
10343 def __ge__(self, other):
10344 return fpGEQ(self, other, self.ctx)
10346 def __gt__(self, other):
10347 return fpGT(self, other, self.ctx)
10349 def __add__(self, other):
10350 """Create the Z3 expression `self + other`.
10352 >>> x = FP('x', FPSort(8, 24))
10353 >>> y = FP('y', FPSort(8, 24))
10359 [a, b] = _coerce_fp_expr_list([self, other], self.ctx)
10360 return fpAdd(_dflt_rm(), a, b, self.ctx)
10362 def __radd__(self, other):
10363 """Create the Z3 expression `other + self`.
10365 >>> x = FP('x', FPSort(8, 24))
10369 [a, b] = _coerce_fp_expr_list([other, self], self.ctx)
10370 return fpAdd(_dflt_rm(), a, b, self.ctx)
10372 def __sub__(self, other):
10373 """Create the Z3 expression `self - other`.
10375 >>> x = FP('x', FPSort(8, 24))
10376 >>> y = FP('y', FPSort(8, 24))
10382 [a, b] = _coerce_fp_expr_list([self, other], self.ctx)
10383 return fpSub(_dflt_rm(), a, b, self.ctx)
10385 def __rsub__(self, other):
10386 """Create the Z3 expression `other - self`.
10388 >>> x = FP('x', FPSort(8, 24))
10392 [a, b] = _coerce_fp_expr_list([other, self], self.ctx)
10393 return fpSub(_dflt_rm(), a, b, self.ctx)
10395 def __mul__(self, other):
10396 """Create the Z3 expression `self * other`.
10398 >>> x = FP('x', FPSort(8, 24))
10399 >>> y = FP('y', FPSort(8, 24))
10407 [a, b] = _coerce_fp_expr_list([self, other], self.ctx)
10408 return fpMul(_dflt_rm(), a, b, self.ctx)
10410 def __rmul__(self, other):
10411 """Create the Z3 expression `other * self`.
10413 >>> x = FP('x', FPSort(8, 24))
10414 >>> y = FP('y', FPSort(8, 24))
10420 [a, b] = _coerce_fp_expr_list([other, self], self.ctx)
10421 return fpMul(_dflt_rm(), a, b, self.ctx)
10424 """Create the Z3 expression `+self`."""
10428 """Create the Z3 expression `-self`.
10430 >>> x = FP('x', Float32())
10436 def __div__(self, other):
10437 """Create the Z3 expression `self / other`.
10439 >>> x = FP('x', FPSort(8, 24))
10440 >>> y = FP('y', FPSort(8, 24))
10448 [a, b] = _coerce_fp_expr_list([self, other], self.ctx)
10449 return fpDiv(_dflt_rm(), a, b, self.ctx)
10451 def __rdiv__(self, other):
10452 """Create the Z3 expression `other / self`.
10454 >>> x = FP('x', FPSort(8, 24))
10455 >>> y = FP('y', FPSort(8, 24))
10461 [a, b] = _coerce_fp_expr_list([other, self], self.ctx)
10462 return fpDiv(_dflt_rm(), a, b, self.ctx)
10464 def __truediv__(self, other):
10465 """Create the Z3 expression division `self / other`."""
10466 return self.__div__(other)
10468 def __rtruediv__(self, other):
10469 """Create the Z3 expression division `other / self`."""
10470 return self.__rdiv__(other)
10472 def __mod__(self, other):
10473 """Create the Z3 expression mod `self % other`."""
10474 return fpRem(self, other)
10476 def __rmod__(self, other):
10477 """Create the Z3 expression mod `other % self`."""
10478 return fpRem(other, self)
10481class FPRMRef(ExprRef):
10482 """Floating-point rounding mode expressions"""
10484 def as_string(self):
10485 """Return a Z3 floating point expression as a Python string."""
10486 return Z3_ast_to_string(self.ctx_ref(), self.as_ast())
10489def RoundNearestTiesToEven(ctx=None):
10490 ctx = _get_ctx(ctx)
10491 return FPRMRef(Z3_mk_fpa_round_nearest_ties_to_even(ctx.ref()), ctx)
10495 ctx = _get_ctx(ctx)
10496 return FPRMRef(Z3_mk_fpa_round_nearest_ties_to_even(ctx.ref()), ctx)
10499def RoundNearestTiesToAway(ctx=None):
10500 ctx = _get_ctx(ctx)
10501 return FPRMRef(Z3_mk_fpa_round_nearest_ties_to_away(ctx.ref()), ctx)
10505 ctx = _get_ctx(ctx)
10506 return FPRMRef(Z3_mk_fpa_round_nearest_ties_to_away(ctx.ref()), ctx)
10509def RoundTowardPositive(ctx=None):
10510 ctx = _get_ctx(ctx)
10511 return FPRMRef(Z3_mk_fpa_round_toward_positive(ctx.ref()), ctx)
10515 ctx = _get_ctx(ctx)
10516 return FPRMRef(Z3_mk_fpa_round_toward_positive(ctx.ref()), ctx)
10519def RoundTowardNegative(ctx=None):
10520 ctx = _get_ctx(ctx)
10521 return FPRMRef(Z3_mk_fpa_round_toward_negative(ctx.ref()), ctx)
10525 ctx = _get_ctx(ctx)
10526 return FPRMRef(Z3_mk_fpa_round_toward_negative(ctx.ref()), ctx)
10529def RoundTowardZero(ctx=None):
10530 ctx = _get_ctx(ctx)
10531 return FPRMRef(Z3_mk_fpa_round_toward_zero(ctx.ref()), ctx)
10535 ctx = _get_ctx(ctx)
10536 return FPRMRef(Z3_mk_fpa_round_toward_zero(ctx.ref()), ctx)
10540 """Return `True` if `a` is a Z3 floating-point rounding mode expression.
10549 return isinstance(a, FPRMRef)
10552def is_fprm_value(a):
10553 """Return `True` if `a` is a Z3 floating-point rounding mode numeral value."""
10554 return is_fprm(a) and _is_numeral(a.ctx, a.ast)
10559class FPNumRef(FPRef):
10560 """The sign of the numeral.
10562 >>> x = FPVal(+1.0, FPSort(8, 24))
10565 >>> x = FPVal(-1.0, FPSort(8, 24))
10571 num = ctypes.c_bool()
10572 nsign = Z3_fpa_get_numeral_sign(self.ctx.ref(), self.as_ast(), byref(num))
10574 raise Z3Exception("error retrieving the sign of a numeral.")
10575 return num.value != 0
10577 """The sign of a floating-point numeral as a bit-vector expression.
10579 Remark: NaN's are invalid arguments.
10582 def sign_as_bv(self):
10583 return BitVecNumRef(Z3_fpa_get_numeral_sign_bv(self.ctx.ref(), self.as_ast()), self.ctx)
10585 """The significand of the numeral.
10587 >>> x = FPVal(2.5, FPSort(8, 24))
10588 >>> x.significand()
10592 def significand(self):
10593 return Z3_fpa_get_numeral_significand_string(self.ctx.ref(), self.as_ast())
10595 """The significand of the numeral as a long.
10597 >>> x = FPVal(2.5, FPSort(8, 24))
10598 >>> x.significand_as_long()
10602 def significand_as_long(self):
10603 ptr = (ctypes.c_ulonglong * 1)()
10604 if not Z3_fpa_get_numeral_significand_uint64(self.ctx.ref(), self.as_ast(), ptr):
10605 raise Z3Exception("error retrieving the significand of a numeral.")
10608 """The significand of the numeral as a bit-vector expression.
10610 Remark: NaN are invalid arguments.
10613 def significand_as_bv(self):
10614 return BitVecNumRef(Z3_fpa_get_numeral_significand_bv(self.ctx.ref(), self.as_ast()), self.ctx)
10616 """The exponent of the numeral.
10618 >>> x = FPVal(2.5, FPSort(8, 24))
10623 def exponent(self, biased=True):
10624 return Z3_fpa_get_numeral_exponent_string(self.ctx.ref(), self.as_ast(), biased)
10626 """The exponent of the numeral as a long.
10628 >>> x = FPVal(2.5, FPSort(8, 24))
10629 >>> x.exponent_as_long()
10633 def exponent_as_long(self, biased=True):
10634 ptr = (ctypes.c_longlong * 1)()
10635 if not Z3_fpa_get_numeral_exponent_int64(self.ctx.ref(), self.as_ast(), ptr, biased):
10636 raise Z3Exception("error retrieving the exponent of a numeral.")
10639 """The exponent of the numeral as a bit-vector expression.
10641 Remark: NaNs are invalid arguments.
10644 def exponent_as_bv(self, biased=True):
10645 return BitVecNumRef(Z3_fpa_get_numeral_exponent_bv(self.ctx.ref(), self.as_ast(), biased), self.ctx)
10647 """Indicates whether the numeral is a NaN."""
10650 return Z3_fpa_is_numeral_nan(self.ctx.ref(), self.as_ast())
10652 """Indicates whether the numeral is +oo or -oo."""
10655 return Z3_fpa_is_numeral_inf(self.ctx.ref(), self.as_ast())
10657 """Indicates whether the numeral is +zero or -zero."""
10660 return Z3_fpa_is_numeral_zero(self.ctx.ref(), self.as_ast())
10662 """Indicates whether the numeral is normal."""
10664 def isNormal(self):
10665 return Z3_fpa_is_numeral_normal(self.ctx.ref(), self.as_ast())
10667 """Indicates whether the numeral is subnormal."""
10669 def isSubnormal(self):
10670 return Z3_fpa_is_numeral_subnormal(self.ctx.ref(), self.as_ast())
10672 """Indicates whether the numeral is positive."""
10674 def isPositive(self):
10675 return Z3_fpa_is_numeral_positive(self.ctx.ref(), self.as_ast())
10677 """Indicates whether the numeral is negative."""
10679 def isNegative(self):
10680 return Z3_fpa_is_numeral_negative(self.ctx.ref(), self.as_ast())
10683 The string representation of the numeral.
10685 >>> x = FPVal(20, FPSort(8, 24))
10690 def as_string(self):
10691 s = Z3_get_numeral_string(self.ctx.ref(), self.as_ast())
10692 return ("FPVal(%s, %s)" % (s, self.sort()))
10694 def py_value(self):
10695 bv = simplify(fpToIEEEBV(self))
10696 binary = bv.py_value()
10697 if not isinstance(binary, int):
10699 # Decode the IEEE 754 binary representation
10701 bytes_rep = binary.to_bytes(8, byteorder='big')
10702 return struct.unpack('>d', bytes_rep)[0]
10706 """Return `True` if `a` is a Z3 floating-point expression.
10708 >>> b = FP('b', FPSort(8, 24))
10713 >>> is_fp(Int('x'))
10716 return isinstance(a, FPRef)
10720 """Return `True` if `a` is a Z3 floating-point numeral value.
10722 >>> b = FP('b', FPSort(8, 24))
10725 >>> b = FPVal(1.0, FPSort(8, 24))
10731 return is_fp(a) and _is_numeral(a.ctx, a.ast)
10734def FPSort(ebits, sbits, ctx=None):
10735 """Return a Z3 floating-point sort of the given sizes. If `ctx=None`, then the global context is used.
10737 >>> Single = FPSort(8, 24)
10738 >>> Double = FPSort(11, 53)
10741 >>> x = Const('x', Single)
10742 >>> eq(x, FP('x', FPSort(8, 24)))
10745 ctx = _get_ctx(ctx)
10746 return FPSortRef(Z3_mk_fpa_sort(ctx.ref(), ebits, sbits), ctx)
10749def _to_float_str(val, exp=0):
10750 if isinstance(val, float):
10751 if math.isnan(val):
10754 sone = math.copysign(1.0, val)
10759 elif val == float("+inf"):
10761 elif val == float("-inf"):
10764 v = val.as_integer_ratio()
10767 rvs = str(num) + "/" + str(den)
10769 elif isinstance(val, bool):
10776 elif isinstance(val, str):
10777 inx = val.find("*(2**")
10781 inx = val.lower().find("p")
10784 exp = int(val[inx + 1:]) + int(exp)
10785 elif val[-1] == ")":
10787 exp = str(int(val[inx + 5:-1]) + int(exp))
10789 _z3_assert(False, "String does not have floating-point numeral form.")
10791 _z3_assert(False, "Python value cannot be used to create floating-point numerals.")
10795 return res + "p" + str(exp)
10799 """Create a Z3 floating-point NaN term.
10801 >>> s = FPSort(8, 24)
10802 >>> set_fpa_pretty(True)
10805 >>> pb = get_fpa_pretty()
10806 >>> set_fpa_pretty(False)
10808 fpNaN(FPSort(8, 24))
10809 >>> set_fpa_pretty(pb)
10811 _z3_assert(isinstance(s, FPSortRef), "sort mismatch")
10812 return FPNumRef(Z3_mk_fpa_nan(s.ctx_ref(), s.ast), s.ctx)
10815def fpPlusInfinity(s):
10816 """Create a Z3 floating-point +oo term.
10818 >>> s = FPSort(8, 24)
10819 >>> pb = get_fpa_pretty()
10820 >>> set_fpa_pretty(True)
10821 >>> fpPlusInfinity(s)
10823 >>> set_fpa_pretty(False)
10824 >>> fpPlusInfinity(s)
10825 fpPlusInfinity(FPSort(8, 24))
10826 >>> set_fpa_pretty(pb)
10828 _z3_assert(isinstance(s, FPSortRef), "sort mismatch")
10829 return FPNumRef(Z3_mk_fpa_inf(s.ctx_ref(), s.ast, False), s.ctx)
10832def fpMinusInfinity(s):
10833 """Create a Z3 floating-point -oo term."""
10834 _z3_assert(isinstance(s, FPSortRef), "sort mismatch")
10835 return FPNumRef(Z3_mk_fpa_inf(s.ctx_ref(), s.ast, True), s.ctx)
10838def fpInfinity(s, negative):
10839 """Create a Z3 floating-point +oo or -oo term."""
10840 _z3_assert(isinstance(s, FPSortRef), "sort mismatch")
10841 _z3_assert(isinstance(negative, bool), "expected Boolean flag")
10842 return FPNumRef(Z3_mk_fpa_inf(s.ctx_ref(), s.ast, negative), s.ctx)
10846 """Create a Z3 floating-point +0.0 term."""
10847 _z3_assert(isinstance(s, FPSortRef), "sort mismatch")
10848 return FPNumRef(Z3_mk_fpa_zero(s.ctx_ref(), s.ast, False), s.ctx)
10852 """Create a Z3 floating-point -0.0 term."""
10853 _z3_assert(isinstance(s, FPSortRef), "sort mismatch")
10854 return FPNumRef(Z3_mk_fpa_zero(s.ctx_ref(), s.ast, True), s.ctx)
10857def fpZero(s, negative):
10858 """Create a Z3 floating-point +0.0 or -0.0 term."""
10859 _z3_assert(isinstance(s, FPSortRef), "sort mismatch")
10860 _z3_assert(isinstance(negative, bool), "expected Boolean flag")
10861 return FPNumRef(Z3_mk_fpa_zero(s.ctx_ref(), s.ast, negative), s.ctx)
10864def FPVal(sig, exp=None, fps=None, ctx=None):
10865 """Return a floating-point value of value `sig * 2**exp` and sort `fps`.
10866 If `exp=None`, then the exponent is zero.
10867 If `ctx=None`, then the global context is used.
10869 >>> v = FPVal(20.0, FPSort(8, 24))
10872 >>> print("0x%.8x" % v.exponent_as_long(False))
10874 >>> v = FPVal(2.25, FPSort(8, 24))
10877 >>> v = FPVal(-2.25, FPSort(8, 24))
10880 >>> FPVal(-0.0, FPSort(8, 24))
10882 >>> FPVal(0.0, FPSort(8, 24))
10884 >>> FPVal(+0.0, FPSort(8, 24))
10886 >>> FPVal(1.0, 3, Float32())
10888 >>> FPVal(1, 3, Float32())
10890 >>> FPVal("1.5", -2, Float32())
10892 >>> FPVal("1.25*(2**4)", 1, Float32())
10894 >>> FPVal("1.25*(2**4)", -4, Float32())
10896 >>> FPVal("1p2", 3, Float32())
10898 >>> FPVal("1P2", 3, Float32())
10900 >>> FPVal("1.5p-2", 2, Float32())
10902 >>> FPVal(1.5, 0, Float32())
10904 >>> FPVal(1.5, fps=Float32())
10906 >>> [FPVal(v, 3, Float32()) for v in
10907 ... [float("nan"), float("inf"), float("-inf"), 0.0, -0.0]]
10908 [NaN, +oo, -oo, +0.0, -0.0]
10909 >>> [FPVal(v, -2, Float32()) for v in
10910 ... ["NaN", "+oo", "-oo", "+0.0", "-0.0"]]
10911 [NaN, +oo, -oo, +0.0, -0.0]
10913 ctx = _get_ctx(ctx)
10914 if is_fp_sort(exp):
10918 fps = _dflt_fps(ctx)
10919 _z3_assert(is_fp_sort(fps), "sort mismatch")
10922 val = _to_float_str(sig)
10923 if val == "NaN" or val == "nan":
10925 elif val == "-0.0":
10926 return fpMinusZero(fps)
10927 elif val == "0.0" or val == "+0.0":
10928 return fpPlusZero(fps)
10929 elif val == "+oo" or val == "+inf" or val == "+Inf":
10930 return fpPlusInfinity(fps)
10931 elif val == "-oo" or val == "-inf" or val == "-Inf":
10932 return fpMinusInfinity(fps)
10934 return FPNumRef(Z3_mk_numeral(ctx.ref(), _to_float_str(sig, exp), fps.ast), ctx)
10937def FP(name, fpsort, ctx=None):
10938 """Return a floating-point constant named `name`.
10939 `fpsort` is the floating-point sort.
10940 If `ctx=None`, then the global context is used.
10942 >>> x = FP('x', FPSort(8, 24))
10949 >>> word = FPSort(8, 24)
10950 >>> x2 = FP('x', word)
10954 if isinstance(fpsort, FPSortRef) and ctx is None:
10957 ctx = _get_ctx(ctx)
10958 return FPRef(Z3_mk_const(ctx.ref(), to_symbol(name, ctx), fpsort.ast), ctx)
10961def FPs(names, fpsort, ctx=None):
10962 """Return an array of floating-point constants.
10964 >>> x, y, z = FPs('x y z', FPSort(8, 24))
10971 >>> fpMul(RNE(), fpAdd(RNE(), x, y), z)
10974 ctx = _get_ctx(ctx)
10975 if isinstance(names, str):
10976 names = names.split(" ")
10977 return [FP(name, fpsort, ctx) for name in names]
10980def fpAbs(a, ctx=None):
10981 """Create a Z3 floating-point absolute value expression.
10983 >>> s = FPSort(8, 24)
10985 >>> x = FPVal(1.0, s)
10988 >>> y = FPVal(-20.0, s)
10992 fpAbs(-1.25*(2**4))
10993 >>> fpAbs(-1.25*(2**4))
10994 fpAbs(-1.25*(2**4))
10995 >>> fpAbs(x).sort()
10998 ctx = _get_ctx(ctx)
10999 [a] = _coerce_fp_expr_list([a], ctx)
11000 return FPRef(Z3_mk_fpa_abs(ctx.ref(), a.as_ast()), ctx)
11003def fpNeg(a, ctx=None):
11004 """Create a Z3 floating-point addition expression.
11006 >>> s = FPSort(8, 24)
11011 >>> fpNeg(x).sort()
11014 ctx = _get_ctx(ctx)
11015 [a] = _coerce_fp_expr_list([a], ctx)
11016 return FPRef(Z3_mk_fpa_neg(ctx.ref(), a.as_ast()), ctx)
11019def _mk_fp_unary(f, rm, a, ctx):
11020 ctx = _get_ctx(ctx)
11021 [a] = _coerce_fp_expr_list([a], ctx)
11023 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression")
11024 _z3_assert(is_fp(a), "Second argument must be a Z3 floating-point expression")
11025 return FPRef(f(ctx.ref(), rm.as_ast(), a.as_ast()), ctx)
11028def _mk_fp_unary_pred(f, a, ctx):
11029 ctx = _get_ctx(ctx)
11030 [a] = _coerce_fp_expr_list([a], ctx)
11032 _z3_assert(is_fp(a), "First argument must be a Z3 floating-point expression")
11033 return BoolRef(f(ctx.ref(), a.as_ast()), ctx)
11036def _mk_fp_bin(f, rm, a, b, ctx):
11037 ctx = _get_ctx(ctx)
11038 [a, b] = _coerce_fp_expr_list([a, b], ctx)
11040 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression")
11041 _z3_assert(is_fp(a) or is_fp(b), "Second or third argument must be a Z3 floating-point expression")
11042 return FPRef(f(ctx.ref(), rm.as_ast(), a.as_ast(), b.as_ast()), ctx)
11045def _mk_fp_bin_norm(f, a, b, ctx):
11046 ctx = _get_ctx(ctx)
11047 [a, b] = _coerce_fp_expr_list([a, b], ctx)
11049 _z3_assert(is_fp(a) or is_fp(b), "First or second argument must be a Z3 floating-point expression")
11050 return FPRef(f(ctx.ref(), a.as_ast(), b.as_ast()), ctx)
11053def _mk_fp_bin_pred(f, a, b, ctx):
11054 ctx = _get_ctx(ctx)
11055 [a, b] = _coerce_fp_expr_list([a, b], ctx)
11057 _z3_assert(is_fp(a) or is_fp(b), "First or second argument must be a Z3 floating-point expression")
11058 return BoolRef(f(ctx.ref(), a.as_ast(), b.as_ast()), ctx)
11061def _mk_fp_tern(f, rm, a, b, c, ctx):
11062 ctx = _get_ctx(ctx)
11063 [a, b, c] = _coerce_fp_expr_list([a, b, c], ctx)
11065 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression")
11066 _z3_assert(is_fp(a) or is_fp(b) or is_fp(
11067 c), "Second, third or fourth argument must be a Z3 floating-point expression")
11068 return FPRef(f(ctx.ref(), rm.as_ast(), a.as_ast(), b.as_ast(), c.as_ast()), ctx)
11071def fpAdd(rm, a, b, ctx=None):
11072 """Create a Z3 floating-point addition expression.
11074 >>> s = FPSort(8, 24)
11078 >>> fpAdd(rm, x, y)
11080 >>> fpAdd(RTZ(), x, y) # default rounding mode is RTZ
11082 >>> fpAdd(rm, x, y).sort()
11085 return _mk_fp_bin(Z3_mk_fpa_add, rm, a, b, ctx)
11088def fpSub(rm, a, b, ctx=None):
11089 """Create a Z3 floating-point subtraction expression.
11091 >>> s = FPSort(8, 24)
11095 >>> fpSub(rm, x, y)
11097 >>> fpSub(rm, x, y).sort()
11100 return _mk_fp_bin(Z3_mk_fpa_sub, rm, a, b, ctx)
11103def fpMul(rm, a, b, ctx=None):
11104 """Create a Z3 floating-point multiplication expression.
11106 >>> s = FPSort(8, 24)
11110 >>> fpMul(rm, x, y)
11112 >>> fpMul(rm, x, y).sort()
11115 return _mk_fp_bin(Z3_mk_fpa_mul, rm, a, b, ctx)
11118def fpDiv(rm, a, b, ctx=None):
11119 """Create a Z3 floating-point division expression.
11121 >>> s = FPSort(8, 24)
11125 >>> fpDiv(rm, x, y)
11127 >>> fpDiv(rm, x, y).sort()
11130 return _mk_fp_bin(Z3_mk_fpa_div, rm, a, b, ctx)
11133def fpRem(a, b, ctx=None):
11134 """Create a Z3 floating-point remainder expression.
11136 >>> s = FPSort(8, 24)
11141 >>> fpRem(x, y).sort()
11144 return _mk_fp_bin_norm(Z3_mk_fpa_rem, a, b, ctx)
11147def fpMin(a, b, ctx=None):
11148 """Create a Z3 floating-point minimum expression.
11150 >>> s = FPSort(8, 24)
11156 >>> fpMin(x, y).sort()
11159 return _mk_fp_bin_norm(Z3_mk_fpa_min, a, b, ctx)
11162def fpMax(a, b, ctx=None):
11163 """Create a Z3 floating-point maximum expression.
11165 >>> s = FPSort(8, 24)
11171 >>> fpMax(x, y).sort()
11174 return _mk_fp_bin_norm(Z3_mk_fpa_max, a, b, ctx)
11177def fpFMA(rm, a, b, c, ctx=None):
11178 """Create a Z3 floating-point fused multiply-add expression.
11180 return _mk_fp_tern(Z3_mk_fpa_fma, rm, a, b, c, ctx)
11183def fpSqrt(rm, a, ctx=None):
11184 """Create a Z3 floating-point square root expression.
11186 return _mk_fp_unary(Z3_mk_fpa_sqrt, rm, a, ctx)
11189def fpRoundToIntegral(rm, a, ctx=None):
11190 """Create a Z3 floating-point roundToIntegral expression.
11192 return _mk_fp_unary(Z3_mk_fpa_round_to_integral, rm, a, ctx)
11195def fpIsNaN(a, ctx=None):
11196 """Create a Z3 floating-point isNaN expression.
11198 >>> s = FPSort(8, 24)
11204 return _mk_fp_unary_pred(Z3_mk_fpa_is_nan, a, ctx)
11207def fpIsInf(a, ctx=None):
11208 """Create a Z3 floating-point isInfinite expression.
11210 >>> s = FPSort(8, 24)
11215 return _mk_fp_unary_pred(Z3_mk_fpa_is_infinite, a, ctx)
11218def fpIsZero(a, ctx=None):
11219 """Create a Z3 floating-point isZero expression.
11221 return _mk_fp_unary_pred(Z3_mk_fpa_is_zero, a, ctx)
11224def fpIsNormal(a, ctx=None):
11225 """Create a Z3 floating-point isNormal expression.
11227 return _mk_fp_unary_pred(Z3_mk_fpa_is_normal, a, ctx)
11230def fpIsSubnormal(a, ctx=None):
11231 """Create a Z3 floating-point isSubnormal expression.
11233 return _mk_fp_unary_pred(Z3_mk_fpa_is_subnormal, a, ctx)
11236def fpIsNegative(a, ctx=None):
11237 """Create a Z3 floating-point isNegative expression.
11239 return _mk_fp_unary_pred(Z3_mk_fpa_is_negative, a, ctx)
11242def fpIsPositive(a, ctx=None):
11243 """Create a Z3 floating-point isPositive expression.
11245 return _mk_fp_unary_pred(Z3_mk_fpa_is_positive, a, ctx)
11248def _check_fp_args(a, b):
11250 _z3_assert(is_fp(a) or is_fp(b), "First or second argument must be a Z3 floating-point expression")
11253def fpLT(a, b, ctx=None):
11254 """Create the Z3 floating-point expression `other < self`.
11256 >>> x, y = FPs('x y', FPSort(8, 24))
11259 >>> (x < y).sexpr()
11262 return _mk_fp_bin_pred(Z3_mk_fpa_lt, a, b, ctx)
11265def fpLEQ(a, b, ctx=None):
11266 """Create the Z3 floating-point expression `other <= self`.
11268 >>> x, y = FPs('x y', FPSort(8, 24))
11271 >>> (x <= y).sexpr()
11274 return _mk_fp_bin_pred(Z3_mk_fpa_leq, a, b, ctx)
11277def fpGT(a, b, ctx=None):
11278 """Create the Z3 floating-point expression `other > self`.
11280 >>> x, y = FPs('x y', FPSort(8, 24))
11283 >>> (x > y).sexpr()
11286 return _mk_fp_bin_pred(Z3_mk_fpa_gt, a, b, ctx)
11289def fpGEQ(a, b, ctx=None):
11290 """Create the Z3 floating-point expression `other >= self`.
11292 >>> x, y = FPs('x y', FPSort(8, 24))
11295 >>> (x >= y).sexpr()
11298 return _mk_fp_bin_pred(Z3_mk_fpa_geq, a, b, ctx)
11301def fpEQ(a, b, ctx=None):
11302 """Create the Z3 floating-point expression `fpEQ(other, self)`.
11304 >>> x, y = FPs('x y', FPSort(8, 24))
11307 >>> fpEQ(x, y).sexpr()
11310 return _mk_fp_bin_pred(Z3_mk_fpa_eq, a, b, ctx)
11313def fpNEQ(a, b, ctx=None):
11314 """Create the Z3 floating-point expression `Not(fpEQ(other, self))`.
11316 >>> x, y = FPs('x y', FPSort(8, 24))
11319 >>> (x != y).sexpr()
11322 return Not(fpEQ(a, b, ctx))
11325def fpFP(sgn, exp, sig, ctx=None):
11326 """Create the Z3 floating-point value `fpFP(sgn, sig, exp)` from the three bit-vectors sgn, sig, and exp.
11328 >>> s = FPSort(8, 24)
11329 >>> x = fpFP(BitVecVal(1, 1), BitVecVal(2**7-1, 8), BitVecVal(2**22, 23))
11331 fpFP(1, 127, 4194304)
11332 >>> xv = FPVal(-1.5, s)
11335 >>> slvr = Solver()
11336 >>> slvr.add(fpEQ(x, xv))
11339 >>> xv = FPVal(+1.5, s)
11342 >>> slvr = Solver()
11343 >>> slvr.add(fpEQ(x, xv))
11347 _z3_assert(is_bv(sgn) and is_bv(exp) and is_bv(sig), "sort mismatch")
11348 _z3_assert(sgn.sort().size() == 1, "sort mismatch")
11349 ctx = _get_ctx(ctx)
11350 _z3_assert(ctx == sgn.ctx == exp.ctx == sig.ctx, "context mismatch")
11351 return FPRef(Z3_mk_fpa_fp(ctx.ref(), sgn.ast, exp.ast, sig.ast), ctx)
11354def fpToFP(a1, a2=None, a3=None, ctx=None):
11355 """Create a Z3 floating-point conversion expression from other term sorts
11358 From a bit-vector term in IEEE 754-2008 format:
11359 >>> x = FPVal(1.0, Float32())
11360 >>> x_bv = fpToIEEEBV(x)
11361 >>> simplify(fpToFP(x_bv, Float32()))
11364 From a floating-point term with different precision:
11365 >>> x = FPVal(1.0, Float32())
11366 >>> x_db = fpToFP(RNE(), x, Float64())
11371 >>> x_r = RealVal(1.5)
11372 >>> simplify(fpToFP(RNE(), x_r, Float32()))
11375 From a signed bit-vector term:
11376 >>> x_signed = BitVecVal(-5, BitVecSort(32))
11377 >>> simplify(fpToFP(RNE(), x_signed, Float32()))
11380 ctx = _get_ctx(ctx)
11381 if is_bv(a1) and is_fp_sort(a2):
11382 return FPRef(Z3_mk_fpa_to_fp_bv(ctx.ref(), a1.ast, a2.ast), ctx)
11383 elif is_fprm(a1) and is_fp(a2) and is_fp_sort(a3):
11384 return FPRef(Z3_mk_fpa_to_fp_float(ctx.ref(), a1.ast, a2.ast, a3.ast), ctx)
11385 elif is_fprm(a1) and is_real(a2) and is_fp_sort(a3):
11386 return FPRef(Z3_mk_fpa_to_fp_real(ctx.ref(), a1.ast, a2.ast, a3.ast), ctx)
11387 elif is_fprm(a1) and is_bv(a2) and is_fp_sort(a3):
11388 return FPRef(Z3_mk_fpa_to_fp_signed(ctx.ref(), a1.ast, a2.ast, a3.ast), ctx)
11390 raise Z3Exception("Unsupported combination of arguments for conversion to floating-point term.")
11393def fpBVToFP(v, sort, ctx=None):
11394 """Create a Z3 floating-point conversion expression that represents the
11395 conversion from a bit-vector term to a floating-point term.
11397 >>> x_bv = BitVecVal(0x3F800000, 32)
11398 >>> x_fp = fpBVToFP(x_bv, Float32())
11404 _z3_assert(is_bv(v), "First argument must be a Z3 bit-vector expression")
11405 _z3_assert(is_fp_sort(sort), "Second argument must be a Z3 floating-point sort.")
11406 ctx = _get_ctx(ctx)
11407 return FPRef(Z3_mk_fpa_to_fp_bv(ctx.ref(), v.ast, sort.ast), ctx)
11410def fpFPToFP(rm, v, sort, ctx=None):
11411 """Create a Z3 floating-point conversion expression that represents the
11412 conversion from a floating-point term to a floating-point term of different precision.
11414 >>> x_sgl = FPVal(1.0, Float32())
11415 >>> x_dbl = fpFPToFP(RNE(), x_sgl, Float64())
11418 >>> simplify(x_dbl)
11423 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression.")
11424 _z3_assert(is_fp(v), "Second argument must be a Z3 floating-point expression.")
11425 _z3_assert(is_fp_sort(sort), "Third argument must be a Z3 floating-point sort.")
11426 ctx = _get_ctx(ctx)
11427 return FPRef(Z3_mk_fpa_to_fp_float(ctx.ref(), rm.ast, v.ast, sort.ast), ctx)
11430def fpRealToFP(rm, v, sort, ctx=None):
11431 """Create a Z3 floating-point conversion expression that represents the
11432 conversion from a real term to a floating-point term.
11434 >>> x_r = RealVal(1.5)
11435 >>> x_fp = fpRealToFP(RNE(), x_r, Float32())
11441 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression.")
11442 _z3_assert(is_real(v), "Second argument must be a Z3 expression or real sort.")
11443 _z3_assert(is_fp_sort(sort), "Third argument must be a Z3 floating-point sort.")
11444 ctx = _get_ctx(ctx)
11445 return FPRef(Z3_mk_fpa_to_fp_real(ctx.ref(), rm.ast, v.ast, sort.ast), ctx)
11448def fpSignedToFP(rm, v, sort, ctx=None):
11449 """Create a Z3 floating-point conversion expression that represents the
11450 conversion from a signed bit-vector term (encoding an integer) to a floating-point term.
11452 >>> x_signed = BitVecVal(-5, BitVecSort(32))
11453 >>> x_fp = fpSignedToFP(RNE(), x_signed, Float32())
11455 fpToFP(RNE(), 4294967291)
11459 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression.")
11460 _z3_assert(is_bv(v), "Second argument must be a Z3 bit-vector expression")
11461 _z3_assert(is_fp_sort(sort), "Third argument must be a Z3 floating-point sort.")
11462 ctx = _get_ctx(ctx)
11463 return FPRef(Z3_mk_fpa_to_fp_signed(ctx.ref(), rm.ast, v.ast, sort.ast), ctx)
11466def fpUnsignedToFP(rm, v, sort, ctx=None):
11467 """Create a Z3 floating-point conversion expression that represents the
11468 conversion from an unsigned bit-vector term (encoding an integer) to a floating-point term.
11470 >>> x_signed = BitVecVal(-5, BitVecSort(32))
11471 >>> x_fp = fpUnsignedToFP(RNE(), x_signed, Float32())
11473 fpToFPUnsigned(RNE(), 4294967291)
11477 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression.")
11478 _z3_assert(is_bv(v), "Second argument must be a Z3 bit-vector expression")
11479 _z3_assert(is_fp_sort(sort), "Third argument must be a Z3 floating-point sort.")
11480 ctx = _get_ctx(ctx)
11481 return FPRef(Z3_mk_fpa_to_fp_unsigned(ctx.ref(), rm.ast, v.ast, sort.ast), ctx)
11484def fpToFPUnsigned(rm, x, s, ctx=None):
11485 """Create a Z3 floating-point conversion expression, from unsigned bit-vector to floating-point expression."""
11487 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression")
11488 _z3_assert(is_bv(x), "Second argument must be a Z3 bit-vector expression")
11489 _z3_assert(is_fp_sort(s), "Third argument must be Z3 floating-point sort")
11490 ctx = _get_ctx(ctx)
11491 return FPRef(Z3_mk_fpa_to_fp_unsigned(ctx.ref(), rm.ast, x.ast, s.ast), ctx)
11494def fpToSBV(rm, x, s, ctx=None):
11495 """Create a Z3 floating-point conversion expression, from floating-point expression to signed bit-vector.
11497 >>> x = FP('x', FPSort(8, 24))
11498 >>> y = fpToSBV(RTZ(), x, BitVecSort(32))
11499 >>> print(is_fp(x))
11501 >>> print(is_bv(y))
11503 >>> print(is_fp(y))
11505 >>> print(is_bv(x))
11509 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression")
11510 _z3_assert(is_fp(x), "Second argument must be a Z3 floating-point expression")
11511 _z3_assert(is_bv_sort(s), "Third argument must be Z3 bit-vector sort")
11512 ctx = _get_ctx(ctx)
11513 return BitVecRef(Z3_mk_fpa_to_sbv(ctx.ref(), rm.ast, x.ast, s.size()), ctx)
11516def fpToUBV(rm, x, s, ctx=None):
11517 """Create a Z3 floating-point conversion expression, from floating-point expression to unsigned bit-vector.
11519 >>> x = FP('x', FPSort(8, 24))
11520 >>> y = fpToUBV(RTZ(), x, BitVecSort(32))
11521 >>> print(is_fp(x))
11523 >>> print(is_bv(y))
11525 >>> print(is_fp(y))
11527 >>> print(is_bv(x))
11531 _z3_assert(is_fprm(rm), "First argument must be a Z3 floating-point rounding mode expression")
11532 _z3_assert(is_fp(x), "Second argument must be a Z3 floating-point expression")
11533 _z3_assert(is_bv_sort(s), "Third argument must be Z3 bit-vector sort")
11534 ctx = _get_ctx(ctx)
11535 return BitVecRef(Z3_mk_fpa_to_ubv(ctx.ref(), rm.ast, x.ast, s.size()), ctx)
11538def fpToReal(x, ctx=None):
11539 """Create a Z3 floating-point conversion expression, from floating-point expression to real.
11541 >>> x = FP('x', FPSort(8, 24))
11542 >>> y = fpToReal(x)
11543 >>> print(is_fp(x))
11545 >>> print(is_real(y))
11547 >>> print(is_fp(y))
11549 >>> print(is_real(x))
11553 _z3_assert(is_fp(x), "First argument must be a Z3 floating-point expression")
11554 ctx = _get_ctx(ctx)
11555 return ArithRef(Z3_mk_fpa_to_real(ctx.ref(), x.ast), ctx)
11558def fpToIEEEBV(x, ctx=None):
11559 """\brief Conversion of a floating-point term into a bit-vector term in IEEE 754-2008 format.
11561 The size of the resulting bit-vector is automatically determined.
11563 Note that IEEE 754-2008 allows multiple different representations of NaN. This conversion
11564 knows only one NaN and it will always produce the same bit-vector representation of
11567 >>> x = FP('x', FPSort(8, 24))
11568 >>> y = fpToIEEEBV(x)
11569 >>> print(is_fp(x))
11571 >>> print(is_bv(y))
11573 >>> print(is_fp(y))
11575 >>> print(is_bv(x))
11579 _z3_assert(is_fp(x), "First argument must be a Z3 floating-point expression")
11580 ctx = _get_ctx(ctx)
11581 return BitVecRef(Z3_mk_fpa_to_ieee_bv(ctx.ref(), x.ast), ctx)
11584#########################################
11586# Strings, Sequences and Regular expressions
11588#########################################
11590class SeqSortRef(SortRef):
11591 """Sequence sort."""
11593 def is_string(self):
11594 """Determine if sort is a string
11595 >>> s = StringSort()
11598 >>> s = SeqSort(IntSort())
11602 return Z3_is_string_sort(self.ctx_ref(), self.ast)
11605 return _to_sort_ref(Z3_get_seq_sort_basis(self.ctx_ref(), self.ast), self.ctx)
11607class CharSortRef(SortRef):
11608 """Character sort."""
11611def StringSort(ctx=None):
11612 """Create a string sort
11613 >>> s = StringSort()
11617 ctx = _get_ctx(ctx)
11618 return SeqSortRef(Z3_mk_string_sort(ctx.ref()), ctx)
11620def CharSort(ctx=None):
11621 """Create a character sort
11622 >>> ch = CharSort()
11626 ctx = _get_ctx(ctx)
11627 return CharSortRef(Z3_mk_char_sort(ctx.ref()), ctx)
11631 """Create a sequence sort over elements provided in the argument
11632 >>> s = SeqSort(IntSort())
11633 >>> s == Unit(IntVal(1)).sort()
11636 return SeqSortRef(Z3_mk_seq_sort(s.ctx_ref(), s.ast), s.ctx)
11639class SeqRef(ExprRef):
11640 """Sequence expression."""
11643 return SeqSortRef(Z3_get_sort(self.ctx_ref(), self.as_ast()), self.ctx)
11645 def __add__(self, other):
11646 return Concat(self, other)
11648 def __radd__(self, other):
11649 return Concat(other, self)
11651 def __pow__(self, other):
11652 return SeqPower(self, other)
11654 def __getitem__(self, i):
11656 i = IntVal(i, self.ctx)
11657 return _to_expr_ref(Z3_mk_seq_nth(self.ctx_ref(), self.as_ast(), i.as_ast()), self.ctx)
11661 i = IntVal(i, self.ctx)
11662 return SeqRef(Z3_mk_seq_at(self.ctx_ref(), self.as_ast(), i.as_ast()), self.ctx)
11664 def is_string(self):
11665 return Z3_is_string_sort(self.ctx_ref(), Z3_get_sort(self.ctx_ref(), self.as_ast()))
11667 def is_string_value(self):
11668 return Z3_is_string(self.ctx_ref(), self.as_ast())
11670 def as_string(self):
11671 """Return a string representation of sequence expression."""
11672 if self.is_string_value():
11673 string_length = ctypes.c_uint()
11674 chars = Z3_get_lstring(self.ctx_ref(), self.as_ast(), byref(string_length))
11675 return string_at(chars, size=string_length.value).decode("latin-1")
11676 return Z3_ast_to_string(self.ctx_ref(), self.as_ast())
11678 def py_value(self):
11679 return self.as_string()
11681 def __le__(self, other):
11682 return _to_expr_ref(Z3_mk_str_le(self.ctx_ref(), self.as_ast(), other.as_ast()), self.ctx)
11684 def __lt__(self, other):
11685 return _to_expr_ref(Z3_mk_str_lt(self.ctx_ref(), self.as_ast(), other.as_ast()), self.ctx)
11687 def __ge__(self, other):
11688 return _to_expr_ref(Z3_mk_str_le(self.ctx_ref(), other.as_ast(), self.as_ast()), self.ctx)
11690 def __gt__(self, other):
11691 return _to_expr_ref(Z3_mk_str_lt(self.ctx_ref(), other.as_ast(), self.as_ast()), self.ctx)
11694def _coerce_char(ch, ctx=None):
11695 if isinstance(ch, str):
11696 ctx = _get_ctx(ctx)
11697 ch = CharVal(ch, ctx)
11698 if not is_expr(ch):
11699 raise Z3Exception("Character expression expected")
11702class CharRef(ExprRef):
11703 """Character expression."""
11705 def __le__(self, other):
11706 other = _coerce_char(other, self.ctx)
11707 return _to_expr_ref(Z3_mk_char_le(self.ctx_ref(), self.as_ast(), other.as_ast()), self.ctx)
11710 return _to_expr_ref(Z3_mk_char_to_int(self.ctx_ref(), self.as_ast()), self.ctx)
11713 return _to_expr_ref(Z3_mk_char_to_bv(self.ctx_ref(), self.as_ast()), self.ctx)
11715 def is_digit(self):
11716 return _to_expr_ref(Z3_mk_char_is_digit(self.ctx_ref(), self.as_ast()), self.ctx)
11719def CharVal(ch, ctx=None):
11720 ctx = _get_ctx(ctx)
11721 if isinstance(ch, str):
11723 if not isinstance(ch, int):
11724 raise Z3Exception("character value should be an ordinal")
11725 return _to_expr_ref(Z3_mk_char(ctx.ref(), ch), ctx)
11728 if not is_expr(bv):
11729 raise Z3Exception("Bit-vector expression needed")
11730 return _to_expr_ref(Z3_mk_char_from_bv(bv.ctx_ref(), bv.as_ast()), bv.ctx)
11732def CharToBv(ch, ctx=None):
11733 ch = _coerce_char(ch, ctx)
11736def CharToInt(ch, ctx=None):
11737 ch = _coerce_char(ch, ctx)
11740def CharIsDigit(ch, ctx=None):
11741 ch = _coerce_char(ch, ctx)
11742 return ch.is_digit()
11744def _coerce_seq(s, ctx=None):
11745 if isinstance(s, str):
11746 ctx = _get_ctx(ctx)
11747 s = StringVal(s, ctx)
11749 raise Z3Exception("Non-expression passed as a sequence")
11751 raise Z3Exception("Non-sequence passed as a sequence")
11755def _get_ctx2(a, b, ctx=None):
11766 """Return `True` if `a` is a Z3 sequence expression.
11767 >>> print (is_seq(Unit(IntVal(0))))
11769 >>> print (is_seq(StringVal("abc")))
11772 return isinstance(a, SeqRef)
11775def is_string(a: Any) -> bool:
11776 """Return `True` if `a` is a Z3 string expression.
11777 >>> print (is_string(StringVal("ab")))
11780 return isinstance(a, SeqRef) and a.is_string()
11783def is_string_value(a: Any) -> bool:
11784 """return 'True' if 'a' is a Z3 string constant expression.
11785 >>> print (is_string_value(StringVal("a")))
11787 >>> print (is_string_value(StringVal("a") + StringVal("b")))
11790 return isinstance(a, SeqRef) and a.is_string_value()
11792def StringVal(s, ctx=None):
11793 """create a string expression"""
11794 s = "".join(str(ch) if 32 <= ord(ch) and ord(ch) < 127 else "\\u{%x}" % (ord(ch)) for ch in s)
11795 ctx = _get_ctx(ctx)
11796 return SeqRef(Z3_mk_string(ctx.ref(), s), ctx)
11799def String(name, ctx=None):
11800 """Return a string constant named `name`. If `ctx=None`, then the global context is used.
11802 >>> x = String('x')
11804 ctx = _get_ctx(ctx)
11805 return SeqRef(Z3_mk_const(ctx.ref(), to_symbol(name, ctx), StringSort(ctx).ast), ctx)
11808def Strings(names, ctx=None):
11809 """Return a tuple of String constants. """
11810 ctx = _get_ctx(ctx)
11811 if isinstance(names, str):
11812 names = names.split(" ")
11813 return [String(name, ctx) for name in names]
11816def SubString(s, offset, length):
11817 """Extract substring or subsequence starting at offset.
11819 This is a convenience function that redirects to Extract(s, offset, length).
11821 >>> s = StringVal("hello world")
11822 >>> SubString(s, 6, 5) # Extract "world"
11823 str.substr("hello world", 6, 5)
11824 >>> simplify(SubString(StringVal("hello"), 1, 3))
11827 return Extract(s, offset, length)
11830def SubSeq(s, offset, length):
11831 """Extract substring or subsequence starting at offset.
11833 This is a convenience function that redirects to Extract(s, offset, length).
11835 >>> s = StringVal("hello world")
11836 >>> SubSeq(s, 0, 5) # Extract "hello"
11837 str.substr("hello world", 0, 5)
11838 >>> simplify(SubSeq(StringVal("testing"), 2, 4))
11841 return Extract(s, offset, length)
11845 """Create the empty sequence of the given sort
11846 >>> e = Empty(StringSort())
11847 >>> e2 = StringVal("")
11848 >>> print(e.eq(e2))
11850 >>> e3 = Empty(SeqSort(IntSort()))
11853 >>> e4 = Empty(ReSort(SeqSort(IntSort())))
11855 Empty(ReSort(Seq(Int)))
11857 if isinstance(s, SeqSortRef):
11858 return SeqRef(Z3_mk_seq_empty(s.ctx_ref(), s.ast), s.ctx)
11859 if isinstance(s, ReSortRef):
11860 return ReRef(Z3_mk_re_empty(s.ctx_ref(), s.ast), s.ctx)
11861 raise Z3Exception("Non-sequence, non-regular expression sort passed to Empty")
11865 """Create the regular expression that accepts the universal language
11866 >>> e = Full(ReSort(SeqSort(IntSort())))
11868 Full(ReSort(Seq(Int)))
11869 >>> e1 = Full(ReSort(StringSort()))
11871 Full(ReSort(String))
11873 if isinstance(s, ReSortRef):
11874 return ReRef(Z3_mk_re_full(s.ctx_ref(), s.ast), s.ctx)
11875 raise Z3Exception("Non-sequence, non-regular expression sort passed to Full")
11880 """Create a singleton sequence"""
11881 return SeqRef(Z3_mk_seq_unit(a.ctx_ref(), a.as_ast()), a.ctx)
11885 """Check if 'a' is a prefix of 'b'
11886 >>> s1 = PrefixOf("ab", "abc")
11889 >>> s2 = PrefixOf("bc", "abc")
11893 ctx = _get_ctx2(a, b)
11894 a = _coerce_seq(a, ctx)
11895 b = _coerce_seq(b, ctx)
11896 return BoolRef(Z3_mk_seq_prefix(a.ctx_ref(), a.as_ast(), b.as_ast()), a.ctx)
11900 """Check if 'a' is a suffix of 'b'
11901 >>> s1 = SuffixOf("ab", "abc")
11904 >>> s2 = SuffixOf("bc", "abc")
11908 ctx = _get_ctx2(a, b)
11909 a = _coerce_seq(a, ctx)
11910 b = _coerce_seq(b, ctx)
11911 return BoolRef(Z3_mk_seq_suffix(a.ctx_ref(), a.as_ast(), b.as_ast()), a.ctx)
11915 """Check if 'a' contains 'b'
11916 >>> s1 = Contains("abc", "ab")
11919 >>> s2 = Contains("abc", "bc")
11922 >>> x, y, z = Strings('x y z')
11923 >>> s3 = Contains(Concat(x,y,z), y)
11927 ctx = _get_ctx2(a, b)
11928 a = _coerce_seq(a, ctx)
11929 b = _coerce_seq(b, ctx)
11930 return BoolRef(Z3_mk_seq_contains(a.ctx_ref(), a.as_ast(), b.as_ast()), a.ctx)
11933def Replace(s, src, dst):
11934 """Replace the first occurrence of 'src' by 'dst' in 's'
11935 >>> r = Replace("aaa", "a", "b")
11939 ctx = _get_ctx2(dst, s)
11940 if ctx is None and is_expr(src):
11942 src = _coerce_seq(src, ctx)
11943 dst = _coerce_seq(dst, ctx)
11944 s = _coerce_seq(s, ctx)
11945 return SeqRef(Z3_mk_seq_replace(src.ctx_ref(), s.as_ast(), src.as_ast(), dst.as_ast()), s.ctx)
11948def IndexOf(s, substr, offset=None):
11949 """Retrieve the index of substring within a string starting at a specified offset.
11950 >>> simplify(IndexOf("abcabc", "bc", 0))
11952 >>> simplify(IndexOf("abcabc", "bc", 2))
11958 if is_expr(offset):
11960 ctx = _get_ctx2(s, substr, ctx)
11961 s = _coerce_seq(s, ctx)
11962 substr = _coerce_seq(substr, ctx)
11963 if _is_int(offset):
11964 offset = IntVal(offset, ctx)
11965 return ArithRef(Z3_mk_seq_index(s.ctx_ref(), s.as_ast(), substr.as_ast(), offset.as_ast()), s.ctx)
11968def LastIndexOf(s, substr):
11969 """Retrieve the last index of substring within a string"""
11971 ctx = _get_ctx2(s, substr, ctx)
11972 s = _coerce_seq(s, ctx)
11973 substr = _coerce_seq(substr, ctx)
11974 return ArithRef(Z3_mk_seq_last_index(s.ctx_ref(), s.as_ast(), substr.as_ast()), s.ctx)
11978 """Obtain the length of a sequence 's'
11979 >>> l = Length(StringVal("abc"))
11984 return ArithRef(Z3_mk_seq_length(s.ctx_ref(), s.as_ast()), s.ctx)
11987 """Concatenate the sequence 's' with itself 'n' times. It is the empty sequence for n <= 0
11988 >>> p = SeqPower(StringVal("ab"), 2)
11993 n = _py2expr(n, s.ctx)
11994 return SeqRef(Z3_mk_seq_power(s.ctx_ref(), s.as_ast(), n.as_ast()), s.ctx)
11997 """Map function 'f' over sequence 's'"""
11998 ctx = _get_ctx2(f, s)
11999 s = _coerce_seq(s, ctx)
12000 return _to_expr_ref(Z3_mk_seq_map(s.ctx_ref(), f.as_ast(), s.as_ast()), ctx)
12002def SeqMapI(f, i, s):
12003 """Map function 'f' over sequence 's' at index 'i'"""
12004 ctx = _get_ctx2(f, s)
12005 s = _coerce_seq(s, ctx)
12008 return _to_expr_ref(Z3_mk_seq_mapi(s.ctx_ref(), f.as_ast(), i.as_ast(), s.as_ast()), ctx)
12010def SeqFoldLeft(f, a, s):
12011 ctx = _get_ctx2(f, s)
12012 s = _coerce_seq(s, ctx)
12014 return _to_expr_ref(Z3_mk_seq_foldl(s.ctx_ref(), f.as_ast(), a.as_ast(), s.as_ast()), ctx)
12016def SeqFoldLeftI(f, i, a, s):
12017 ctx = _get_ctx2(f, s)
12018 s = _coerce_seq(s, ctx)
12021 return _to_expr_ref(Z3_mk_seq_foldli(s.ctx_ref(), f.as_ast(), i.as_ast(), a.as_ast(), s.as_ast()), ctx)
12024 """Convert string expression to integer
12025 >>> a = StrToInt("1")
12026 >>> simplify(1 == a)
12028 >>> b = StrToInt("2")
12029 >>> simplify(1 == b)
12031 >>> c = StrToInt(IntToStr(2))
12032 >>> simplify(1 == c)
12036 return ArithRef(Z3_mk_str_to_int(s.ctx_ref(), s.as_ast()), s.ctx)
12040 """Convert integer expression to string"""
12043 return SeqRef(Z3_mk_int_to_str(s.ctx_ref(), s.as_ast()), s.ctx)
12047 """Convert a unit length string to integer code"""
12050 return ArithRef(Z3_mk_string_to_code(s.ctx_ref(), s.as_ast()), s.ctx)
12053 """Convert code to a string"""
12056 return SeqRef(Z3_mk_string_from_code(c.ctx_ref(), c.as_ast()), c.ctx)
12058def Re(s, ctx=None):
12059 """The regular expression that accepts sequence 's'
12061 >>> s2 = Re(StringVal("ab"))
12062 >>> s3 = Re(Unit(BoolVal(True)))
12064 s = _coerce_seq(s, ctx)
12065 return ReRef(Z3_mk_seq_to_re(s.ctx_ref(), s.as_ast()), s.ctx)
12068# Regular expressions
12070class ReSortRef(SortRef):
12071 """Regular expression sort."""
12074 return _to_sort_ref(Z3_get_re_sort_basis(self.ctx_ref(), self.ast), self.ctx)
12079 return ReSortRef(Z3_mk_re_sort(s.ctx.ref(), s.ast), s.ctx)
12080 if s is None or isinstance(s, Context):
12082 return ReSortRef(Z3_mk_re_sort(ctx.ref(), Z3_mk_string_sort(ctx.ref())), s.ctx)
12083 raise Z3Exception("Regular expression sort constructor expects either a string or a context or no argument")
12086class ReRef(ExprRef):
12087 """Regular expressions."""
12089 def __add__(self, other):
12090 return Union(self, other)
12094 return isinstance(s, ReRef)
12098 """Create regular expression membership test
12099 >>> re = Union(Re("a"),Re("b"))
12100 >>> print (simplify(InRe("a", re)))
12102 >>> print (simplify(InRe("b", re)))
12104 >>> print (simplify(InRe("c", re)))
12107 s = _coerce_seq(s, re.ctx)
12108 return BoolRef(Z3_mk_seq_in_re(s.ctx_ref(), s.as_ast(), re.as_ast()), s.ctx)
12112 """Create union of regular expressions.
12113 >>> re = Union(Re("a"), Re("b"), Re("c"))
12114 >>> print (simplify(InRe("d", re)))
12117 args = _get_args(args)
12120 _z3_assert(sz > 0, "At least one argument expected.")
12122 if is_finite_set(arg0):
12124 if not is_finite_set(a):
12125 raise Z3Exception("All arguments must be regular expressions or finite sets.")
12129 _z3_assert(all([is_re(a) for a in args]), "All arguments must be regular expressions.")
12134 for i in range(sz):
12135 v[i] = args[i].as_ast()
12136 return ReRef(Z3_mk_re_union(ctx.ref(), sz, v), ctx)
12139def Intersect(*args):
12140 """Create intersection of regular expressions.
12141 >>> re = Intersect(Re("a"), Re("b"), Re("c"))
12143 args = _get_args(args)
12146 _z3_assert(sz > 0, "At least one argument expected.")
12148 if is_finite_set(arg0):
12150 if not is_finite_set(a):
12151 raise Z3Exception("All arguments must be regular expressions or finite sets.")
12155 _z3_assert(all([is_re(a) for a in args]), "All arguments must be regular expressions.")
12160 for i in range(sz):
12161 v[i] = args[i].as_ast()
12162 return ReRef(Z3_mk_re_intersect(ctx.ref(), sz, v), ctx)
12166 """Create the regular expression accepting one or more repetitions of argument.
12167 >>> re = Plus(Re("a"))
12168 >>> print(simplify(InRe("aa", re)))
12170 >>> print(simplify(InRe("ab", re)))
12172 >>> print(simplify(InRe("", re)))
12176 _z3_assert(is_expr(re), "expression expected")
12177 return ReRef(Z3_mk_re_plus(re.ctx_ref(), re.as_ast()), re.ctx)
12181 """Create the regular expression that optionally accepts the argument.
12182 >>> re = Option(Re("a"))
12183 >>> print(simplify(InRe("a", re)))
12185 >>> print(simplify(InRe("", re)))
12187 >>> print(simplify(InRe("aa", re)))
12191 _z3_assert(is_expr(re), "expression expected")
12192 return ReRef(Z3_mk_re_option(re.ctx_ref(), re.as_ast()), re.ctx)
12196 """Create the complement regular expression."""
12197 return ReRef(Z3_mk_re_complement(re.ctx_ref(), re.as_ast()), re.ctx)
12201 """Create the regular expression accepting zero or more repetitions of argument.
12202 >>> re = Star(Re("a"))
12203 >>> print(simplify(InRe("aa", re)))
12205 >>> print(simplify(InRe("ab", re)))
12207 >>> print(simplify(InRe("", re)))
12211 _z3_assert(is_expr(re), "expression expected")
12212 return ReRef(Z3_mk_re_star(re.ctx_ref(), re.as_ast()), re.ctx)
12215def Loop(re, lo, hi=0):
12216 """Create the regular expression accepting between a lower and upper bound repetitions
12217 >>> re = Loop(Re("a"), 1, 3)
12218 >>> print(simplify(InRe("aa", re)))
12220 >>> print(simplify(InRe("aaaa", re)))
12222 >>> print(simplify(InRe("", re)))
12226 _z3_assert(is_expr(re), "expression expected")
12227 return ReRef(Z3_mk_re_loop(re.ctx_ref(), re.as_ast(), lo, hi), re.ctx)
12230def Range(lo, hi, ctx=None):
12231 """Create the range regular expression over two sequences of length 1
12232 >>> range = Range("a","z")
12233 >>> print(simplify(InRe("b", range)))
12235 >>> print(simplify(InRe("bb", range)))
12238 lo = _coerce_seq(lo, ctx)
12239 hi = _coerce_seq(hi, ctx)
12241 _z3_assert(is_expr(lo), "expression expected")
12242 _z3_assert(is_expr(hi), "expression expected")
12243 return ReRef(Z3_mk_re_range(lo.ctx_ref(), lo.ast, hi.ast), lo.ctx)
12245def Diff(a, b, ctx=None):
12246 """Create the difference regular expression
12249 _z3_assert(is_expr(a), "expression expected")
12250 _z3_assert(is_expr(b), "expression expected")
12251 return ReRef(Z3_mk_re_diff(a.ctx_ref(), a.ast, b.ast), a.ctx)
12253def AllChar(regex_sort, ctx=None):
12254 """Create a regular expression that accepts all single character strings
12256 return ReRef(Z3_mk_re_allchar(regex_sort.ctx_ref(), regex_sort.ast), regex_sort.ctx)
12261def PartialOrder(a, index):
12262 return FuncDeclRef(Z3_mk_partial_order(a.ctx_ref(), a.ast, index), a.ctx)
12265def LinearOrder(a, index):
12266 return FuncDeclRef(Z3_mk_linear_order(a.ctx_ref(), a.ast, index), a.ctx)
12269def TreeOrder(a, index):
12270 return FuncDeclRef(Z3_mk_tree_order(a.ctx_ref(), a.ast, index), a.ctx)
12273def PiecewiseLinearOrder(a, index):
12274 return FuncDeclRef(Z3_mk_piecewise_linear_order(a.ctx_ref(), a.ast, index), a.ctx)
12277def TransitiveClosure(f):
12278 """Given a binary relation R, such that the two arguments have the same sort
12279 create the transitive closure relation R+.
12280 The transitive closure R+ is a new relation.
12282 return FuncDeclRef(Z3_mk_transitive_closure(f.ctx_ref(), f.ast), f.ctx)
12286 super(ctypes.c_void_p, ast).__init__(ptr)
12289def to_ContextObj(ptr,):
12290 ctx = ContextObj(ptr)
12291 super(ctypes.c_void_p, ctx).__init__(ptr)
12294def to_AstVectorObj(ptr,):
12295 v = AstVectorObj(ptr)
12296 super(ctypes.c_void_p, v).__init__(ptr)
12299# NB. my-hacky-class only works for a single instance of OnClause
12300# it should be replaced with a proper correlation between OnClause
12301# and object references that can be passed over the FFI.
12302# for UserPropagator we use a global dictionary, which isn't great code.
12304_my_hacky_class = None
12305def on_clause_eh(ctx, p, n, dep, clause):
12306 onc = _my_hacky_class
12307 p = _to_expr_ref(to_Ast(p), onc.ctx)
12308 clause = AstVector(to_AstVectorObj(clause), onc.ctx)
12309 deps = [dep[i] for i in range(n)]
12310 onc.on_clause(p, deps, clause)
12312_on_clause_eh = Z3_on_clause_eh(on_clause_eh)
12315 def __init__(self, s, on_clause):
12318 self.on_clause = on_clause
12320 global _my_hacky_class
12321 _my_hacky_class = self
12322 Z3_solver_register_on_clause(self.ctx.ref(), self.s.solver, self.idx, _on_clause_eh)
12326 def __init__(self):
12330 def set_threaded(self):
12331 if self.lock is None:
12333 self.lock = threading.Lock()
12335 def get(self, ctx):
12338 r = self.bases[ctx]
12340 r = self.bases[ctx]
12343 def set(self, ctx, r):
12346 self.bases[ctx] = r
12348 self.bases[ctx] = r
12350 def insert(self, r):
12353 id = len(self.bases) + 3
12356 id = len(self.bases) + 3
12361_prop_closures = None
12364def ensure_prop_closures():
12365 global _prop_closures
12366 if _prop_closures is None:
12367 _prop_closures = PropClosures()
12370def user_prop_push(ctx, cb):
12371 prop = _prop_closures.get(ctx)
12376def user_prop_pop(ctx, cb, num_scopes):
12377 prop = _prop_closures.get(ctx)
12379 prop.pop(num_scopes)
12382def user_prop_fresh(ctx, _new_ctx):
12383 _prop_closures.set_threaded()
12384 prop = _prop_closures.get(ctx)
12386 Z3_del_context(nctx.ctx)
12387 new_ctx = to_ContextObj(_new_ctx)
12389 nctx.eh = Z3_set_error_handler(new_ctx, z3_error_handler)
12391 new_prop = prop.fresh(nctx)
12392 _prop_closures.set(new_prop.id, new_prop)
12396def user_prop_fixed(ctx, cb, id, value):
12397 prop = _prop_closures.get(ctx)
12400 id = _to_expr_ref(to_Ast(id), prop.ctx())
12401 value = _to_expr_ref(to_Ast(value), prop.ctx())
12402 prop.fixed(id, value)
12405def user_prop_created(ctx, cb, id):
12406 prop = _prop_closures.get(ctx)
12409 id = _to_expr_ref(to_Ast(id), prop.ctx())
12414def user_prop_final(ctx, cb):
12415 prop = _prop_closures.get(ctx)
12421def user_prop_eq(ctx, cb, x, y):
12422 prop = _prop_closures.get(ctx)
12425 x = _to_expr_ref(to_Ast(x), prop.ctx())
12426 y = _to_expr_ref(to_Ast(y), prop.ctx())
12430def user_prop_diseq(ctx, cb, x, y):
12431 prop = _prop_closures.get(ctx)
12434 x = _to_expr_ref(to_Ast(x), prop.ctx())
12435 y = _to_expr_ref(to_Ast(y), prop.ctx())
12439def user_prop_decide(ctx, cb, t_ref, idx, phase):
12440 prop = _prop_closures.get(ctx)
12443 t = _to_expr_ref(to_Ast(t_ref), prop.ctx())
12444 prop.decide(t, idx, phase)
12447def user_prop_binding(ctx, cb, q_ref, inst_ref):
12448 prop = _prop_closures.get(ctx)
12451 q = _to_expr_ref(to_Ast(q_ref), prop.ctx())
12452 inst = _to_expr_ref(to_Ast(inst_ref), prop.ctx())
12453 r = prop.binding(q, inst)
12458_user_prop_push = Z3_push_eh(user_prop_push)
12459_user_prop_pop = Z3_pop_eh(user_prop_pop)
12460_user_prop_fresh = Z3_fresh_eh(user_prop_fresh)
12461_user_prop_fixed = Z3_fixed_eh(user_prop_fixed)
12462_user_prop_created = Z3_created_eh(user_prop_created)
12463_user_prop_final = Z3_final_eh(user_prop_final)
12464_user_prop_eq = Z3_eq_eh(user_prop_eq)
12465_user_prop_diseq = Z3_eq_eh(user_prop_diseq)
12466_user_prop_decide = Z3_decide_eh(user_prop_decide)
12467_user_prop_binding = Z3_on_binding_eh(user_prop_binding)
12470def PropagateFunction(name, *sig):
12471 """Create a function that gets tracked by user propagator.
12472 Every term headed by this function symbol is tracked.
12473 If a term is fixed and the fixed callback is registered a
12474 callback is invoked that the term headed by this function is fixed.
12476 sig = _get_args(sig)
12478 _z3_assert(len(sig) > 0, "At least two arguments expected")
12479 arity = len(sig) - 1
12482 _z3_assert(is_sort(rng), "Z3 sort expected")
12483 dom = (Sort * arity)()
12484 for i in range(arity):
12486 _z3_assert(is_sort(sig[i]), "Z3 sort expected")
12487 dom[i] = sig[i].ast
12489 return FuncDeclRef(Z3_solver_propagate_declare(ctx.ref(), to_symbol(name, ctx), arity, dom, rng.ast), ctx)
12493class UserPropagateBase:
12496 # Either solver is set or ctx is set.
12497 # Propagators that are created through callbacks
12498 # to "fresh" inherit the context of that is supplied
12499 # as argument to the callback.
12500 # This context should not be deleted. It is owned by the solver.
12502 def __init__(self, s, ctx=None):
12503 assert s is None or ctx is None
12504 ensure_prop_closures()
12507 self.fresh_ctx = None
12509 self.id = _prop_closures.insert(self)
12515 self.created = None
12516 self.binding = None
12518 self.fresh_ctx = ctx
12520 Z3_solver_propagate_init(self.ctx_ref(),
12522 ctypes.c_void_p(self.id),
12529 self._ctx.ctx = None
12533 return self.fresh_ctx
12535 return self.solver.ctx
12538 return self.ctx().ref()
12540 def add_fixed(self, fixed):
12542 raise Z3Exception("fixed callback already registered")
12544 raise Z3Exception("context already initialized")
12546 Z3_solver_propagate_fixed(self.ctx_ref(), self.solver.solver, _user_prop_fixed)
12549 def add_created(self, created):
12551 raise Z3Exception("created callback already registered")
12553 raise Z3Exception("context already initialized")
12555 Z3_solver_propagate_created(self.ctx_ref(), self.solver.solver, _user_prop_created)
12556 self.created = created
12558 def add_final(self, final):
12560 raise Z3Exception("final callback already registered")
12562 raise Z3Exception("context already initialized")
12564 Z3_solver_propagate_final(self.ctx_ref(), self.solver.solver, _user_prop_final)
12567 def add_eq(self, eq):
12569 raise Z3Exception("eq callback already registered")
12571 raise Z3Exception("context already initialized")
12573 Z3_solver_propagate_eq(self.ctx_ref(), self.solver.solver, _user_prop_eq)
12576 def add_diseq(self, diseq):
12578 raise Z3Exception("diseq callback already registered")
12580 raise Z3Exception("context already initialized")
12582 Z3_solver_propagate_diseq(self.ctx_ref(), self.solver.solver, _user_prop_diseq)
12585 def add_decide(self, decide):
12587 raise Z3Exception("decide callback already registered")
12589 raise Z3Exception("context already initialized")
12591 Z3_solver_propagate_decide(self.ctx_ref(), self.solver.solver, _user_prop_decide)
12592 self.decide = decide
12594 def add_on_binding(self, binding):
12596 raise Z3Exception("binding callback already registered")
12598 raise Z3Exception("context already initialized")
12600 Z3_solver_propagate_on_binding(self.ctx_ref(), self.solver.solver, _user_prop_binding)
12601 self.binding = binding
12604 raise Z3Exception("push needs to be overwritten")
12606 def pop(self, num_scopes):
12607 raise Z3Exception("pop needs to be overwritten")
12609 def fresh(self, new_ctx):
12610 raise Z3Exception("fresh needs to be overwritten")
12614 raise Z3Exception("context already initialized")
12616 Z3_solver_propagate_register(self.ctx_ref(), self.solver.solver, e.ast)
12618 Z3_solver_propagate_register_cb(self.ctx_ref(), ctypes.c_void_p(self.cb), e.ast)
12621 # Tell the solver to perform the next split on a given term
12622 # If the term is a bit-vector the index idx specifies the index of the Boolean variable being
12623 # split on. A phase of true = 1/false = -1/undef = 0 = let solver decide is the last argument.
12625 def next_split(self, t, idx, phase):
12626 return Z3_solver_next_split(self.ctx_ref(), ctypes.c_void_p(self.cb), t.ast, idx, phase)
12629 # Propagation can only be invoked as during a fixed or final callback.
12631 def propagate(self, e, ids, eqs=[]):
12632 _ids, num_fixed = _to_ast_array(ids)
12634 _lhs, _num_lhs = _to_ast_array([x for x, y in eqs])
12635 _rhs, _num_rhs = _to_ast_array([y for x, y in eqs])
12636 return Z3_solver_propagate_consequence(e.ctx.ref(), ctypes.c_void_p(
12637 self.cb), num_fixed, _ids, num_eqs, _lhs, _rhs, e.ast)
12639 def conflict(self, deps = [], eqs = []):
12640 self.propagate(BoolVal(False, self.ctx()), deps, eqs)
12643class FiniteFieldSortRef(SortRef):
12644 """A prime field. Use SolverFor('QF_FF') for incremental field solving."""
12646 return int(Z3_get_finite_field_sort_size(self.ctx_ref(), self.ast))
12648 def cast(self, value):
12650 if not self.eq(value.sort()):
12651 raise Z3Exception("finite-field sort mismatch")
12653 return FiniteFieldVal(value, self)
12656class FiniteFieldRef(ExprRef):
12658 return FiniteFieldSortRef(Z3_get_sort(self.ctx_ref(), self.as_ast()), self.ctx)
12661 if not Z3_is_numeral_ast(self.ctx_ref(), self.as_ast()):
12662 raise Z3Exception("finite-field numeral expected")
12663 return int(Z3_get_numeral_string(self.ctx_ref(), self.as_ast()))
12665 def _binary(self, other, operation):
12666 other = self.sort().cast(other)
12667 args = (Ast * 2)(self.as_ast(), other.as_ast())
12668 return FiniteFieldRef(operation(self.ctx_ref(), 2, args), self.ctx)
12670 def __add__(self, other):
12671 return self._binary(other, Z3_mk_ff_add)
12673 def __radd__(self, other):
12674 return self + other
12676 def __mul__(self, other):
12677 return self._binary(other, Z3_mk_ff_mul)
12679 def __rmul__(self, other):
12680 return self * other
12683 return FiniteFieldRef(Z3_mk_ff_neg(self.ctx_ref(), self.as_ast()), self.ctx)
12685 def __sub__(self, other):
12686 return self + -self.sort().cast(other)
12688 def __rsub__(self, other):
12689 return self.sort().cast(other) + -self
12691 def __pow__(self, n):
12692 if not isinstance(n, int) or n < 0:
12693 raise Z3Exception("finite-field exponent must be a nonnegative integer")
12694 result, base = FiniteFieldVal(1, self.sort()), self
12697 result = result * base
12704def FiniteFieldSort(prime, ctx=None):
12705 ctx = _get_ctx(ctx)
12706 return FiniteFieldSortRef(Z3_mk_finite_field_sort(ctx.ref(), str(prime)), ctx)
12709def FiniteFieldVal(value, field, ctx=None):
12710 if not isinstance(field, FiniteFieldSortRef):
12711 field = FiniteFieldSort(field, ctx)
12712 if not isinstance(value, (int, str)):
12713 raise Z3Exception("finite-field value must be an integer")
12714 return FiniteFieldRef(Z3_mk_numeral(field.ctx_ref(), str(value), field.ast), field.ctx)
12717def FiniteFieldElem(name, field, ctx=None):
12718 if not isinstance(field, FiniteFieldSortRef):
12719 field = FiniteFieldSort(field, ctx)
12720 return Const(name, field)
12723def FiniteFieldElems(names, field, ctx=None):
12724 if not isinstance(field, FiniteFieldSortRef):
12725 field = FiniteFieldSort(field, ctx)
12726 return [Const(name, field) for name in (names.split() if isinstance(names, str) else names)]
12729def FiniteFieldBitsum(*args):
12730 args = _get_args(args)
12731 if len(args) < 2 or not isinstance(args[0], FiniteFieldRef):
12732 raise Z3Exception("bitsum needs at least two field arguments")
12733 field = args[0].sort()
12734 values = [field.cast(a) for a in args]
12735 raw = (Ast * len(values))(*[a.as_ast() for a in values])
12736 return FiniteFieldRef(Z3_mk_ff_bitsum(field.ctx_ref(), len(values), raw), field.ctx)
approx(self, precision=10)
__rtruediv__(self, other)
__deepcopy__(self, memo={})
__init__(self, m=None, ctx=None)
__deepcopy__(self, memo={})
__init__(self, ast, ctx=None)
__deepcopy__(self, memo={})
translate(self, other_ctx)
__init__(self, v=None, ctx=None)
__rtruediv__(self, other)
__deepcopy__(self, memo={})
set_ast_print_mode(self, mode)
__init__(self, *args, **kws)
__deepcopy__(self, memo={})
__init__(self, name, ctx=None)
declare(self, name, *args)
create_polymorphic(self, type_params)
declare_core(self, name, rec_name, *args)
update_field(self, field_accessor, new_value)
__deepcopy__(self, memo={})
__init__(self, entry, ctx)
__deepcopy__(self, memo={})
translate(self, other_ctx)
__deepcopy__(self, memo={})
assert_exprs(self, *args)
dimacs(self, include_names=True)
simplify(self, *arguments, **keywords)
convert_model(self, model)
__init__(self, models=True, unsat_cores=False, proofs=False, ctx=None, goal=None)
__deepcopy__(self, memo={})
eval(self, t, model_completion=False)
project_with_witness(self, vars, fml)
update_value(self, x, value)
evaluate(self, t, model_completion=False)
__deepcopy__(self, memo={})
__init__(self, descr, ctx=None)
get_documentation(self, n)
__deepcopy__(self, memo={})
__init__(self, ctx=None, params=None)
denominator_as_long(self)
Strings, Sequences and Regular expressions.
__init__(self, solver=None, ctx=None, logFile=None)
assert_and_track(self, a, p)
import_model_converter(self, other)
assert_exprs(self, *args)
check(self, *assumptions)
__exit__(self, *exc_info)
__deepcopy__(self, memo={})
__init__(self, stats, ctx)
Z3_ast Z3_API Z3_model_get_const_interp(Z3_context c, Z3_model m, Z3_func_decl a)
Return the interpretation (i.e., assignment) of constant a in the model m. Return NULL,...
Z3_sort Z3_API Z3_mk_int_sort(Z3_context c)
Create the integer type.
Z3_sort Z3_API Z3_mk_array_sort_n(Z3_context c, unsigned n, Z3_sort const *domain, Z3_sort range)
Create an array type with N arguments.
Z3_ast Z3_API Z3_mk_bvxnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise xnor.
bool Z3_API Z3_open_log(Z3_string filename)
Log interaction to a file.
Z3_parameter_kind Z3_API Z3_get_decl_parameter_kind(Z3_context c, Z3_func_decl d, unsigned idx)
Return the parameter type associated with a declaration.
Z3_ast Z3_API Z3_mk_bvnor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nor.
Z3_ast Z3_API Z3_get_denominator(Z3_context c, Z3_ast a)
Return the denominator (as a numeral AST) of a numeral AST of sort Real.
Z3_probe Z3_API Z3_probe_not(Z3_context x, Z3_probe p)
Return a probe that evaluates to "true" when p does not evaluate to true.
Z3_decl_kind Z3_API Z3_get_decl_kind(Z3_context c, Z3_func_decl d)
Return declaration kind corresponding to declaration.
void Z3_API Z3_solver_assert_and_track(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast p)
Assert a constraint a into the solver, and track it (in the unsat) core using the Boolean constant p.
Z3_ast Z3_API Z3_func_interp_get_else(Z3_context c, Z3_func_interp f)
Return the 'else' value of the given function interpretation.
Z3_ast Z3_API Z3_mk_bvsge(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed greater than or equal to.
void Z3_API Z3_ast_map_inc_ref(Z3_context c, Z3_ast_map m)
Increment the reference counter of the given AST map.
Z3_ast Z3_API Z3_mk_const_array(Z3_context c, Z3_sort domain, Z3_ast v)
Create the constant array.
Z3_ast Z3_API Z3_mk_bvsle(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than or equal to.
Z3_func_decl Z3_API Z3_get_app_decl(Z3_context c, Z3_app a)
Return the declaration of a constant or function application.
void Z3_API Z3_del_context(Z3_context c)
Delete the given logical context.
Z3_func_decl Z3_API Z3_get_decl_func_decl_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the expression value associated with an expression parameter.
Z3_ast Z3_API Z3_ast_map_find(Z3_context c, Z3_ast_map m, Z3_ast k)
Return the value associated with the key k.
Z3_string Z3_API Z3_ast_map_to_string(Z3_context c, Z3_ast_map m)
Convert the given map into a string.
Z3_string Z3_API Z3_param_descrs_to_string(Z3_context c, Z3_param_descrs p)
Convert a parameter description set into a string. This function is mainly used for printing the cont...
Z3_ast Z3_API Z3_mk_zero_ext(Z3_context c, unsigned i, Z3_ast t1)
Extend the given bit-vector with zeros to the (unsigned) equivalent bit-vector of size m+i,...
void Z3_API Z3_solver_set_params(Z3_context c, Z3_solver s, Z3_params p)
Set the given solver using the given parameters.
Z3_ast Z3_API Z3_mk_set_intersect(Z3_context c, unsigned num_args, Z3_ast const args[])
Take the intersection of a list of sets.
Z3_params Z3_API Z3_mk_params(Z3_context c)
Create a Z3 (empty) parameter set. Starting at Z3 4.0, parameter sets are used to configure many comp...
unsigned Z3_API Z3_get_decl_num_parameters(Z3_context c, Z3_func_decl d)
Return the number of parameters associated with a declaration.
Z3_ast Z3_API Z3_mk_set_subset(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Check for subsetness of sets.
Z3_ast Z3_API Z3_mk_bvule(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than or equal to.
Z3_ast Z3_API Z3_mk_full_set(Z3_context c, Z3_sort domain)
Create the full set.
Z3_param_kind Z3_API Z3_param_descrs_get_kind(Z3_context c, Z3_param_descrs p, Z3_symbol n)
Return the kind associated with the given parameter name n.
void Z3_API Z3_add_rec_def(Z3_context c, Z3_func_decl f, unsigned n, Z3_ast args[], Z3_ast body)
Define the body of a recursive function.
Z3_ast Z3_API Z3_mk_true(Z3_context c)
Create an AST node representing true.
Z3_ast Z3_API Z3_mk_set_union(Z3_context c, unsigned num_args, Z3_ast const args[])
Take the union of a list of sets.
Z3_ast Z3_API Z3_mk_finite_set_empty(Z3_context c, Z3_sort set_sort)
Create an empty finite set of the given sort.
Z3_func_interp Z3_API Z3_add_func_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast default_value)
Create a fresh func_interp object, add it to a model for a specified function. It has reference count...
Z3_ast Z3_API Z3_mk_bvsdiv_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed division of t1 and t2 does not overflow.
unsigned Z3_API Z3_get_arity(Z3_context c, Z3_func_decl d)
Alias for Z3_get_domain_size.
void Z3_API Z3_ast_vector_set(Z3_context c, Z3_ast_vector v, unsigned i, Z3_ast a)
Update position i of the AST vector v with the AST a.
Z3_ast Z3_API Z3_mk_bvxor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise exclusive-or.
Z3_string Z3_API Z3_stats_to_string(Z3_context c, Z3_stats s)
Convert a statistics into a string.
Z3_sort Z3_API Z3_mk_real_sort(Z3_context c)
Create the real type.
Z3_ast Z3_API Z3_mk_le(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than or equal to.
bool Z3_API Z3_global_param_get(Z3_string param_id, Z3_string_ptr param_value)
Get a global (or module) parameter.
bool Z3_API Z3_is_finite_set_sort(Z3_context c, Z3_sort s)
Check if a sort is a finite set sort.
bool Z3_API Z3_goal_inconsistent(Z3_context c, Z3_goal g)
Return true if the given goal contains the formula false.
Z3_ast Z3_API Z3_mk_lambda_const(Z3_context c, unsigned num_bound, Z3_app const bound[], Z3_ast body)
Create a lambda expression using a list of constants that form the set of bound variables.
void Z3_API Z3_solver_dec_ref(Z3_context c, Z3_solver s)
Decrement the reference counter of the given solver.
Z3_ast Z3_API Z3_mk_bvslt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed less than.
Z3_func_decl Z3_API Z3_model_get_func_decl(Z3_context c, Z3_model m, unsigned i)
Return the declaration of the i-th function in the given model.
bool Z3_API Z3_ast_map_contains(Z3_context c, Z3_ast_map m, Z3_ast k)
Return true if the map m contains the AST key k.
Z3_ast Z3_API Z3_mk_numeral(Z3_context c, Z3_string numeral, Z3_sort ty)
Create a numeral of a given sort.
Z3_ast Z3_API Z3_mk_finite_set_difference(Z3_context c, Z3_ast s1, Z3_ast s2)
Create the set difference of two finite sets.
unsigned Z3_API Z3_func_entry_get_num_args(Z3_context c, Z3_func_entry e)
Return the number of arguments in a Z3_func_entry object.
Z3_symbol Z3_API Z3_get_decl_symbol_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the double value associated with an double parameter.
Z3_symbol Z3_API Z3_get_quantifier_skolem_id(Z3_context c, Z3_ast a)
Obtain skolem id of quantifier.
Z3_ast Z3_API Z3_get_numerator(Z3_context c, Z3_ast a)
Return the numerator (as a numeral AST) of a numeral AST of sort Real.
Z3_ast Z3_API Z3_mk_unary_minus(Z3_context c, Z3_ast arg)
Create an AST node representing - arg.
Z3_ast Z3_API Z3_mk_and(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] and ... and args[num_args-1].
Z3_ast Z3_API Z3_mk_finite_set_subset(Z3_context c, Z3_ast s1, Z3_ast s2)
Check if one finite set is a subset of another.
void Z3_API Z3_interrupt(Z3_context c)
Interrupt the execution of a Z3 procedure. This procedure can be used to interrupt: solvers,...
void Z3_API Z3_goal_assert(Z3_context c, Z3_goal g, Z3_ast a)
Add a new formula a to the given goal. The formula is split according to the following procedure that...
Z3_symbol Z3_API Z3_param_descrs_get_name(Z3_context c, Z3_param_descrs p, unsigned i)
Return the name of the parameter at given index i.
Z3_sort Z3_API Z3_mk_polymorphic_datatype(Z3_context c, Z3_symbol name, unsigned num_parameters, Z3_sort parameters[], unsigned num_constructors, Z3_constructor constructors[])
Create a parametric datatype with explicit type parameters.
Z3_ast Z3_API Z3_func_entry_get_value(Z3_context c, Z3_func_entry e)
Return the value of this point.
bool Z3_API Z3_is_quantifier_exists(Z3_context c, Z3_ast a)
Determine if ast is an existential quantifier.
Z3_sort Z3_API Z3_mk_uninterpreted_sort(Z3_context c, Z3_symbol s)
Create a free (uninterpreted) type using the given name (symbol).
Z3_ast Z3_API Z3_mk_false(Z3_context c)
Create an AST node representing false.
Z3_ast_vector Z3_API Z3_ast_map_keys(Z3_context c, Z3_ast_map m)
Return the keys stored in the given map.
Z3_ast Z3_API Z3_mk_bvmul(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement multiplication.
Z3_model Z3_API Z3_goal_convert_model(Z3_context c, Z3_goal g, Z3_model m)
Convert a model of the formulas of a goal to a model of an original goal. The model may be null,...
void Z3_API Z3_del_constructor(Z3_context c, Z3_constructor constr)
Reclaim memory allocated to constructor.
Z3_ast Z3_API Z3_mk_bvsgt(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed greater than.
Z3_string Z3_API Z3_ast_to_string(Z3_context c, Z3_ast a)
Convert the given AST node into a string.
Z3_context Z3_API Z3_mk_context_rc(Z3_config c)
Create a context using the given configuration. This function is similar to Z3_mk_context....
Z3_string Z3_API Z3_get_full_version(void)
Return a string that fully describes the version of Z3 in use.
void Z3_API Z3_enable_trace(Z3_string tag)
Enable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise.
Z3_ast Z3_API Z3_mk_set_complement(Z3_context c, Z3_ast arg)
Take the complement of a set.
unsigned Z3_API Z3_get_quantifier_num_patterns(Z3_context c, Z3_ast a)
Return number of patterns used in quantifier.
Z3_symbol Z3_API Z3_get_quantifier_bound_name(Z3_context c, Z3_ast a, unsigned i)
Return symbol of the i'th bound variable.
bool Z3_API Z3_stats_is_uint(Z3_context c, Z3_stats s, unsigned idx)
Return true if the given statistical data is a unsigned integer.
unsigned Z3_API Z3_model_get_num_consts(Z3_context c, Z3_model m)
Return the number of constants assigned by the given model.
Z3_ast Z3_API Z3_mk_extract(Z3_context c, unsigned high, unsigned low, Z3_ast t1)
Extract the bits high down to low from a bit-vector of size m to yield a new bit-vector of size n,...
Z3_ast Z3_API Z3_mk_mod(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 mod arg2.
Z3_ast Z3_API Z3_mk_bvredand(Z3_context c, Z3_ast t1)
Take conjunction of bits in vector, return vector of length 1.
Z3_ast Z3_API Z3_mk_set_add(Z3_context c, Z3_ast set, Z3_ast elem)
Add an element to a set.
Z3_ast Z3_API Z3_mk_ge(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than or equal to.
Z3_ast Z3_API Z3_mk_bvadd_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed addition of t1 and t2 does not underflow.
Z3_ast Z3_API Z3_mk_bvadd_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise addition of t1 and t2 does not overflow.
void Z3_API Z3_set_ast_print_mode(Z3_context c, Z3_ast_print_mode mode)
Select mode for the format used for pretty-printing AST nodes.
Z3_ast Z3_API Z3_mk_array_default(Z3_context c, Z3_ast array)
Access the array default value. Produces the default range value, for arrays that can be represented ...
Z3_ast Z3_API Z3_datatype_update_field(Z3_context c, Z3_func_decl field_access, Z3_ast t, Z3_ast value)
Update record field with a value.
unsigned Z3_API Z3_model_get_num_sorts(Z3_context c, Z3_model m)
Return the number of uninterpreted sorts that m assigns an interpretation to.
Z3_ast_vector Z3_API Z3_ast_vector_translate(Z3_context s, Z3_ast_vector v, Z3_context t)
Translate the AST vector v from context s into an AST vector in context t.
void Z3_API Z3_func_entry_inc_ref(Z3_context c, Z3_func_entry e)
Increment the reference counter of the given Z3_func_entry object.
Z3_ast Z3_API Z3_mk_fresh_const(Z3_context c, Z3_string prefix, Z3_sort ty)
Declare and create a fresh constant.
Z3_ast Z3_API Z3_mk_bvsub_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed subtraction of t1 and t2 does not overflow.
void Z3_API Z3_solver_push(Z3_context c, Z3_solver s)
Create a backtracking point.
Z3_ast Z3_API Z3_mk_bvsub_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise subtraction of t1 and t2 does not underflow.
Z3_goal Z3_API Z3_goal_translate(Z3_context source, Z3_goal g, Z3_context target)
Copy a goal g from the context source to the context target.
Z3_ast Z3_API Z3_mk_bvudiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned division.
Z3_string Z3_API Z3_ast_vector_to_string(Z3_context c, Z3_ast_vector v)
Convert AST vector into a string.
Z3_sort Z3_API Z3_get_finite_set_sort_basis(Z3_context c, Z3_sort s)
Get the element sort of a finite set sort.
Z3_ast Z3_API Z3_mk_bvshl(Z3_context c, Z3_ast t1, Z3_ast t2)
Shift left.
bool Z3_API Z3_is_numeral_ast(Z3_context c, Z3_ast a)
Z3_ast Z3_API Z3_mk_finite_set_filter(Z3_context c, Z3_ast f, Z3_ast set)
Filter a finite set using a predicate.
Z3_ast Z3_API Z3_mk_bvsrem(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows dividend).
bool Z3_API Z3_is_as_array(Z3_context c, Z3_ast a)
The (_ as-array f) AST node is a construct for assigning interpretations for arrays in Z3....
Z3_func_decl Z3_API Z3_mk_func_decl(Z3_context c, Z3_symbol s, unsigned domain_size, Z3_sort const domain[], Z3_sort range)
Declare a constant or function.
Z3_ast Z3_API Z3_mk_is_int(Z3_context c, Z3_ast t1)
Check if a real number is an integer.
void Z3_API Z3_params_set_bool(Z3_context c, Z3_params p, Z3_symbol k, bool v)
Add a Boolean parameter k with value v to the parameter set p.
Z3_ast Z3_API Z3_mk_ite(Z3_context c, Z3_ast t1, Z3_ast t2, Z3_ast t3)
Create an AST node representing an if-then-else: ite(t1, t2, t3).
Z3_ast Z3_API Z3_mk_select(Z3_context c, Z3_ast a, Z3_ast i)
Array read. The argument a is the array and i is the index of the array that gets read.
Z3_ast Z3_API Z3_mk_sign_ext(Z3_context c, unsigned i, Z3_ast t1)
Sign-extend of the given bit-vector to the (signed) equivalent bit-vector of size m+i,...
Z3_ast Z3_API Z3_mk_finite_set_member(Z3_context c, Z3_ast elem, Z3_ast set)
Check if an element is a member of a finite set.
unsigned Z3_API Z3_goal_size(Z3_context c, Z3_goal g)
Return the number of formulas in the given goal.
void Z3_API Z3_stats_inc_ref(Z3_context c, Z3_stats s)
Increment the reference counter of the given statistics object.
Z3_ast Z3_API Z3_mk_select_n(Z3_context c, Z3_ast a, unsigned n, Z3_ast const *idxs)
n-ary Array read. The argument a is the array and idxs are the indices of the array that gets read.
Z3_ast_vector Z3_API Z3_algebraic_get_poly(Z3_context c, Z3_ast a)
Return the coefficients of the defining polynomial.
Z3_ast Z3_API Z3_mk_div(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 div arg2.
void Z3_API Z3_model_dec_ref(Z3_context c, Z3_model m)
Decrement the reference counter of the given model.
Z3_sort Z3_API Z3_mk_datatype_sort(Z3_context c, Z3_symbol name, unsigned num_params, Z3_sort const params[])
create a forward reference to a recursive datatype being declared. The forward reference can be used ...
void Z3_API Z3_func_interp_inc_ref(Z3_context c, Z3_func_interp f)
Increment the reference counter of the given Z3_func_interp object.
void Z3_API Z3_params_set_double(Z3_context c, Z3_params p, Z3_symbol k, double v)
Add a double parameter k with value v to the parameter set p.
Z3_string Z3_API Z3_param_descrs_get_documentation(Z3_context c, Z3_param_descrs p, Z3_symbol s)
Retrieve documentation string corresponding to parameter name s.
Z3_ast Z3_API Z3_mk_finite_set_union(Z3_context c, Z3_ast s1, Z3_ast s2)
Create the union of two finite sets.
Z3_solver Z3_API Z3_mk_solver(Z3_context c)
Create a new solver. This solver is a "combined solver" (see combined_solver module) that internally ...
Z3_model Z3_API Z3_solver_get_model(Z3_context c, Z3_solver s)
Retrieve the model for the last Z3_solver_check or Z3_solver_check_assumptions.
int Z3_API Z3_get_symbol_int(Z3_context c, Z3_symbol s)
Return the symbol int value.
Z3_func_decl Z3_API Z3_get_as_array_func_decl(Z3_context c, Z3_ast a)
Return the function declaration f associated with a (_ as_array f) node.
Z3_ast Z3_API Z3_mk_ext_rotate_left(Z3_context c, Z3_ast t1, Z3_ast t2)
Rotate bits of t1 to the left t2 times.
void Z3_API Z3_goal_inc_ref(Z3_context c, Z3_goal g)
Increment the reference counter of the given goal.
Z3_ast Z3_API Z3_mk_implies(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 implies t2.
unsigned Z3_API Z3_get_datatype_sort_num_constructors(Z3_context c, Z3_sort t)
Return number of constructors for datatype.
void Z3_API Z3_params_set_uint(Z3_context c, Z3_params p, Z3_symbol k, unsigned v)
Add a unsigned parameter k with value v to the parameter set p.
Z3_lbool Z3_API Z3_solver_check_assumptions(Z3_context c, Z3_solver s, unsigned num_assumptions, Z3_ast const assumptions[])
Check whether the assertions in the given solver and optional assumptions are consistent or not.
Z3_sort Z3_API Z3_model_get_sort(Z3_context c, Z3_model m, unsigned i)
Return a uninterpreted sort that m assigns an interpretation.
Z3_ast Z3_API Z3_mk_bvashr(Z3_context c, Z3_ast t1, Z3_ast t2)
Arithmetic shift right.
Z3_ast Z3_API Z3_mk_bv2int(Z3_context c, Z3_ast t1, bool is_signed)
Create an integer from the bit-vector argument t1. If is_signed is false, then the bit-vector t1 is t...
Z3_sort Z3_API Z3_get_array_sort_domain_n(Z3_context c, Z3_sort t, unsigned idx)
Return the i'th domain sort of an n-dimensional array.
Z3_ast Z3_API Z3_mk_set_del(Z3_context c, Z3_ast set, Z3_ast elem)
Remove an element to a set.
Z3_ast Z3_API Z3_mk_bvmul_no_overflow(Z3_context c, Z3_ast t1, Z3_ast t2, bool is_signed)
Create a predicate that checks that the bit-wise multiplication of t1 and t2 does not overflow.
Z3_ast Z3_API Z3_mk_finite_set_intersect(Z3_context c, Z3_ast s1, Z3_ast s2)
Create the intersection of two finite sets.
Z3_ast Z3_API Z3_mk_bvor(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise or.
int Z3_API Z3_get_decl_int_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the integer value associated with an integer parameter.
unsigned Z3_API Z3_get_quantifier_num_no_patterns(Z3_context c, Z3_ast a)
Return number of no_patterns used in quantifier.
Z3_func_decl Z3_API Z3_get_datatype_sort_constructor(Z3_context c, Z3_sort t, unsigned idx)
Return idx'th constructor.
void Z3_API Z3_ast_vector_resize(Z3_context c, Z3_ast_vector v, unsigned n)
Resize the AST vector v.
Z3_ast Z3_API Z3_mk_quantifier_const_ex(Z3_context c, bool is_forall, unsigned weight, Z3_symbol quantifier_id, Z3_symbol skolem_id, unsigned num_bound, Z3_app const bound[], unsigned num_patterns, Z3_pattern const patterns[], unsigned num_no_patterns, Z3_ast const no_patterns[], Z3_ast body)
Create a universal or existential quantifier using a list of constants that will form the set of boun...
Z3_pattern Z3_API Z3_mk_pattern(Z3_context c, unsigned num_patterns, Z3_ast const terms[])
Create a pattern for quantifier instantiation.
Z3_symbol_kind Z3_API Z3_get_symbol_kind(Z3_context c, Z3_symbol s)
Return Z3_INT_SYMBOL if the symbol was constructed using Z3_mk_int_symbol, and Z3_STRING_SYMBOL if th...
bool Z3_API Z3_is_lambda(Z3_context c, Z3_ast a)
Determine if ast is a lambda expression.
unsigned Z3_API Z3_stats_get_uint_value(Z3_context c, Z3_stats s, unsigned idx)
Return the unsigned value of the given statistical data.
Z3_sort Z3_API Z3_get_array_sort_domain(Z3_context c, Z3_sort t)
Return the domain of the given array sort. In the case of a multi-dimensional array,...
Z3_ast Z3_API Z3_mk_bvmul_no_underflow(Z3_context c, Z3_ast t1, Z3_ast t2)
Create a predicate that checks that the bit-wise signed multiplication of t1 and t2 does not underflo...
Z3_ast Z3_API Z3_func_decl_to_ast(Z3_context c, Z3_func_decl f)
Convert a Z3_func_decl into Z3_ast. This is just type casting.
void Z3_API Z3_add_const_interp(Z3_context c, Z3_model m, Z3_func_decl f, Z3_ast a)
Add a constant interpretation.
Z3_ast Z3_API Z3_mk_bvadd(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement addition.
unsigned Z3_API Z3_algebraic_get_i(Z3_context c, Z3_ast a)
Return which root of the polynomial the algebraic number represents.
void Z3_API Z3_params_dec_ref(Z3_context c, Z3_params p)
Decrement the reference counter of the given parameter set.
Z3_ast Z3_API Z3_get_app_arg(Z3_context c, Z3_app a, unsigned i)
Return the i-th argument of the given application.
Z3_string Z3_API Z3_model_to_string(Z3_context c, Z3_model m)
Convert the given model into a string.
Z3_func_decl Z3_API Z3_mk_fresh_func_decl(Z3_context c, Z3_string prefix, unsigned domain_size, Z3_sort const domain[], Z3_sort range)
Declare a fresh constant or function.
unsigned Z3_API Z3_ast_map_size(Z3_context c, Z3_ast_map m)
Return the size of the given map.
unsigned Z3_API Z3_param_descrs_size(Z3_context c, Z3_param_descrs p)
Return the number of parameters in the given parameter description set.
Z3_string Z3_API Z3_goal_to_dimacs_string(Z3_context c, Z3_goal g, bool include_names)
Convert a goal into a DIMACS formatted string. The goal must be in CNF. You can convert a goal to CNF...
Z3_ast Z3_API Z3_mk_lt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create less than.
Z3_ast Z3_API Z3_get_quantifier_no_pattern_ast(Z3_context c, Z3_ast a, unsigned i)
Return i'th no_pattern.
double Z3_API Z3_stats_get_double_value(Z3_context c, Z3_stats s, unsigned idx)
Return the double value of the given statistical data.
Z3_ast Z3_API Z3_mk_bvugt(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than.
unsigned Z3_API Z3_goal_depth(Z3_context c, Z3_goal g)
Return the depth of the given goal. It tracks how many transformations were applied to it.
Z3_ast Z3_API Z3_update_term(Z3_context c, Z3_ast a, unsigned num_args, Z3_ast const args[])
Update the arguments of term a using the arguments args. The number of arguments num_args should coin...
Z3_string Z3_API Z3_get_symbol_string(Z3_context c, Z3_symbol s)
Return the symbol name.
Z3_ast Z3_API Z3_pattern_to_ast(Z3_context c, Z3_pattern p)
Convert a Z3_pattern into Z3_ast. This is just type casting.
Z3_ast Z3_API Z3_mk_bvnot(Z3_context c, Z3_ast t1)
Bitwise negation.
Z3_ast Z3_API Z3_mk_bvurem(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned remainder.
void Z3_API Z3_mk_datatypes(Z3_context c, unsigned num_sorts, Z3_symbol const sort_names[], Z3_sort sorts[], Z3_constructor_list constructor_lists[])
Create mutually recursive datatypes.
unsigned Z3_API Z3_func_interp_get_arity(Z3_context c, Z3_func_interp f)
Return the arity (number of arguments) of the given function interpretation.
Z3_ast Z3_API Z3_mk_bvsub(Z3_context c, Z3_ast t1, Z3_ast t2)
Standard two's complement subtraction.
Z3_ast Z3_API Z3_get_algebraic_number_upper(Z3_context c, Z3_ast a, unsigned precision)
Return a upper bound for the given real algebraic number. The interval isolating the number is smalle...
Z3_ast Z3_API Z3_mk_power(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create an AST node representing arg1 ^ arg2.
Z3_ast Z3_API Z3_mk_seq_concat(Z3_context c, unsigned n, Z3_ast const args[])
Concatenate sequences.
Z3_sort Z3_API Z3_mk_enumeration_sort(Z3_context c, Z3_symbol name, unsigned n, Z3_symbol const enum_names[], Z3_func_decl enum_consts[], Z3_func_decl enum_testers[])
Create a enumeration sort.
unsigned Z3_API Z3_get_bv_sort_size(Z3_context c, Z3_sort t)
Return the size of the given bit-vector sort.
Z3_ast Z3_API Z3_mk_set_member(Z3_context c, Z3_ast elem, Z3_ast set)
Check for set membership.
void Z3_API Z3_ast_vector_dec_ref(Z3_context c, Z3_ast_vector v)
Decrement the reference counter of the given AST vector.
void Z3_API Z3_func_interp_dec_ref(Z3_context c, Z3_func_interp f)
Decrement the reference counter of the given Z3_func_interp object.
void Z3_API Z3_params_inc_ref(Z3_context c, Z3_params p)
Increment the reference counter of the given parameter set.
void Z3_API Z3_set_error_handler(Z3_context c, Z3_error_handler h)
Register a Z3 error handler.
Z3_ast Z3_API Z3_mk_distinct(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing distinct(args[0], ..., args[num_args-1]).
Z3_config Z3_API Z3_mk_config(void)
Create a configuration object for the Z3 context object.
void Z3_API Z3_set_param_value(Z3_config c, Z3_string param_id, Z3_string param_value)
Set a configuration parameter.
Z3_sort Z3_API Z3_mk_bv_sort(Z3_context c, unsigned sz)
Create a bit-vector type of the given size.
Z3_ast Z3_API Z3_mk_bvult(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned less than.
void Z3_API Z3_ast_map_dec_ref(Z3_context c, Z3_ast_map m)
Decrement the reference counter of the given AST map.
Z3_string Z3_API Z3_params_to_string(Z3_context c, Z3_params p)
Convert a parameter set into a string. This function is mainly used for printing the contents of a pa...
Z3_param_descrs Z3_API Z3_get_global_param_descrs(Z3_context c)
Retrieve description of global parameters.
Z3_func_decl Z3_API Z3_model_get_const_decl(Z3_context c, Z3_model m, unsigned i)
Return the i-th constant in the given model.
Z3_ast Z3_API Z3_mk_bvnand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise nand.
Z3_ast Z3_API Z3_translate(Z3_context source, Z3_ast a, Z3_context target)
Translate/Copy the AST a from context source to context target. AST a must have been created using co...
Z3_sort Z3_API Z3_get_range(Z3_context c, Z3_func_decl d)
Return the range of the given declaration.
void Z3_API Z3_global_param_set(Z3_string param_id, Z3_string param_value)
Set a global (or module) parameter. This setting is shared by all Z3 contexts.
Z3_ast_vector Z3_API Z3_model_get_sort_universe(Z3_context c, Z3_model m, Z3_sort s)
Return the finite set of distinct values that represent the interpretation for sort s.
void Z3_API Z3_func_entry_dec_ref(Z3_context c, Z3_func_entry e)
Decrement the reference counter of the given Z3_func_entry object.
unsigned Z3_API Z3_stats_size(Z3_context c, Z3_stats s)
Return the number of statistical data in s.
void Z3_API Z3_append_log(Z3_string string)
Append user-defined string to interaction log.
Z3_ast Z3_API Z3_get_quantifier_body(Z3_context c, Z3_ast a)
Return body of quantifier.
void Z3_API Z3_param_descrs_dec_ref(Z3_context c, Z3_param_descrs p)
Decrement the reference counter of the given parameter description set.
Z3_model Z3_API Z3_mk_model(Z3_context c)
Create a fresh model object. It has reference count 0.
Z3_symbol Z3_API Z3_get_decl_name(Z3_context c, Z3_func_decl d)
Return the constant declaration name as a symbol.
Z3_ast Z3_API Z3_mk_bvneg_no_overflow(Z3_context c, Z3_ast t1)
Check that bit-wise negation does not overflow when t1 is interpreted as a signed bit-vector.
Z3_string Z3_API Z3_stats_get_key(Z3_context c, Z3_stats s, unsigned idx)
Return the key (a string) for a particular statistical data.
Z3_ast Z3_API Z3_mk_bvand(Z3_context c, Z3_ast t1, Z3_ast t2)
Bitwise and.
Z3_ast_kind Z3_API Z3_get_ast_kind(Z3_context c, Z3_ast a)
Return the kind of the given AST.
Z3_ast Z3_API Z3_mk_bvsmod(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed remainder (sign follows divisor).
Z3_model Z3_API Z3_model_translate(Z3_context c, Z3_model m, Z3_context dst)
translate model from context c to context dst.
void Z3_API Z3_get_version(unsigned *major, unsigned *minor, unsigned *build_number, unsigned *revision_number)
Return Z3 version number information.
Z3_ast Z3_API Z3_mk_int2bv(Z3_context c, unsigned n, Z3_ast t1)
Create an n bit bit-vector from the integer argument t1.
void Z3_API Z3_solver_assert(Z3_context c, Z3_solver s, Z3_ast a)
Assert a constraint into the solver.
unsigned Z3_API Z3_ast_vector_size(Z3_context c, Z3_ast_vector v)
Return the size of the given AST vector.
unsigned Z3_API Z3_get_quantifier_weight(Z3_context c, Z3_ast a)
Obtain weight of quantifier.
bool Z3_API Z3_model_eval(Z3_context c, Z3_model m, Z3_ast t, bool model_completion, Z3_ast *v)
Evaluate the AST node t in the given model. Return true if succeeded, and store the result in v.
unsigned Z3_API Z3_solver_get_num_scopes(Z3_context c, Z3_solver s)
Return the number of backtracking points.
Z3_sort Z3_API Z3_get_array_sort_range(Z3_context c, Z3_sort t)
Return the range of the given array sort.
void Z3_API Z3_del_constructor_list(Z3_context c, Z3_constructor_list clist)
Reclaim memory allocated for constructor list.
Z3_ast Z3_API Z3_mk_bound(Z3_context c, unsigned index, Z3_sort ty)
Create a variable.
unsigned Z3_API Z3_get_app_num_args(Z3_context c, Z3_app a)
Return the number of argument of an application. If t is an constant, then the number of arguments is...
Z3_ast Z3_API Z3_func_entry_get_arg(Z3_context c, Z3_func_entry e, unsigned i)
Return an argument of a Z3_func_entry object.
Z3_ast Z3_API Z3_mk_eq(Z3_context c, Z3_ast l, Z3_ast r)
Create an AST node representing l = r.
void Z3_API Z3_ast_vector_inc_ref(Z3_context c, Z3_ast_vector v)
Increment the reference counter of the given AST vector.
unsigned Z3_API Z3_model_get_num_funcs(Z3_context c, Z3_model m)
Return the number of function interpretations in the given model.
void Z3_API Z3_dec_ref(Z3_context c, Z3_ast a)
Decrement the reference counter of the given AST. The context c should have been created using Z3_mk_...
Z3_ast_vector Z3_API Z3_mk_ast_vector(Z3_context c)
Return an empty AST vector.
Z3_ast Z3_API Z3_mk_empty_set(Z3_context c, Z3_sort domain)
Create the empty set.
Z3_ast Z3_API Z3_mk_repeat(Z3_context c, unsigned i, Z3_ast t1)
Repeat the given bit-vector up length i.
Z3_goal_prec Z3_API Z3_goal_precision(Z3_context c, Z3_goal g)
Return the "precision" of the given goal. Goals can be transformed using over and under approximation...
void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n)
Backtrack n backtracking points.
void Z3_API Z3_ast_map_erase(Z3_context c, Z3_ast_map m, Z3_ast k)
Erase a key from the map.
Z3_ast Z3_API Z3_mk_int2real(Z3_context c, Z3_ast t1)
Coerce an integer to a real.
unsigned Z3_API Z3_get_index_value(Z3_context c, Z3_ast a)
Return index of de-Bruijn bound variable.
Z3_goal Z3_API Z3_mk_goal(Z3_context c, bool models, bool unsat_cores, bool proofs)
Create a goal (aka problem). A goal is essentially a set of formulas, that can be solved and/or trans...
double Z3_API Z3_get_decl_double_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the double value associated with an double parameter.
unsigned Z3_API Z3_get_ast_hash(Z3_context c, Z3_ast a)
Return a hash code for the given AST. The hash code is structural but two different AST objects can m...
Z3_symbol Z3_API Z3_get_sort_name(Z3_context c, Z3_sort d)
Return the sort name as a symbol.
void Z3_API Z3_params_validate(Z3_context c, Z3_params p, Z3_param_descrs d)
Validate the parameter set p against the parameter description set d.
Z3_func_decl Z3_API Z3_get_datatype_sort_recognizer(Z3_context c, Z3_sort t, unsigned idx)
Return idx'th recognizer.
void Z3_API Z3_global_param_reset_all(void)
Restore the value of all global (and module) parameters. This command will not affect already created...
Z3_ast Z3_API Z3_mk_gt(Z3_context c, Z3_ast t1, Z3_ast t2)
Create greater than.
Z3_ast Z3_API Z3_mk_store(Z3_context c, Z3_ast a, Z3_ast i, Z3_ast v)
Array update.
Z3_string Z3_API Z3_get_decl_rational_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the rational value, as a string, associated with a rational parameter.
void Z3_API Z3_ast_vector_push(Z3_context c, Z3_ast_vector v, Z3_ast a)
Add the AST a in the end of the AST vector v. The size of v is increased by one.
bool Z3_API Z3_is_eq_ast(Z3_context c, Z3_ast t1, Z3_ast t2)
Compare terms.
bool Z3_API Z3_is_quantifier_forall(Z3_context c, Z3_ast a)
Determine if an ast is a universal quantifier.
Z3_ast_map Z3_API Z3_mk_ast_map(Z3_context c)
Return an empty mapping from AST to AST.
Z3_ast Z3_API Z3_mk_xor(Z3_context c, Z3_ast t1, Z3_ast t2)
Create an AST node representing t1 xor t2.
Z3_ast Z3_API Z3_mk_map(Z3_context c, Z3_func_decl f, unsigned n, Z3_ast const *args)
Map f on the argument arrays.
Z3_ast Z3_API Z3_mk_finite_set_singleton(Z3_context c, Z3_ast elem)
Create a singleton finite set.
Z3_ast Z3_API Z3_mk_const(Z3_context c, Z3_symbol s, Z3_sort ty)
Declare and create a constant.
Z3_symbol Z3_API Z3_mk_string_symbol(Z3_context c, Z3_string s)
Create a Z3 symbol using a C string.
void Z3_API Z3_param_descrs_inc_ref(Z3_context c, Z3_param_descrs p)
Increment the reference counter of the given parameter description set.
void Z3_API Z3_stats_dec_ref(Z3_context c, Z3_stats s)
Decrement the reference counter of the given statistics object.
Z3_ast Z3_API Z3_mk_array_ext(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Create array extensionality index given two arrays with the same sort. The meaning is given by the ax...
Z3_ast Z3_API Z3_mk_re_concat(Z3_context c, unsigned n, Z3_ast const args[])
Create the concatenation of the regular languages.
Z3_ast Z3_API Z3_sort_to_ast(Z3_context c, Z3_sort s)
Convert a Z3_sort into Z3_ast. This is just type casting.
Z3_func_entry Z3_API Z3_func_interp_get_entry(Z3_context c, Z3_func_interp f, unsigned i)
Return a "point" of the given function interpretation. It represents the value of f in a particular p...
Z3_func_decl Z3_API Z3_mk_rec_func_decl(Z3_context c, Z3_symbol s, unsigned domain_size, Z3_sort const domain[], Z3_sort range)
Declare a recursive function.
unsigned Z3_API Z3_get_ast_id(Z3_context c, Z3_ast t)
Return a unique identifier for t. The identifier is unique up to structural equality....
Z3_ast Z3_API Z3_mk_concat(Z3_context c, Z3_ast t1, Z3_ast t2)
Concatenate the given bit-vectors.
unsigned Z3_API Z3_get_quantifier_num_bound(Z3_context c, Z3_ast a)
Return number of bound variables of quantifier.
Z3_sort Z3_API Z3_get_decl_sort_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the sort value associated with a sort parameter.
Z3_constructor_list Z3_API Z3_mk_constructor_list(Z3_context c, unsigned num_constructors, Z3_constructor const constructors[])
Create list of constructors.
Z3_ast Z3_API Z3_mk_finite_set_map(Z3_context c, Z3_ast f, Z3_ast set)
Apply a function to all elements of a finite set.
Z3_ast Z3_API Z3_mk_app(Z3_context c, Z3_func_decl d, unsigned num_args, Z3_ast const args[])
Create a constant or function application.
Z3_sort_kind Z3_API Z3_get_sort_kind(Z3_context c, Z3_sort t)
Return the sort kind (e.g., array, tuple, int, bool, etc).
Z3_ast Z3_API Z3_mk_bvneg(Z3_context c, Z3_ast t1)
Standard two's complement unary minus.
Z3_ast Z3_API Z3_mk_store_n(Z3_context c, Z3_ast a, unsigned n, Z3_ast const *idxs, Z3_ast v)
n-ary Array update.
Z3_sort Z3_API Z3_get_domain(Z3_context c, Z3_func_decl d, unsigned i)
Return the sort of the i-th parameter of the given function declaration.
Z3_sort Z3_API Z3_mk_bool_sort(Z3_context c)
Create the Boolean type.
Z3_sort Z3_API Z3_mk_finite_set_sort(Z3_context c, Z3_sort elem_sort)
Create a finite set sort.
void Z3_API Z3_params_set_symbol(Z3_context c, Z3_params p, Z3_symbol k, Z3_symbol v)
Add a symbol parameter k with value v to the parameter set p.
Z3_ast Z3_API Z3_ast_vector_get(Z3_context c, Z3_ast_vector v, unsigned i)
Return the AST at position i in the AST vector v.
Z3_ast Z3_API Z3_mk_finite_set_size(Z3_context c, Z3_ast set)
Get the size (cardinality) of a finite set.
Z3_func_decl Z3_API Z3_to_func_decl(Z3_context c, Z3_ast a)
Convert an AST into a FUNC_DECL_AST. This is just type casting.
Z3_ast Z3_API Z3_mk_set_difference(Z3_context c, Z3_ast arg1, Z3_ast arg2)
Take the set difference between two sets.
Z3_ast Z3_API Z3_mk_bvsdiv(Z3_context c, Z3_ast t1, Z3_ast t2)
Two's complement signed division.
Z3_ast Z3_API Z3_mk_bvlshr(Z3_context c, Z3_ast t1, Z3_ast t2)
Logical shift right.
Z3_ast Z3_API Z3_get_decl_ast_parameter(Z3_context c, Z3_func_decl d, unsigned idx)
Return the expression value associated with an expression parameter.
Z3_ast Z3_API Z3_mk_finite_set_range(Z3_context c, Z3_ast low, Z3_ast high)
Create a finite set of integers in the range [low, high].
Z3_pattern Z3_API Z3_get_quantifier_pattern_ast(Z3_context c, Z3_ast a, unsigned i)
Return i'th pattern.
void Z3_API Z3_goal_dec_ref(Z3_context c, Z3_goal g)
Decrement the reference counter of the given goal.
Z3_ast Z3_API Z3_mk_not(Z3_context c, Z3_ast a)
Create an AST node representing not(a).
Z3_ast Z3_API Z3_mk_or(Z3_context c, unsigned num_args, Z3_ast const args[])
Create an AST node representing args[0] or ... or args[num_args-1].
Z3_sort Z3_API Z3_mk_array_sort(Z3_context c, Z3_sort domain, Z3_sort range)
Create an array type.
void Z3_API Z3_model_inc_ref(Z3_context c, Z3_model m)
Increment the reference counter of the given model.
Z3_ast Z3_API Z3_mk_seq_extract(Z3_context c, Z3_ast s, Z3_ast offset, Z3_ast length)
Extract subsequence starting at offset of length.
Z3_sort Z3_API Z3_mk_type_variable(Z3_context c, Z3_symbol s)
Create a type variable.
Z3_string Z3_API Z3_get_numeral_string(Z3_context c, Z3_ast a)
Return numeral value, as a decimal string of a numeric constant term.
void Z3_API Z3_func_interp_add_entry(Z3_context c, Z3_func_interp fi, Z3_ast_vector args, Z3_ast value)
add a function entry to a function interpretation.
Z3_ast Z3_API Z3_mk_bvuge(Z3_context c, Z3_ast t1, Z3_ast t2)
Unsigned greater than or equal to.
Z3_ast Z3_API Z3_mk_as_array(Z3_context c, Z3_func_decl f)
Create array with the same interpretation as a function. The array satisfies the property (f x) = (se...
Z3_string Z3_API Z3_get_numeral_binary_string(Z3_context c, Z3_ast a)
Return numeral value, as a binary string of a numeric constant term.
Z3_sort Z3_API Z3_get_quantifier_bound_sort(Z3_context c, Z3_ast a, unsigned i)
Return sort of the i'th bound variable.
void Z3_API Z3_disable_trace(Z3_string tag)
Disable tracing messages tagged as tag when Z3 is compiled in debug mode. It is a NOOP otherwise.
Z3_ast Z3_API Z3_goal_formula(Z3_context c, Z3_goal g, unsigned idx)
Return a formula from the given goal.
Z3_symbol Z3_API Z3_mk_int_symbol(Z3_context c, int i)
Create a Z3 symbol using an integer.
unsigned Z3_API Z3_func_interp_get_num_entries(Z3_context c, Z3_func_interp f)
Return the number of entries in the given function interpretation.
void Z3_API Z3_ast_map_insert(Z3_context c, Z3_ast_map m, Z3_ast k, Z3_ast v)
Store/Replace a new key, value pair in the given map.
Z3_constructor Z3_API Z3_mk_constructor(Z3_context c, Z3_symbol name, Z3_symbol recognizer, unsigned num_fields, Z3_symbol const field_names[], Z3_sort const sorts[], unsigned sort_refs[])
Create a constructor.
Z3_string Z3_API Z3_goal_to_string(Z3_context c, Z3_goal g)
Convert a goal into a string.
bool Z3_API Z3_is_eq_sort(Z3_context c, Z3_sort s1, Z3_sort s2)
compare sorts.
void Z3_API Z3_del_config(Z3_config c)
Delete the given configuration object.
double Z3_API Z3_get_numeral_double(Z3_context c, Z3_ast a)
Return numeral as a double.
void Z3_API Z3_inc_ref(Z3_context c, Z3_ast a)
Increment the reference counter of the given AST. The context c should have been created using Z3_mk_...
Z3_ast Z3_API Z3_mk_real2int(Z3_context c, Z3_ast t1)
Coerce a real to an integer.
Z3_func_interp Z3_API Z3_model_get_func_interp(Z3_context c, Z3_model m, Z3_func_decl f)
Return the interpretation of the function f in the model m. Return NULL, if the model does not assign...
void Z3_API Z3_solver_inc_ref(Z3_context c, Z3_solver s)
Increment the reference counter of the given solver.
Z3_symbol Z3_API Z3_get_quantifier_id(Z3_context c, Z3_ast a)
Obtain id of quantifier.
Z3_ast Z3_API Z3_mk_ext_rotate_right(Z3_context c, Z3_ast t1, Z3_ast t2)
Rotate bits of t1 to the right t2 times.
Z3_string Z3_API Z3_get_numeral_decimal_string(Z3_context c, Z3_ast a, unsigned precision)
Return numeral as a string in decimal notation. The result has at most precision decimal places.
Z3_sort Z3_API Z3_get_sort(Z3_context c, Z3_ast a)
Return the sort of an AST node.
Z3_func_decl Z3_API Z3_get_datatype_sort_constructor_accessor(Z3_context c, Z3_sort t, unsigned idx_c, unsigned idx_a)
Return idx_a'th accessor for the idx_c'th constructor.
Z3_ast Z3_API Z3_mk_bvredor(Z3_context c, Z3_ast t1)
Take disjunction of bits in vector, return vector of length 1.
void Z3_API Z3_ast_map_reset(Z3_context c, Z3_ast_map m)
Remove all keys from the given map.
void Z3_API Z3_solver_reset(Z3_context c, Z3_solver s)
Remove all assertions from the solver.
bool Z3_API Z3_is_algebraic_number(Z3_context c, Z3_ast a)
Return true if the given AST is a real algebraic number.
BitVecVal(val, bv, ctx=None)
_coerce_exprs(a, b, ctx=None)
_ctx_from_ast_args(*args)
_to_func_decl_ref(a, ctx)
_valid_accessor(acc)
Datatypes.
BitVec(name, bv, ctx=None)
RecAddDefinition(f, args, body)
DeclareTypeVar(name, ctx=None)
_z3_check_cint_overflow(n, name)
TupleSort(name, sorts, ctx=None)
_coerce_expr_list(alist, ctx=None)
RealVector(prefix, sz, ctx=None)
SortRef _sort(Context ctx, Any a)
ExprRef RealVar(int idx, ctx=None)
bool is_arith_sort(Any s)
BitVecs(names, bv, ctx=None)
_check_same_sort(a, b, ctx=None)
BoolVector(prefix, sz, ctx=None)
FreshConst(sort, prefix="c")
EnumSort(name, values, ctx=None)
CreatePolymorphicDatatype(d, type_params)
simplify(a, *arguments, **keywords)
Utils.
BV2Int(a, is_signed=False)
FreshInt(prefix="x", ctx=None)
_to_func_decl_array(args)
FiniteSetIntersect(s1, s2)
args2params(arguments, keywords, ctx=None)
Cond(p, t1, t2, ctx=None)
RealVarVector(int n, ctx=None)
bool eq(AstRef a, AstRef b)
FiniteSetRange(low, high)
FiniteSetMember(elem, set)
FiniteSetDifference(s1, s2)
FreshReal(prefix="b", ctx=None)
_reduce(func, sequence, initial)
ExprRef Var(int idx, SortRef s)
BVAddNoOverflow(a, b, signed)
FreshBool(prefix="b", ctx=None)
_ctx_from_ast_arg_list(args, default_ctx=None)
IntVector(prefix, sz, ctx=None)
DisjointSum(name, sorts, ctx=None)
Exists(vs, body, weight=1, qid="", skid="", patterns=[], no_patterns=[])
ForAll(vs, body, weight=1, qid="", skid="", patterns=[], no_patterns=[])
int _ast_kind(Context ctx, Any a)
DatatypeSort(name, params=None, ctx=None)
BVSubNoUnderflow(a, b, signed)
SortRef DeclareSort(name, ctx=None)
BVMulNoOverflow(a, b, signed)
_mk_quantifier(is_forall, vs, body, weight=1, qid="", skid="", patterns=[], no_patterns=[])