Z3
 
Loading...
Searching...
No Matches
Public Member Functions | Data Fields
Solver Class Reference
+ Inheritance diagram for Solver:

Public Member Functions

 __init__ (self, solver=None, ctx=None, logFile=None)
 
 __del__ (self)
 
 __enter__ (self)
 
 __exit__ (self, *exc_info)
 
 set (self, *args, **keys)
 
 push (self)
 
 pop (self, num=1)
 
 num_scopes (self)
 
 reset (self)
 
 assert_exprs (self, *args)
 
 add (self, *args)
 
 __iadd__ (self, fml)
 
 append (self, *args)
 
 insert (self, *args)
 
 assert_and_track (self, a, p)
 
 check (self, *assumptions)
 
 model (self)
 
 import_model_converter (self, other)
 
 interrupt (self)
 
 unsat_core (self)
 
 consequences (self, assumptions, variables)
 
 from_file (self, filename)
 
 from_string (self, s)
 
 cube (self, vars=None)
 
 cube_vars (self)
 
 congruence_root (self, t)
 
 congruence_next (self, t)
 
 congruence_explain (self, a, b)
 
 solve_for (self, ts)
 
 proof (self)
 
 assertions (self)
 
 units (self)
 
 non_units (self)
 
 trail_levels (self)
 
 set_initial_value (self, var, value)
 
 trail (self)
 
 statistics (self)
 
 reason_unknown (self)
 
 help (self)
 
 param_descrs (self)
 
 __repr__ (self)
 
 translate (self, target)
 
 __copy__ (self)
 
 __deepcopy__ (self, memo={})
 
 sexpr (self)
 
 dimacs (self, include_names=True)
 
 to_smt2 (self)
 
 solutions (self, t)
 
- Public Member Functions inherited from Z3PPObject
 use_pp (self)
 

Data Fields

 ctx
 
 backtrack_level
 
 solver
 
 cube_vs
 

Additional Inherited Members

- Protected Member Functions inherited from Z3PPObject
 _repr_html_ (self)
 

Detailed Description

Solver API provides methods for implementing the main SMT 2.0 commands:
push, pop, check, get-model, etc.

Definition at line 7548 of file z3py.py.

Constructor & Destructor Documentation

◆ __init__()

__init__ (   self,
  solver = None,
  ctx = None,
  logFile = None 
)

Definition at line 7554 of file z3py.py.

7554 def __init__(self, solver=None, ctx=None, logFile=None):
7555 assert solver is None or ctx is not None
7556 self.ctx = _get_ctx(ctx)
7557 self.backtrack_level = 4000000000
7558 self.solver = None
7559 if solver is None:
7560 self.solver = Z3_mk_solver(self.ctx.ref())
7561 else:
7562 self.solver = solver
7563 Z3_solver_inc_ref(self.ctx.ref(), self.solver)
7564 if logFile is not None:
7565 self.set("smtlib2_log", logFile)
7566
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 ...
void Z3_API Z3_solver_inc_ref(Z3_context c, Z3_solver s)
Increment the reference counter of the given solver.

◆ __del__()

__del__ (   self)

Definition at line 7567 of file z3py.py.

7567 def __del__(self):
7568 if self.solver is not None and self.ctx.ref() is not None and Z3_solver_dec_ref is not None:
7569 Z3_solver_dec_ref(self.ctx.ref(), self.solver)
7570
void Z3_API Z3_solver_dec_ref(Z3_context c, Z3_solver s)
Decrement the reference counter of the given solver.

Member Function Documentation

◆ __copy__()

__copy__ (   self)

Definition at line 8048 of file z3py.py.

8048 def __copy__(self):
8049 return self.translate(self.ctx)
8050

◆ __deepcopy__()

__deepcopy__ (   self,
  memo = {} 
)

Definition at line 8051 of file z3py.py.

8051 def __deepcopy__(self, memo={}):
8052 return self.translate(self.ctx)
8053

◆ __enter__()

__enter__ (   self)

Definition at line 7571 of file z3py.py.

7571 def __enter__(self):
7572 self.push()
7573 return self
7574

◆ __exit__()

__exit__ (   self,
*  exc_info 
)

Definition at line 7575 of file z3py.py.

7575 def __exit__(self, *exc_info):
7576 self.pop()
7577

◆ __iadd__()

__iadd__ (   self,
  fml 
)

Definition at line 7697 of file z3py.py.

7697 def __iadd__(self, fml):
7698 self.add(fml)
7699 return self
7700

◆ __repr__()

__repr__ (   self)
Return a formatted string with all added constraints.

Definition at line 8031 of file z3py.py.

8031 def __repr__(self):
8032 """Return a formatted string with all added constraints."""
8033 return obj_to_string(self)
8034

◆ add()

add (   self,
*  args 
)
Assert constraints into the solver.

>>> x = Int('x')
>>> s = Solver()
>>> s.add(x > 0, x < 2)
>>> s
[x > 0, x < 2]

Definition at line 7686 of file z3py.py.

7686 def add(self, *args):
7687 """Assert constraints into the solver.
7688
7689 >>> x = Int('x')
7690 >>> s = Solver()
7691 >>> s.add(x > 0, x < 2)
7692 >>> s
7693 [x > 0, x < 2]
7694 """
7695 self.assert_exprs(*args)
7696

Referenced by Solver.__iadd__().

◆ append()

append (   self,
*  args 
)
Assert constraints into the solver.

>>> x = Int('x')
>>> s = Solver()
>>> s.append(x > 0, x < 2)
>>> s
[x > 0, x < 2]

Definition at line 7701 of file z3py.py.

7701 def append(self, *args):
7702 """Assert constraints into the solver.
7703
7704 >>> x = Int('x')
7705 >>> s = Solver()
7706 >>> s.append(x > 0, x < 2)
7707 >>> s
7708 [x > 0, x < 2]
7709 """
7710 self.assert_exprs(*args)
7711

◆ assert_and_track()

assert_and_track (   self,
  a,
  p 
)
Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.

If `p` is a string, it will be automatically converted into a Boolean constant.

>>> x = Int('x')
>>> p3 = Bool('p3')
>>> s = Solver()
>>> s.set(unsat_core=True)
>>> s.assert_and_track(x > 0,  'p1')
>>> s.assert_and_track(x != 1, 'p2')
>>> s.assert_and_track(x < 0,  p3)
>>> print(s.check())
unsat
>>> c = s.unsat_core()
>>> len(c)
2
>>> Bool('p1') in c
True
>>> Bool('p2') in c
False
>>> p3 in c
True

Definition at line 7723 of file z3py.py.

7723 def assert_and_track(self, a, p):
7724 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
7725
7726 If `p` is a string, it will be automatically converted into a Boolean constant.
7727
7728 >>> x = Int('x')
7729 >>> p3 = Bool('p3')
7730 >>> s = Solver()
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())
7736 unsat
7737 >>> c = s.unsat_core()
7738 >>> len(c)
7739 2
7740 >>> Bool('p1') in c
7741 True
7742 >>> Bool('p2') in c
7743 False
7744 >>> p3 in c
7745 True
7746 """
7747 if isinstance(p, str):
7748 p = Bool(p, self.ctx)
7749 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
7750 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
7751 Z3_solver_assert_and_track(self.ctx.ref(), self.solver, a.as_ast(), p.as_ast())
7752
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.

◆ assert_exprs()

assert_exprs (   self,
*  args 
)
Assert constraints into the solver.

>>> x = Int('x')
>>> s = Solver()
>>> s.assert_exprs(x > 0, x < 2)
>>> s
[x > 0, x < 2]

Definition at line 7667 of file z3py.py.

7667 def assert_exprs(self, *args):
7668 """Assert constraints into the solver.
7669
7670 >>> x = Int('x')
7671 >>> s = Solver()
7672 >>> s.assert_exprs(x > 0, x < 2)
7673 >>> s
7674 [x > 0, x < 2]
7675 """
7676 args = _get_args(args)
7677 s = BoolSort(self.ctx)
7678 for arg in args:
7679 if isinstance(arg, Goal) or isinstance(arg, AstVector):
7680 for f in arg:
7681 Z3_solver_assert(self.ctx.ref(), self.solver, f.as_ast())
7682 else:
7683 arg = s.cast(arg)
7684 Z3_solver_assert(self.ctx.ref(), self.solver, arg.as_ast())
7685
void Z3_API Z3_solver_assert(Z3_context c, Z3_solver s, Z3_ast a)
Assert a constraint into the solver.

Referenced by Goal.add(), Solver.add(), Goal.append(), Solver.append(), Goal.insert(), and Solver.insert().

◆ assertions()

assertions (   self)
Return an AST vector containing all added constraints.

>>> s = Solver()
>>> s.assertions()
[]
>>> a = Int('a')
>>> s.add(a > 0)
>>> s.add(a < 10)
>>> s.assertions()
[a > 0, a < 10]

Definition at line 7948 of file z3py.py.

7948 def assertions(self):
7949 """Return an AST vector containing all added constraints.
7950
7951 >>> s = Solver()
7952 >>> s.assertions()
7953 []
7954 >>> a = Int('a')
7955 >>> s.add(a > 0)
7956 >>> s.add(a < 10)
7957 >>> s.assertions()
7958 [a > 0, a < 10]
7959 """
7960 return AstVector(Z3_solver_get_assertions(self.ctx.ref(), self.solver), self.ctx)
7961
Z3_ast_vector Z3_API Z3_solver_get_assertions(Z3_context c, Z3_solver s)
Return the set of asserted formulas on the solver.

◆ check()

check (   self,
*  assumptions 
)
Check whether the assertions in the given solver plus the optional assumptions are consistent or not.

>>> x = Int('x')
>>> s = Solver()
>>> s.check()
sat
>>> s.add(x > 0, x < 2)
>>> s.check()
sat
>>> s.model().eval(x)
1
>>> s.add(x < 1)
>>> s.check()
unsat
>>> s.reset()
>>> s.add(2**x == 4)
>>> s.check()
sat

Definition at line 7753 of file z3py.py.

7753 def check(self, *assumptions):
7754 """Check whether the assertions in the given solver plus the optional assumptions are consistent or not.
7755
7756 >>> x = Int('x')
7757 >>> s = Solver()
7758 >>> s.check()
7759 sat
7760 >>> s.add(x > 0, x < 2)
7761 >>> s.check()
7762 sat
7763 >>> s.model().eval(x)
7764 1
7765 >>> s.add(x < 1)
7766 >>> s.check()
7767 unsat
7768 >>> s.reset()
7769 >>> s.add(2**x == 4)
7770 >>> s.check()
7771 sat
7772 """
7773 s = BoolSort(self.ctx)
7774 assumptions = _get_args(assumptions)
7775 num = len(assumptions)
7776 _assumptions = (Ast * num)()
7777 for i in range(num):
7778 _assumptions[i] = s.cast(assumptions[i]).as_ast()
7779 r = Z3_solver_check_assumptions(self.ctx.ref(), self.solver, num, _assumptions)
7780 return CheckSatResult(r)
7781
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.

◆ congruence_explain()

congruence_explain (   self,
  a,
  b 
)
Explain congruence of a and b relative to the current search state

Definition at line 7925 of file z3py.py.

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)
7930
7931
Z3_ast Z3_API Z3_solver_congruence_explain(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast b)
retrieve explanation for congruence.

◆ congruence_next()

congruence_next (   self,
  t 
)
Retrieve congruence closure sibling of the term t relative to the current search state
The function primarily works for SimpleSolver. Terms and variables that are
eliminated during pre-processing are not visible to the congruence closure.

Definition at line 7917 of file z3py.py.

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.
7921 """
7922 t = _py2expr(t, self.ctx)
7923 return _to_expr_ref(Z3_solver_congruence_next(self.ctx.ref(), self.solver, t.ast), self.ctx)
7924
Z3_ast Z3_API Z3_solver_congruence_next(Z3_context c, Z3_solver s, Z3_ast a)
retrieve the next expression in the congruence class. The set of congruent siblings form a cyclic lis...

◆ congruence_root()

congruence_root (   self,
  t 
)
Retrieve congruence closure root of the term t relative to the current search state
The function primarily works for SimpleSolver. Terms and variables that are
eliminated during pre-processing are not visible to the congruence closure.

Definition at line 7909 of file z3py.py.

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.
7913 """
7914 t = _py2expr(t, self.ctx)
7915 return _to_expr_ref(Z3_solver_congruence_root(self.ctx.ref(), self.solver, t.ast), self.ctx)
7916
Z3_ast Z3_API Z3_solver_congruence_root(Z3_context c, Z3_solver s, Z3_ast a)
retrieve the congruence closure root of an expression. The root is retrieved relative to the state wh...

◆ consequences()

consequences (   self,
  assumptions,
  variables 
)
Determine fixed values for the variables based on the solver state and assumptions.
>>> s = Solver()
>>> a, b, c, d = Bools('a b c d')
>>> s.add(Implies(a,b), Implies(b, c))
>>> s.consequences([a],[b,c,d])
(sat, [Implies(a, b), Implies(a, c)])
>>> s.consequences([Not(c),d],[a,b,c,d])
(sat, [Implies(d, d), Implies(Not(c), Not(c)), Implies(Not(c), Not(b)), Implies(Not(c), Not(a))])

Definition at line 7844 of file z3py.py.

7844 def consequences(self, assumptions, variables):
7845 """Determine fixed values for the variables based on the solver state and assumptions.
7846 >>> s = Solver()
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))])
7853 """
7854 if isinstance(assumptions, list):
7855 _asms = AstVector(None, self.ctx)
7856 for a in assumptions:
7857 _asms.push(a)
7858 assumptions = _asms
7859 if isinstance(variables, list):
7860 _vars = AstVector(None, self.ctx)
7861 for a in variables:
7862 _vars.push(a)
7863 variables = _vars
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
7872
Z3_lbool Z3_API Z3_solver_get_consequences(Z3_context c, Z3_solver s, Z3_ast_vector assumptions, Z3_ast_vector variables, Z3_ast_vector consequences)
retrieve consequences from solver that determine values of the supplied function symbols.

◆ cube()

cube (   self,
  vars = None 
)
Get set of cubes
The method takes an optional set of variables that restrict which
variables may be used as a starting point for cubing.
If vars is not None, then the first case split is based on a variable in
this set.

Definition at line 7881 of file z3py.py.

7881 def cube(self, vars=None):
7882 """Get set of cubes
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
7886 this set.
7887 """
7888 self.cube_vs = AstVector(None, self.ctx)
7889 if vars is not None:
7890 for v in vars:
7891 self.cube_vs.push(v)
7892 while True:
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])):
7897 return
7898 yield r
7899 if (len(r) == 0):
7900 return
7901
Z3_ast_vector Z3_API Z3_solver_cube(Z3_context c, Z3_solver s, Z3_ast_vector vars, unsigned backtrack_level)
extract a next cube for a solver. The last cube is the constant true or false. The number of (non-con...

◆ cube_vars()

cube_vars (   self)
Access the set of variables that were touched by the most recently generated cube.
This set of variables can be used as a starting point for additional cubes.
The idea is that variables that appear in clauses that are reduced by the most recent
cube are likely more useful to cube on.

Definition at line 7902 of file z3py.py.

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."""
7907 return self.cube_vs
7908

◆ dimacs()

dimacs (   self,
  include_names = True 
)
Return a textual representation of the solver in DIMACS format.

Definition at line 8059 of file z3py.py.

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)
8062
Z3_string Z3_API Z3_solver_to_dimacs_string(Z3_context c, Z3_solver s, bool include_names)
Convert a solver into a DIMACS formatted string.

◆ from_file()

from_file (   self,
  filename 
)
Parse assertions from a file

Definition at line 7873 of file z3py.py.

7873 def from_file(self, filename):
7874 """Parse assertions from a file"""
7875 Z3_solver_from_file(self.ctx.ref(), self.solver, filename)
7876
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name)
load solver assertions from a file.

◆ from_string()

from_string (   self,
  s 
)
Parse assertions from a string

Definition at line 7877 of file z3py.py.

7877 def from_string(self, s):
7878 """Parse assertions from a string"""
7879 Z3_solver_from_string(self.ctx.ref(), self.solver, s)
7880
void Z3_API Z3_solver_from_string(Z3_context c, Z3_solver s, Z3_string str)
load solver assertions from a string.

◆ help()

help (   self)
Display a string describing all available options.

Definition at line 8023 of file z3py.py.

8023 def help(self):
8024 """Display a string describing all available options."""
8025 print(Z3_solver_get_help(self.ctx.ref(), self.solver))
8026
Z3_string Z3_API Z3_solver_get_help(Z3_context c, Z3_solver s)
Return a string describing all solver available parameters.

◆ import_model_converter()

import_model_converter (   self,
  other 
)
Import model converter from other into the current solver

Definition at line 7801 of file z3py.py.

7801 def import_model_converter(self, other):
7802 """Import model converter from other into the current solver"""
7803 Z3_solver_import_model_converter(self.ctx.ref(), other.solver, self.solver)
7804

◆ insert()

insert (   self,
*  args 
)
Assert constraints into the solver.

>>> x = Int('x')
>>> s = Solver()
>>> s.insert(x > 0, x < 2)
>>> s
[x > 0, x < 2]

Definition at line 7712 of file z3py.py.

7712 def insert(self, *args):
7713 """Assert constraints into the solver.
7714
7715 >>> x = Int('x')
7716 >>> s = Solver()
7717 >>> s.insert(x > 0, x < 2)
7718 >>> s
7719 [x > 0, x < 2]
7720 """
7721 self.assert_exprs(*args)
7722

◆ interrupt()

interrupt (   self)
Interrupt the execution of the solver object.
Remarks: This ensures that the interrupt applies only
to the given solver object and it applies only if it is running.

Definition at line 7805 of file z3py.py.

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.
7809 """
7810 Z3_solver_interrupt(self.ctx.ref(), self.solver)
7811
void Z3_API Z3_solver_interrupt(Z3_context c, Z3_solver s)
Solver local interrupt. Normally you should use Z3_interrupt to cancel solvers because only one solve...

◆ model()

model (   self)
Return a model for the last `check()`.

This function raises an exception if
a model is not available (e.g., last `check()` returned unsat).

>>> s = Solver()
>>> a = Int('a')
>>> s.add(a + 2 == 0)
>>> s.check()
sat
>>> s.model()
[a = -2]

Definition at line 7782 of file z3py.py.

7782 def model(self):
7783 """Return a model for the last `check()`.
7784
7785 This function raises an exception if
7786 a model is not available (e.g., last `check()` returned unsat).
7787
7788 >>> s = Solver()
7789 >>> a = Int('a')
7790 >>> s.add(a + 2 == 0)
7791 >>> s.check()
7792 sat
7793 >>> s.model()
7794 [a = -2]
7795 """
7796 try:
7797 return ModelRef(Z3_solver_get_model(self.ctx.ref(), self.solver), self.ctx)
7798 except Z3Exception:
7799 raise Z3Exception("model is not available")
7800
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.

Referenced by ModelRef.__del__(), ModelRef.__getitem__(), ModelRef.__len__(), ModelRef.decls(), ModelRef.eval(), ModelRef.get_interp(), ModelRef.get_sort(), ModelRef.get_universe(), ModelRef.num_sorts(), ModelRef.project(), ModelRef.project_with_witness(), ModelRef.sexpr(), ModelRef.translate(), and ModelRef.update_value().

◆ non_units()

non_units (   self)
Return an AST vector containing all atomic formulas in solver state that are not units.

Definition at line 7967 of file z3py.py.

7967 def non_units(self):
7968 """Return an AST vector containing all atomic formulas in solver state that are not units.
7969 """
7970 return AstVector(Z3_solver_get_non_units(self.ctx.ref(), self.solver), self.ctx)
7971
Z3_ast_vector Z3_API Z3_solver_get_non_units(Z3_context c, Z3_solver s)
Return the set of non units in the solver state.

◆ num_scopes()

num_scopes (   self)
Return the current number of backtracking points.

>>> s = Solver()
>>> s.num_scopes()
0
>>> s.push()
>>> s.num_scopes()
1
>>> s.push()
>>> s.num_scopes()
2
>>> s.pop()
>>> s.num_scopes()
1

Definition at line 7635 of file z3py.py.

7635 def num_scopes(self):
7636 """Return the current number of backtracking points.
7637
7638 >>> s = Solver()
7639 >>> s.num_scopes()
7640 0
7641 >>> s.push()
7642 >>> s.num_scopes()
7643 1
7644 >>> s.push()
7645 >>> s.num_scopes()
7646 2
7647 >>> s.pop()
7648 >>> s.num_scopes()
7649 1
7650 """
7651 return Z3_solver_get_num_scopes(self.ctx.ref(), self.solver)
7652
unsigned Z3_API Z3_solver_get_num_scopes(Z3_context c, Z3_solver s)
Return the number of backtracking points.

◆ param_descrs()

param_descrs (   self)
Return the parameter description set.

Definition at line 8027 of file z3py.py.

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)
8030
Z3_param_descrs Z3_API Z3_solver_get_param_descrs(Z3_context c, Z3_solver s)
Return the parameter description set for the given solver object.

◆ pop()

pop (   self,
  num = 1 
)
Backtrack \\c num backtracking points.

>>> x = Int('x')
>>> s = Solver()
>>> s.add(x > 0)
>>> s
[x > 0]
>>> s.push()
>>> s.add(x < 1)
>>> s
[x > 0, x < 1]
>>> s.check()
unsat
>>> s.pop()
>>> s.check()
sat
>>> s
[x > 0]

Definition at line 7613 of file z3py.py.

7613 def pop(self, num=1):
7614 """Backtrack \\c num backtracking points.
7615
7616 >>> x = Int('x')
7617 >>> s = Solver()
7618 >>> s.add(x > 0)
7619 >>> s
7620 [x > 0]
7621 >>> s.push()
7622 >>> s.add(x < 1)
7623 >>> s
7624 [x > 0, x < 1]
7625 >>> s.check()
7626 unsat
7627 >>> s.pop()
7628 >>> s.check()
7629 sat
7630 >>> s
7631 [x > 0]
7632 """
7633 Z3_solver_pop(self.ctx.ref(), self.solver, num)
7634
void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n)
Backtrack n backtracking points.

Referenced by Solver.__exit__().

◆ proof()

proof (   self)
Return a proof for the last `check()`. Proof construction must be enabled.

Definition at line 7944 of file z3py.py.

7944 def proof(self):
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)
7947
Z3_ast Z3_API Z3_solver_get_proof(Z3_context c, Z3_solver s)
Retrieve the proof for the last Z3_solver_check or Z3_solver_check_assumptions.

◆ push()

push (   self)
Create a backtracking point.

>>> x = Int('x')
>>> s = Solver()
>>> s.add(x > 0)
>>> s
[x > 0]
>>> s.push()
>>> s.add(x < 1)
>>> s
[x > 0, x < 1]
>>> s.check()
unsat
>>> s.pop()
>>> s.check()
sat
>>> s
[x > 0]

Definition at line 7591 of file z3py.py.

7591 def push(self):
7592 """Create a backtracking point.
7593
7594 >>> x = Int('x')
7595 >>> s = Solver()
7596 >>> s.add(x > 0)
7597 >>> s
7598 [x > 0]
7599 >>> s.push()
7600 >>> s.add(x < 1)
7601 >>> s
7602 [x > 0, x < 1]
7603 >>> s.check()
7604 unsat
7605 >>> s.pop()
7606 >>> s.check()
7607 sat
7608 >>> s
7609 [x > 0]
7610 """
7611 Z3_solver_push(self.ctx.ref(), self.solver)
7612
void Z3_API Z3_solver_push(Z3_context c, Z3_solver s)
Create a backtracking point.

Referenced by Solver.__enter__().

◆ reason_unknown()

reason_unknown (   self)
Return a string describing why the last `check()` returned `unknown`.

>>> x = Int('x')
>>> s = SimpleSolver()
>>> s.add(x == 2**x)
>>> s.check()
unknown
>>> s.reason_unknown()
'(incomplete (theory arithmetic))'

Definition at line 8010 of file z3py.py.

8010 def reason_unknown(self):
8011 """Return a string describing why the last `check()` returned `unknown`.
8012
8013 >>> x = Int('x')
8014 >>> s = SimpleSolver()
8015 >>> s.add(x == 2**x)
8016 >>> s.check()
8017 unknown
8018 >>> s.reason_unknown()
8019 '(incomplete (theory arithmetic))'
8020 """
8021 return Z3_solver_get_reason_unknown(self.ctx.ref(), self.solver)
8022
Z3_string Z3_API Z3_solver_get_reason_unknown(Z3_context c, Z3_solver s)
Return a brief justification for an "unknown" result (i.e., Z3_L_UNDEF) for the commands Z3_solver_ch...

◆ reset()

reset (   self)
Remove all asserted constraints and backtracking points created using `push()`.

>>> x = Int('x')
>>> s = Solver()
>>> s.add(x > 0)
>>> s
[x > 0]
>>> s.reset()
>>> s
[]

Definition at line 7653 of file z3py.py.

7653 def reset(self):
7654 """Remove all asserted constraints and backtracking points created using `push()`.
7655
7656 >>> x = Int('x')
7657 >>> s = Solver()
7658 >>> s.add(x > 0)
7659 >>> s
7660 [x > 0]
7661 >>> s.reset()
7662 >>> s
7663 []
7664 """
7665 Z3_solver_reset(self.ctx.ref(), self.solver)
7666
void Z3_API Z3_solver_reset(Z3_context c, Z3_solver s)
Remove all assertions from the solver.

◆ set()

set (   self,
*  args,
**  keys 
)
Set a configuration option.
The method `help()` return a string containing all available options.

>>> s = Solver()
>>> # The option MBQI can be set using three different approaches.
>>> s.set(mbqi=True)
>>> s.set('MBQI', True)
>>> s.set(':mbqi', True)

Definition at line 7578 of file z3py.py.

7578 def set(self, *args, **keys):
7579 """Set a configuration option.
7580 The method `help()` return a string containing all available options.
7581
7582 >>> s = Solver()
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)
7587 """
7588 p = args2params(args, keys, self.ctx)
7589 Z3_solver_set_params(self.ctx.ref(), self.solver, p.params)
7590
void Z3_API Z3_solver_set_params(Z3_context c, Z3_solver s, Z3_params p)
Set the given solver using the given parameters.

◆ set_initial_value()

set_initial_value (   self,
  var,
  value 
)
initialize the solver's state by setting the initial value of var to value

Definition at line 7980 of file z3py.py.

7980 def set_initial_value(self, var, value):
7981 """initialize the solver's state by setting the initial value of var to value
7982 """
7983 s = var.sort()
7984 value = s.cast(value)
7985 Z3_solver_set_initial_value(self.ctx.ref(), self.solver, var.ast, value.ast)
7986
void Z3_API Z3_solver_set_initial_value(Z3_context c, Z3_solver s, Z3_ast v, Z3_ast val)
provide an initialization hint to the solver. The initialization hint is used to calibrate an initial...

◆ sexpr()

sexpr (   self)
Return a formatted string (in Lisp-like format) with all added constraints.

Definition at line 8054 of file z3py.py.

8054 def sexpr(self):
8055 """Return a formatted string (in Lisp-like format) with all added constraints.
8056 """
8057 return Z3_solver_to_string(self.ctx.ref(), self.solver)
8058
Z3_string Z3_API Z3_solver_to_string(Z3_context c, Z3_solver s)
Convert a solver into a string.

◆ solutions()

solutions (   self,
  t 
)
Returns an iterator over solutions that satisfy the constraints.

The parameter `t` is an expression whose values should be returned.

>>> s = Solver()
>>> x, y, z = Ints("x y z")
>>> s.add(x * x == 4)
>>> print(list(s.solutions(x)))
[-2, 2]
>>> s.reset()
>>> s.add(x >= 0, x < 10)
>>> print(list(s.solutions(x)))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s.reset()
>>> s.add(x >= 0, y < 10, y == 2*x)
>>> print(list(s.solutions([x, y])))
[[0, 0], [1, 2], [2, 4], [3, 6], [4, 8]]

Definition at line 8081 of file z3py.py.

8081 def solutions(self, t):
8082 """Returns an iterator over solutions that satisfy the constraints.
8083
8084 The parameter `t` is an expression whose values should be returned.
8085
8086 >>> s = Solver()
8087 >>> x, y, z = Ints("x y z")
8088 >>> s.add(x * x == 4)
8089 >>> print(list(s.solutions(x)))
8090 [-2, 2]
8091 >>> s.reset()
8092 >>> s.add(x >= 0, x < 10)
8093 >>> print(list(s.solutions(x)))
8094 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8095 >>> s.reset()
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]]
8099 """
8100 s = Solver()
8101 s.add(self.assertions())
8102 t = _get_args(t)
8103 if isinstance(t, (list, tuple)):
8104 while s.check() == sat:
8105 result = [s.model().eval(t_, model_completion=True) for t_ in t]
8106 yield result
8107 s.add(Or(t_ != result_ for t_, result_ in zip(t, result)))
8108 else:
8109 while s.check() == sat:
8110 result = s.model().eval(t, model_completion=True)
8111 yield result
8112 s.add(t != result)
8113
8114

◆ solve_for()

solve_for (   self,
  ts 
)
Retrieve a solution for t relative to linear equations maintained in the current state.

Definition at line 7932 of file z3py.py.

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);
7937 for t in ts:
7938 t = _py2expr(t, self.ctx)
7939 vars.push(t)
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))]
7942
7943
void Z3_API Z3_solver_solve_for(Z3_context c, Z3_solver s, Z3_ast_vector variables, Z3_ast_vector terms, Z3_ast_vector guards)
retrieve a 'solution' for variables as defined by equalities in maintained by solvers....

◆ statistics()

statistics (   self)
Return statistics for the last `check()`.

>>> s = SimpleSolver()
>>> x = Int('x')
>>> s.add(x > 0)
>>> s.check()
sat
>>> st = s.statistics()
>>> st.get_key_value('final checks')
1
>>> len(st) > 0
True
>>> st[0] != 0
True

Definition at line 7992 of file z3py.py.

7992 def statistics(self):
7993 """Return statistics for the last `check()`.
7994
7995 >>> s = SimpleSolver()
7996 >>> x = Int('x')
7997 >>> s.add(x > 0)
7998 >>> s.check()
7999 sat
8000 >>> st = s.statistics()
8001 >>> st.get_key_value('final checks')
8002 1
8003 >>> len(st) > 0
8004 True
8005 >>> st[0] != 0
8006 True
8007 """
8008 return Statistics(Z3_solver_get_statistics(self.ctx.ref(), self.solver), self.ctx)
8009
Z3_stats Z3_API Z3_solver_get_statistics(Z3_context c, Z3_solver s)
Return statistics for the given solver.

◆ to_smt2()

to_smt2 (   self)
return SMTLIB2 formatted benchmark for solver's assertions

Definition at line 8063 of file z3py.py.

8063 def to_smt2(self):
8064 """return SMTLIB2 formatted benchmark for solver's assertions"""
8065 es = self.assertions()
8066 sz = len(es)
8067 sz1 = sz
8068 if sz1 > 0:
8069 sz1 -= 1
8070 v = (Ast * sz1)()
8071 for i in range(sz1):
8072 v[i] = es[i].as_ast()
8073 if sz > 0:
8074 e = es[sz1].as_ast()
8075 else:
8076 e = BoolVal(True, self.ctx).as_ast()
8078 self.ctx.ref(), "benchmark generated from python API", "", "unknown", "", sz1, v, e,
8079 )
8080
Z3_string Z3_API Z3_benchmark_to_smtlib_string(Z3_context c, Z3_string name, Z3_string logic, Z3_string status, Z3_string attributes, unsigned num_assumptions, Z3_ast const assumptions[], Z3_ast formula)
Convert the given benchmark into SMT-LIB formatted string.

◆ trail()

trail (   self)
Return trail of the solver state after a check() call.

Definition at line 7987 of file z3py.py.

7987 def trail(self):
7988 """Return trail of the solver state after a check() call.
7989 """
7990 return AstVector(Z3_solver_get_trail(self.ctx.ref(), self.solver), self.ctx)
7991
Z3_ast_vector Z3_API Z3_solver_get_trail(Z3_context c, Z3_solver s)
Return the trail modulo model conversion, in order of decision level The decision level can be retrie...

◆ trail_levels()

trail_levels (   self)
Return trail and decision levels of the solver state after a check() call.

Definition at line 7972 of file z3py.py.

7972 def trail_levels(self):
7973 """Return trail and decision levels of the solver state after a check() call.
7974 """
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
7979
void Z3_API Z3_solver_get_levels(Z3_context c, Z3_solver s, Z3_ast_vector literals, unsigned sz, unsigned levels[])
retrieve the decision depth of Boolean literals (variables or their negations). Assumes a check-sat c...

◆ translate()

translate (   self,
  target 
)
Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.

>>> c1 = Context()
>>> c2 = Context()
>>> s1 = Solver(ctx=c1)
>>> s2 = s1.translate(c2)

Definition at line 8035 of file z3py.py.

8035 def translate(self, target):
8036 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
8037
8038 >>> c1 = Context()
8039 >>> c2 = Context()
8040 >>> s1 = Solver(ctx=c1)
8041 >>> s2 = s1.translate(c2)
8042 """
8043 if z3_debug():
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)
8047
Z3_solver Z3_API Z3_solver_translate(Z3_context source, Z3_solver s, Z3_context target)
Copy a solver s from the context source to the context target.

Referenced by AstRef.__copy__(), Goal.__copy__(), AstVector.__copy__(), FuncInterp.__copy__(), ModelRef.__copy__(), Goal.__deepcopy__(), AstVector.__deepcopy__(), FuncInterp.__deepcopy__(), and ModelRef.__deepcopy__().

◆ units()

units (   self)
Return an AST vector containing all currently inferred units.

Definition at line 7962 of file z3py.py.

7962 def units(self):
7963 """Return an AST vector containing all currently inferred units.
7964 """
7965 return AstVector(Z3_solver_get_units(self.ctx.ref(), self.solver), self.ctx)
7966
Z3_ast_vector Z3_API Z3_solver_get_units(Z3_context c, Z3_solver s)
Return the set of units modulo model conversion.

◆ unsat_core()

unsat_core (   self)
Return a subset (as an AST vector) of the assumptions provided to the last check().

These are the assumptions Z3 used in the unsatisfiability proof.
Assumptions are available in Z3. They are used to extract unsatisfiable cores.
They may be also used to "retract" assumptions. Note that, assumptions are not really
"soft constraints", but they can be used to implement them.

>>> p1, p2, p3 = Bools('p1 p2 p3')
>>> x, y       = Ints('x y')
>>> s          = Solver()
>>> s.add(Implies(p1, x > 0))
>>> s.add(Implies(p2, y > x))
>>> s.add(Implies(p2, y < 1))
>>> s.add(Implies(p3, y > -3))
>>> s.check(p1, p2, p3)
unsat
>>> core = s.unsat_core()
>>> len(core)
2
>>> p1 in core
True
>>> p2 in core
True
>>> p3 in core
False
>>> # "Retracting" p2
>>> s.check(p1, p3)
sat

Definition at line 7812 of file z3py.py.

7812 def unsat_core(self):
7813 """Return a subset (as an AST vector) of the assumptions provided to the last check().
7814
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.
7819
7820 >>> p1, p2, p3 = Bools('p1 p2 p3')
7821 >>> x, y = Ints('x y')
7822 >>> s = Solver()
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)
7828 unsat
7829 >>> core = s.unsat_core()
7830 >>> len(core)
7831 2
7832 >>> p1 in core
7833 True
7834 >>> p2 in core
7835 True
7836 >>> p3 in core
7837 False
7838 >>> # "Retracting" p2
7839 >>> s.check(p1, p3)
7840 sat
7841 """
7842 return AstVector(Z3_solver_get_unsat_core(self.ctx.ref(), self.solver), self.ctx)
7843
Z3_ast_vector Z3_API Z3_solver_get_unsat_core(Z3_context c, Z3_solver s)
Retrieve the unsat core for the last Z3_solver_check_assumptions The unsat core is a subset of the as...

Field Documentation

◆ backtrack_level

backtrack_level

Definition at line 7557 of file z3py.py.

◆ ctx

ctx

Definition at line 7556 of file z3py.py.

Referenced by ArithRef.__add__(), BitVecRef.__add__(), BitVecRef.__and__(), FuncDeclRef.__call__(), AstMap.__contains__(), AstRef.__copy__(), Goal.__copy__(), AstVector.__copy__(), FuncInterp.__copy__(), ModelRef.__copy__(), AstRef.__deepcopy__(), Datatype.__deepcopy__(), ParamsRef.__deepcopy__(), ParamDescrsRef.__deepcopy__(), Goal.__deepcopy__(), AstVector.__deepcopy__(), AstMap.__deepcopy__(), FuncEntry.__deepcopy__(), FuncInterp.__deepcopy__(), ModelRef.__deepcopy__(), Statistics.__deepcopy__(), Context.__del__(), AstRef.__del__(), ScopedConstructor.__del__(), ScopedConstructorList.__del__(), ParamsRef.__del__(), ParamDescrsRef.__del__(), Goal.__del__(), AstVector.__del__(), AstMap.__del__(), FuncEntry.__del__(), FuncInterp.__del__(), ModelRef.__del__(), Statistics.__del__(), Solver.__del__(), ArithRef.__div__(), BitVecRef.__div__(), ExprRef.__eq__(), ArithRef.__ge__(), BitVecRef.__ge__(), AstVector.__getitem__(), ModelRef.__getitem__(), Statistics.__getitem__(), AstMap.__getitem__(), ArithRef.__gt__(), BitVecRef.__gt__(), BitVecRef.__invert__(), ArithRef.__le__(), BitVecRef.__le__(), AstVector.__len__(), AstMap.__len__(), ModelRef.__len__(), Statistics.__len__(), BitVecRef.__lshift__(), ArithRef.__lt__(), BitVecRef.__lt__(), ArithRef.__mod__(), BitVecRef.__mod__(), BoolRef.__mul__(), ArithRef.__mul__(), BitVecRef.__mul__(), ExprRef.__ne__(), ArithRef.__neg__(), BitVecRef.__neg__(), BitVecRef.__or__(), ArithRef.__pow__(), ArithRef.__radd__(), BitVecRef.__radd__(), BitVecRef.__rand__(), ArithRef.__rdiv__(), BitVecRef.__rdiv__(), ParamsRef.__repr__(), ParamDescrsRef.__repr__(), AstMap.__repr__(), Statistics.__repr__(), BitVecRef.__rlshift__(), ArithRef.__rmod__(), BitVecRef.__rmod__(), ArithRef.__rmul__(), BitVecRef.__rmul__(), BitVecRef.__ror__(), ArithRef.__rpow__(), BitVecRef.__rrshift__(), BitVecRef.__rshift__(), ArithRef.__rsub__(), BitVecRef.__rsub__(), BitVecRef.__rxor__(), AstVector.__setitem__(), AstMap.__setitem__(), ArithRef.__sub__(), BitVecRef.__sub__(), BitVecRef.__xor__(), DatatypeSortRef.accessor(), ExprRef.arg(), FuncEntry.arg_value(), FuncInterp.arity(), Goal.as_expr(), Solver.assert_and_track(), Goal.assert_exprs(), Solver.assert_exprs(), QuantifierRef.body(), FiniteSetSortRef.cast(), Solver.check(), Goal.convert_model(), AstRef.ctx_ref(), ExprRef.decl(), ModelRef.decls(), ArrayRef.default(), RatNumRef.denominator(), Goal.depth(), Goal.dimacs(), FuncDeclRef.domain(), ArraySortRef.domain_n(), FuncInterp.else_value(), FuncInterp.entry(), AstMap.erase(), ModelRef.eval(), Goal.get(), ParamDescrsRef.get_documentation(), ModelRef.get_interp(), Statistics.get_key_value(), ParamDescrsRef.get_kind(), ParamDescrsRef.get_name(), ModelRef.get_sort(), ModelRef.get_universe(), Goal.inconsistent(), AstMap.keys(), Statistics.keys(), Solver.model(), SortRef.name(), QuantifierRef.no_pattern(), FuncEntry.num_args(), FuncInterp.num_entries(), Solver.num_scopes(), ModelRef.num_sorts(), FuncDeclRef.params(), QuantifierRef.pattern(), AlgebraicNumRef.poly(), Solver.pop(), Goal.prec(), ModelRef.project(), ModelRef.project_with_witness(), Solver.push(), AstVector.push(), QuantifierRef.qid(), FuncDeclRef.range(), ArraySortRef.range(), DatatypeSortRef.recognizer(), Context.ref(), AstMap.reset(), Solver.reset(), AstVector.resize(), Solver.set(), ParamsRef.set(), Goal.sexpr(), AstVector.sexpr(), ModelRef.sexpr(), ParamDescrsRef.size(), Goal.size(), QuantifierRef.skolem_id(), AstVector.translate(), AstRef.translate(), Goal.translate(), ModelRef.translate(), ExprRef.update(), DatatypeRef.update_field(), ParamsRef.validate(), FuncEntry.value(), QuantifierRef.var_name(), and QuantifierRef.var_sort().

◆ cube_vs

cube_vs

Definition at line 7888 of file z3py.py.

◆ solver

solver