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 7542 of file z3py.py.

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 7548 of file z3py.py.

7548 def __init__(self, solver=None, ctx=None, logFile=None):
7549 assert solver is None or ctx is not None
7550 self.ctx = _get_ctx(ctx)
7551 self.backtrack_level = 4000000000
7552 self.solver = None
7553 if solver is None:
7554 self.solver = Z3_mk_solver(self.ctx.ref())
7555 else:
7556 self.solver = solver
7557 Z3_solver_inc_ref(self.ctx.ref(), self.solver)
7558 if logFile is not None:
7559 self.set("smtlib2_log", logFile)
7560
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 7561 of file z3py.py.

7561 def __del__(self):
7562 if self.solver is not None and self.ctx.ref() is not None and Z3_solver_dec_ref is not None:
7563 Z3_solver_dec_ref(self.ctx.ref(), self.solver)
7564
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 8042 of file z3py.py.

8042 def __copy__(self):
8043 return self.translate(self.ctx)
8044

◆ __deepcopy__()

__deepcopy__ (   self,
  memo = {} 
)

Definition at line 8045 of file z3py.py.

8045 def __deepcopy__(self, memo={}):
8046 return self.translate(self.ctx)
8047

◆ __enter__()

__enter__ (   self)

Definition at line 7565 of file z3py.py.

7565 def __enter__(self):
7566 self.push()
7567 return self
7568

◆ __exit__()

__exit__ (   self,
exc_info 
)

Definition at line 7569 of file z3py.py.

7569 def __exit__(self, *exc_info):
7570 self.pop()
7571

◆ __iadd__()

__iadd__ (   self,
  fml 
)

Definition at line 7691 of file z3py.py.

7691 def __iadd__(self, fml):
7692 self.add(fml)
7693 return self
7694

◆ __repr__()

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

Definition at line 8025 of file z3py.py.

8025 def __repr__(self):
8026 """Return a formatted string with all added constraints."""
8027 return obj_to_string(self)
8028

◆ 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 7680 of file z3py.py.

7680 def add(self, *args):
7681 """Assert constraints into the solver.
7682
7683 >>> x = Int('x')
7684 >>> s = Solver()
7685 >>> s.add(x > 0, x < 2)
7686 >>> s
7687 [x > 0, x < 2]
7688 """
7689 self.assert_exprs(*args)
7690

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 7695 of file z3py.py.

7695 def append(self, *args):
7696 """Assert constraints into the solver.
7697
7698 >>> x = Int('x')
7699 >>> s = Solver()
7700 >>> s.append(x > 0, x < 2)
7701 >>> s
7702 [x > 0, x < 2]
7703 """
7704 self.assert_exprs(*args)
7705

◆ 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 7717 of file z3py.py.

7717 def assert_and_track(self, a, p):
7718 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
7719
7720 If `p` is a string, it will be automatically converted into a Boolean constant.
7721
7722 >>> x = Int('x')
7723 >>> p3 = Bool('p3')
7724 >>> s = Solver()
7725 >>> s.set(unsat_core=True)
7726 >>> s.assert_and_track(x > 0, 'p1')
7727 >>> s.assert_and_track(x != 1, 'p2')
7728 >>> s.assert_and_track(x < 0, p3)
7729 >>> print(s.check())
7730 unsat
7731 >>> c = s.unsat_core()
7732 >>> len(c)
7733 2
7734 >>> Bool('p1') in c
7735 True
7736 >>> Bool('p2') in c
7737 False
7738 >>> p3 in c
7739 True
7740 """
7741 if isinstance(p, str):
7742 p = Bool(p, self.ctx)
7743 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
7744 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
7745 Z3_solver_assert_and_track(self.ctx.ref(), self.solver, a.as_ast(), p.as_ast())
7746
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 7661 of file z3py.py.

7661 def assert_exprs(self, *args):
7662 """Assert constraints into the solver.
7663
7664 >>> x = Int('x')
7665 >>> s = Solver()
7666 >>> s.assert_exprs(x > 0, x < 2)
7667 >>> s
7668 [x > 0, x < 2]
7669 """
7670 args = _get_args(args)
7671 s = BoolSort(self.ctx)
7672 for arg in args:
7673 if isinstance(arg, Goal) or isinstance(arg, AstVector):
7674 for f in arg:
7675 Z3_solver_assert(self.ctx.ref(), self.solver, f.as_ast())
7676 else:
7677 arg = s.cast(arg)
7678 Z3_solver_assert(self.ctx.ref(), self.solver, arg.as_ast())
7679
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 7942 of file z3py.py.

7942 def assertions(self):
7943 """Return an AST vector containing all added constraints.
7944
7945 >>> s = Solver()
7946 >>> s.assertions()
7947 []
7948 >>> a = Int('a')
7949 >>> s.add(a > 0)
7950 >>> s.add(a < 10)
7951 >>> s.assertions()
7952 [a > 0, a < 10]
7953 """
7954 return AstVector(Z3_solver_get_assertions(self.ctx.ref(), self.solver), self.ctx)
7955
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 7747 of file z3py.py.

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

7919 def congruence_explain(self, a, b):
7920 """Explain congruence of a and b relative to the current search state"""
7921 a = _py2expr(a, self.ctx)
7922 b = _py2expr(b, self.ctx)
7923 return _to_expr_ref(Z3_solver_congruence_explain(self.ctx.ref(), self.solver, a.ast, b.ast), self.ctx)
7924
7925
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 7911 of file z3py.py.

7911 def congruence_next(self, t):
7912 """Retrieve congruence closure sibling of the term t relative to the current search state
7913 The function primarily works for SimpleSolver. Terms and variables that are
7914 eliminated during pre-processing are not visible to the congruence closure.
7915 """
7916 t = _py2expr(t, self.ctx)
7917 return _to_expr_ref(Z3_solver_congruence_next(self.ctx.ref(), self.solver, t.ast), self.ctx)
7918
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 7903 of file z3py.py.

7903 def congruence_root(self, t):
7904 """Retrieve congruence closure root of the term t relative to the current search state
7905 The function primarily works for SimpleSolver. Terms and variables that are
7906 eliminated during pre-processing are not visible to the congruence closure.
7907 """
7908 t = _py2expr(t, self.ctx)
7909 return _to_expr_ref(Z3_solver_congruence_root(self.ctx.ref(), self.solver, t.ast), self.ctx)
7910
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 7838 of file z3py.py.

7838 def consequences(self, assumptions, variables):
7839 """Determine fixed values for the variables based on the solver state and assumptions.
7840 >>> s = Solver()
7841 >>> a, b, c, d = Bools('a b c d')
7842 >>> s.add(Implies(a,b), Implies(b, c))
7843 >>> s.consequences([a],[b,c,d])
7844 (sat, [Implies(a, b), Implies(a, c)])
7845 >>> s.consequences([Not(c),d],[a,b,c,d])
7846 (sat, [Implies(d, d), Implies(Not(c), Not(c)), Implies(Not(c), Not(b)), Implies(Not(c), Not(a))])
7847 """
7848 if isinstance(assumptions, list):
7849 _asms = AstVector(None, self.ctx)
7850 for a in assumptions:
7851 _asms.push(a)
7852 assumptions = _asms
7853 if isinstance(variables, list):
7854 _vars = AstVector(None, self.ctx)
7855 for a in variables:
7856 _vars.push(a)
7857 variables = _vars
7858 _z3_assert(isinstance(assumptions, AstVector), "ast vector expected")
7859 _z3_assert(isinstance(variables, AstVector), "ast vector expected")
7860 consequences = AstVector(None, self.ctx)
7861 r = Z3_solver_get_consequences(self.ctx.ref(), self.solver, assumptions.vector,
7862 variables.vector, consequences.vector)
7863 sz = len(consequences)
7864 consequences = [consequences[i] for i in range(sz)]
7865 return CheckSatResult(r), consequences
7866
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 7875 of file z3py.py.

7875 def cube(self, vars=None):
7876 """Get set of cubes
7877 The method takes an optional set of variables that restrict which
7878 variables may be used as a starting point for cubing.
7879 If vars is not None, then the first case split is based on a variable in
7880 this set.
7881 """
7882 self.cube_vs = AstVector(None, self.ctx)
7883 if vars is not None:
7884 for v in vars:
7885 self.cube_vs.push(v)
7886 while True:
7887 lvl = self.backtrack_level
7888 self.backtrack_level = 4000000000
7889 r = AstVector(Z3_solver_cube(self.ctx.ref(), self.solver, self.cube_vs.vector, lvl), self.ctx)
7890 if (len(r) == 1 and is_false(r[0])):
7891 return
7892 yield r
7893 if (len(r) == 0):
7894 return
7895
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 7896 of file z3py.py.

7896 def cube_vars(self):
7897 """Access the set of variables that were touched by the most recently generated cube.
7898 This set of variables can be used as a starting point for additional cubes.
7899 The idea is that variables that appear in clauses that are reduced by the most recent
7900 cube are likely more useful to cube on."""
7901 return self.cube_vs
7902

◆ dimacs()

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

Definition at line 8053 of file z3py.py.

8053 def dimacs(self, include_names=True):
8054 """Return a textual representation of the solver in DIMACS format."""
8055 return Z3_solver_to_dimacs_string(self.ctx.ref(), self.solver, include_names)
8056
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 7867 of file z3py.py.

7867 def from_file(self, filename):
7868 """Parse assertions from a file"""
7869 Z3_solver_from_file(self.ctx.ref(), self.solver, filename)
7870
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 7871 of file z3py.py.

7871 def from_string(self, s):
7872 """Parse assertions from a string"""
7873 Z3_solver_from_string(self.ctx.ref(), self.solver, s)
7874
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 8017 of file z3py.py.

8017 def help(self):
8018 """Display a string describing all available options."""
8019 print(Z3_solver_get_help(self.ctx.ref(), self.solver))
8020
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 7795 of file z3py.py.

7795 def import_model_converter(self, other):
7796 """Import model converter from other into the current solver"""
7797 Z3_solver_import_model_converter(self.ctx.ref(), other.solver, self.solver)
7798

◆ 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 7706 of file z3py.py.

7706 def insert(self, *args):
7707 """Assert constraints into the solver.
7708
7709 >>> x = Int('x')
7710 >>> s = Solver()
7711 >>> s.insert(x > 0, x < 2)
7712 >>> s
7713 [x > 0, x < 2]
7714 """
7715 self.assert_exprs(*args)
7716

◆ 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 7799 of file z3py.py.

7799 def interrupt(self):
7800 """Interrupt the execution of the solver object.
7801 Remarks: This ensures that the interrupt applies only
7802 to the given solver object and it applies only if it is running.
7803 """
7804 Z3_solver_interrupt(self.ctx.ref(), self.solver)
7805
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 7776 of file z3py.py.

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

7961 def non_units(self):
7962 """Return an AST vector containing all atomic formulas in solver state that are not units.
7963 """
7964 return AstVector(Z3_solver_get_non_units(self.ctx.ref(), self.solver), self.ctx)
7965
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 7629 of file z3py.py.

7629 def num_scopes(self):
7630 """Return the current number of backtracking points.
7631
7632 >>> s = Solver()
7633 >>> s.num_scopes()
7634 0
7635 >>> s.push()
7636 >>> s.num_scopes()
7637 1
7638 >>> s.push()
7639 >>> s.num_scopes()
7640 2
7641 >>> s.pop()
7642 >>> s.num_scopes()
7643 1
7644 """
7645 return Z3_solver_get_num_scopes(self.ctx.ref(), self.solver)
7646
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 8021 of file z3py.py.

8021 def param_descrs(self):
8022 """Return the parameter description set."""
8023 return ParamDescrsRef(Z3_solver_get_param_descrs(self.ctx.ref(), self.solver), self.ctx)
8024
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 7607 of file z3py.py.

7607 def pop(self, num=1):
7608 """Backtrack \\c num backtracking points.
7609
7610 >>> x = Int('x')
7611 >>> s = Solver()
7612 >>> s.add(x > 0)
7613 >>> s
7614 [x > 0]
7615 >>> s.push()
7616 >>> s.add(x < 1)
7617 >>> s
7618 [x > 0, x < 1]
7619 >>> s.check()
7620 unsat
7621 >>> s.pop()
7622 >>> s.check()
7623 sat
7624 >>> s
7625 [x > 0]
7626 """
7627 Z3_solver_pop(self.ctx.ref(), self.solver, num)
7628
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 7938 of file z3py.py.

7938 def proof(self):
7939 """Return a proof for the last `check()`. Proof construction must be enabled."""
7940 return _to_expr_ref(Z3_solver_get_proof(self.ctx.ref(), self.solver), self.ctx)
7941
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 7585 of file z3py.py.

7585 def push(self):
7586 """Create a backtracking point.
7587
7588 >>> x = Int('x')
7589 >>> s = Solver()
7590 >>> s.add(x > 0)
7591 >>> s
7592 [x > 0]
7593 >>> s.push()
7594 >>> s.add(x < 1)
7595 >>> s
7596 [x > 0, x < 1]
7597 >>> s.check()
7598 unsat
7599 >>> s.pop()
7600 >>> s.check()
7601 sat
7602 >>> s
7603 [x > 0]
7604 """
7605 Z3_solver_push(self.ctx.ref(), self.solver)
7606
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 8004 of file z3py.py.

8004 def reason_unknown(self):
8005 """Return a string describing why the last `check()` returned `unknown`.
8006
8007 >>> x = Int('x')
8008 >>> s = SimpleSolver()
8009 >>> s.add(x == 2**x)
8010 >>> s.check()
8011 unknown
8012 >>> s.reason_unknown()
8013 '(incomplete (theory arithmetic))'
8014 """
8015 return Z3_solver_get_reason_unknown(self.ctx.ref(), self.solver)
8016
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 7647 of file z3py.py.

7647 def reset(self):
7648 """Remove all asserted constraints and backtracking points created using `push()`.
7649
7650 >>> x = Int('x')
7651 >>> s = Solver()
7652 >>> s.add(x > 0)
7653 >>> s
7654 [x > 0]
7655 >>> s.reset()
7656 >>> s
7657 []
7658 """
7659 Z3_solver_reset(self.ctx.ref(), self.solver)
7660
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 7572 of file z3py.py.

7572 def set(self, *args, **keys):
7573 """Set a configuration option.
7574 The method `help()` return a string containing all available options.
7575
7576 >>> s = Solver()
7577 >>> # The option MBQI can be set using three different approaches.
7578 >>> s.set(mbqi=True)
7579 >>> s.set('MBQI', True)
7580 >>> s.set(':mbqi', True)
7581 """
7582 p = args2params(args, keys, self.ctx)
7583 Z3_solver_set_params(self.ctx.ref(), self.solver, p.params)
7584
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 7974 of file z3py.py.

7974 def set_initial_value(self, var, value):
7975 """initialize the solver's state by setting the initial value of var to value
7976 """
7977 s = var.sort()
7978 value = s.cast(value)
7979 Z3_solver_set_initial_value(self.ctx.ref(), self.solver, var.ast, value.ast)
7980
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 8048 of file z3py.py.

8048 def sexpr(self):
8049 """Return a formatted string (in Lisp-like format) with all added constraints.
8050 """
8051 return Z3_solver_to_string(self.ctx.ref(), self.solver)
8052
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 8075 of file z3py.py.

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

◆ solve_for()

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

Definition at line 7926 of file z3py.py.

7926 def solve_for(self, ts):
7927 """Retrieve a solution for t relative to linear equations maintained in the current state."""
7928 vars = AstVector(ctx=self.ctx);
7929 terms = AstVector(ctx=self.ctx);
7930 guards = AstVector(ctx=self.ctx);
7931 for t in ts:
7932 t = _py2expr(t, self.ctx)
7933 vars.push(t)
7934 Z3_solver_solve_for(self.ctx.ref(), self.solver, vars.vector, terms.vector, guards.vector)
7935 return [(vars[i], terms[i], guards[i]) for i in range(len(vars))]
7936
7937
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 7986 of file z3py.py.

7986 def statistics(self):
7987 """Return statistics for the last `check()`.
7988
7989 >>> s = SimpleSolver()
7990 >>> x = Int('x')
7991 >>> s.add(x > 0)
7992 >>> s.check()
7993 sat
7994 >>> st = s.statistics()
7995 >>> st.get_key_value('final checks')
7996 1
7997 >>> len(st) > 0
7998 True
7999 >>> st[0] != 0
8000 True
8001 """
8002 return Statistics(Z3_solver_get_statistics(self.ctx.ref(), self.solver), self.ctx)
8003
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 8057 of file z3py.py.

8057 def to_smt2(self):
8058 """return SMTLIB2 formatted benchmark for solver's assertions"""
8059 es = self.assertions()
8060 sz = len(es)
8061 sz1 = sz
8062 if sz1 > 0:
8063 sz1 -= 1
8064 v = (Ast * sz1)()
8065 for i in range(sz1):
8066 v[i] = es[i].as_ast()
8067 if sz > 0:
8068 e = es[sz1].as_ast()
8069 else:
8070 e = BoolVal(True, self.ctx).as_ast()
8072 self.ctx.ref(), "benchmark generated from python API", "", "unknown", "", sz1, v, e,
8073 )
8074
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 7981 of file z3py.py.

7981 def trail(self):
7982 """Return trail of the solver state after a check() call.
7983 """
7984 return AstVector(Z3_solver_get_trail(self.ctx.ref(), self.solver), self.ctx)
7985
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 7966 of file z3py.py.

7966 def trail_levels(self):
7967 """Return trail and decision levels of the solver state after a check() call.
7968 """
7969 trail = self.trail()
7970 levels = (ctypes.c_uint * len(trail))()
7971 Z3_solver_get_levels(self.ctx.ref(), self.solver, trail.vector, len(trail), levels)
7972 return trail, levels
7973
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 8029 of file z3py.py.

8029 def translate(self, target):
8030 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
8031
8032 >>> c1 = Context()
8033 >>> c2 = Context()
8034 >>> s1 = Solver(ctx=c1)
8035 >>> s2 = s1.translate(c2)
8036 """
8037 if z3_debug():
8038 _z3_assert(isinstance(target, Context), "argument must be a Z3 context")
8039 solver = Z3_solver_translate(self.ctx.ref(), self.solver, target.ref())
8040 return Solver(solver, target)
8041
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 7956 of file z3py.py.

7956 def units(self):
7957 """Return an AST vector containing all currently inferred units.
7958 """
7959 return AstVector(Z3_solver_get_units(self.ctx.ref(), self.solver), self.ctx)
7960
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 7806 of file z3py.py.

7806 def unsat_core(self):
7807 """Return a subset (as an AST vector) of the assumptions provided to the last check().
7808
7809 These are the assumptions Z3 used in the unsatisfiability proof.
7810 Assumptions are available in Z3. They are used to extract unsatisfiable cores.
7811 They may be also used to "retract" assumptions. Note that, assumptions are not really
7812 "soft constraints", but they can be used to implement them.
7813
7814 >>> p1, p2, p3 = Bools('p1 p2 p3')
7815 >>> x, y = Ints('x y')
7816 >>> s = Solver()
7817 >>> s.add(Implies(p1, x > 0))
7818 >>> s.add(Implies(p2, y > x))
7819 >>> s.add(Implies(p2, y < 1))
7820 >>> s.add(Implies(p3, y > -3))
7821 >>> s.check(p1, p2, p3)
7822 unsat
7823 >>> core = s.unsat_core()
7824 >>> len(core)
7825 2
7826 >>> p1 in core
7827 True
7828 >>> p2 in core
7829 True
7830 >>> p3 in core
7831 False
7832 >>> # "Retracting" p2
7833 >>> s.check(p1, p3)
7834 sat
7835 """
7836 return AstVector(Z3_solver_get_unsat_core(self.ctx.ref(), self.solver), self.ctx)
7837
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 7551 of file z3py.py.

◆ ctx

ctx

Definition at line 7550 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 7882 of file z3py.py.

◆ solver

solver