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)
 
 root (self, t)
 
 next (self, t)
 
 explain_congruent (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)
 
- 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 7115 of file z3py.py.

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 7121 of file z3py.py.

7121 def __init__(self, solver=None, ctx=None, logFile=None):
7122 assert solver is None or ctx is not None
7123 self.ctx = _get_ctx(ctx)
7124 self.backtrack_level = 4000000000
7125 self.solver = None
7126 if solver is None:
7127 self.solver = Z3_mk_solver(self.ctx.ref())
7128 else:
7129 self.solver = solver
7130 Z3_solver_inc_ref(self.ctx.ref(), self.solver)
7131 if logFile is not None:
7132 self.set("smtlib2_log", logFile)
7133
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 7134 of file z3py.py.

7134 def __del__(self):
7135 if self.solver is not None and self.ctx.ref() is not None and Z3_solver_dec_ref is not None:
7136 Z3_solver_dec_ref(self.ctx.ref(), self.solver)
7137
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 7615 of file z3py.py.

7615 def __copy__(self):
7616 return self.translate(self.ctx)
7617

◆ __deepcopy__()

__deepcopy__ (   self,
  memo = {} 
)

Definition at line 7618 of file z3py.py.

7618 def __deepcopy__(self, memo={}):
7619 return self.translate(self.ctx)
7620

◆ __enter__()

__enter__ (   self)

Definition at line 7138 of file z3py.py.

7138 def __enter__(self):
7139 self.push()
7140 return self
7141

◆ __exit__()

__exit__ (   self,
exc_info 
)

Definition at line 7142 of file z3py.py.

7142 def __exit__(self, *exc_info):
7143 self.pop()
7144

◆ __iadd__()

__iadd__ (   self,
  fml 
)

Definition at line 7264 of file z3py.py.

7264 def __iadd__(self, fml):
7265 self.add(fml)
7266 return self
7267

◆ __repr__()

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

Definition at line 7598 of file z3py.py.

7598 def __repr__(self):
7599 """Return a formatted string with all added constraints."""
7600 return obj_to_string(self)
7601

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

7253 def add(self, *args):
7254 """Assert constraints into the solver.
7255
7256 >>> x = Int('x')
7257 >>> s = Solver()
7258 >>> s.add(x > 0, x < 2)
7259 >>> s
7260 [x > 0, x < 2]
7261 """
7262 self.assert_exprs(*args)
7263

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

7268 def append(self, *args):
7269 """Assert constraints into the solver.
7270
7271 >>> x = Int('x')
7272 >>> s = Solver()
7273 >>> s.append(x > 0, x < 2)
7274 >>> s
7275 [x > 0, x < 2]
7276 """
7277 self.assert_exprs(*args)
7278

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

7290 def assert_and_track(self, a, p):
7291 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
7292
7293 If `p` is a string, it will be automatically converted into a Boolean constant.
7294
7295 >>> x = Int('x')
7296 >>> p3 = Bool('p3')
7297 >>> s = Solver()
7298 >>> s.set(unsat_core=True)
7299 >>> s.assert_and_track(x > 0, 'p1')
7300 >>> s.assert_and_track(x != 1, 'p2')
7301 >>> s.assert_and_track(x < 0, p3)
7302 >>> print(s.check())
7303 unsat
7304 >>> c = s.unsat_core()
7305 >>> len(c)
7306 2
7307 >>> Bool('p1') in c
7308 True
7309 >>> Bool('p2') in c
7310 False
7311 >>> p3 in c
7312 True
7313 """
7314 if isinstance(p, str):
7315 p = Bool(p, self.ctx)
7316 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
7317 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
7318 Z3_solver_assert_and_track(self.ctx.ref(), self.solver, a.as_ast(), p.as_ast())
7319
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 7234 of file z3py.py.

7234 def assert_exprs(self, *args):
7235 """Assert constraints into the solver.
7236
7237 >>> x = Int('x')
7238 >>> s = Solver()
7239 >>> s.assert_exprs(x > 0, x < 2)
7240 >>> s
7241 [x > 0, x < 2]
7242 """
7243 args = _get_args(args)
7244 s = BoolSort(self.ctx)
7245 for arg in args:
7246 if isinstance(arg, Goal) or isinstance(arg, AstVector):
7247 for f in arg:
7248 Z3_solver_assert(self.ctx.ref(), self.solver, f.as_ast())
7249 else:
7250 arg = s.cast(arg)
7251 Z3_solver_assert(self.ctx.ref(), self.solver, arg.as_ast())
7252
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 7515 of file z3py.py.

7515 def assertions(self):
7516 """Return an AST vector containing all added constraints.
7517
7518 >>> s = Solver()
7519 >>> s.assertions()
7520 []
7521 >>> a = Int('a')
7522 >>> s.add(a > 0)
7523 >>> s.add(a < 10)
7524 >>> s.assertions()
7525 [a > 0, a < 10]
7526 """
7527 return AstVector(Z3_solver_get_assertions(self.ctx.ref(), self.solver), self.ctx)
7528
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 7320 of file z3py.py.

7320 def check(self, *assumptions):
7321 """Check whether the assertions in the given solver plus the optional assumptions are consistent or not.
7322
7323 >>> x = Int('x')
7324 >>> s = Solver()
7325 >>> s.check()
7326 sat
7327 >>> s.add(x > 0, x < 2)
7328 >>> s.check()
7329 sat
7330 >>> s.model().eval(x)
7331 1
7332 >>> s.add(x < 1)
7333 >>> s.check()
7334 unsat
7335 >>> s.reset()
7336 >>> s.add(2**x == 4)
7337 >>> s.check()
7338 sat
7339 """
7340 s = BoolSort(self.ctx)
7341 assumptions = _get_args(assumptions)
7342 num = len(assumptions)
7343 _assumptions = (Ast * num)()
7344 for i in range(num):
7345 _assumptions[i] = s.cast(assumptions[i]).as_ast()
7346 r = Z3_solver_check_assumptions(self.ctx.ref(), self.solver, num, _assumptions)
7347 return CheckSatResult(r)
7348
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.

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

7411 def consequences(self, assumptions, variables):
7412 """Determine fixed values for the variables based on the solver state and assumptions.
7413 >>> s = Solver()
7414 >>> a, b, c, d = Bools('a b c d')
7415 >>> s.add(Implies(a,b), Implies(b, c))
7416 >>> s.consequences([a],[b,c,d])
7417 (sat, [Implies(a, b), Implies(a, c)])
7418 >>> s.consequences([Not(c),d],[a,b,c,d])
7419 (sat, [Implies(d, d), Implies(Not(c), Not(c)), Implies(Not(c), Not(b)), Implies(Not(c), Not(a))])
7420 """
7421 if isinstance(assumptions, list):
7422 _asms = AstVector(None, self.ctx)
7423 for a in assumptions:
7424 _asms.push(a)
7425 assumptions = _asms
7426 if isinstance(variables, list):
7427 _vars = AstVector(None, self.ctx)
7428 for a in variables:
7429 _vars.push(a)
7430 variables = _vars
7431 _z3_assert(isinstance(assumptions, AstVector), "ast vector expected")
7432 _z3_assert(isinstance(variables, AstVector), "ast vector expected")
7433 consequences = AstVector(None, self.ctx)
7434 r = Z3_solver_get_consequences(self.ctx.ref(), self.solver, assumptions.vector,
7435 variables.vector, consequences.vector)
7436 sz = len(consequences)
7437 consequences = [consequences[i] for i in range(sz)]
7438 return CheckSatResult(r), consequences
7439
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 7448 of file z3py.py.

7448 def cube(self, vars=None):
7449 """Get set of cubes
7450 The method takes an optional set of variables that restrict which
7451 variables may be used as a starting point for cubing.
7452 If vars is not None, then the first case split is based on a variable in
7453 this set.
7454 """
7455 self.cube_vs = AstVector(None, self.ctx)
7456 if vars is not None:
7457 for v in vars:
7458 self.cube_vs.push(v)
7459 while True:
7460 lvl = self.backtrack_level
7461 self.backtrack_level = 4000000000
7462 r = AstVector(Z3_solver_cube(self.ctx.ref(), self.solver, self.cube_vs.vector, lvl), self.ctx)
7463 if (len(r) == 1 and is_false(r[0])):
7464 return
7465 yield r
7466 if (len(r) == 0):
7467 return
7468
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 7469 of file z3py.py.

7469 def cube_vars(self):
7470 """Access the set of variables that were touched by the most recently generated cube.
7471 This set of variables can be used as a starting point for additional cubes.
7472 The idea is that variables that appear in clauses that are reduced by the most recent
7473 cube are likely more useful to cube on."""
7474 return self.cube_vs
7475

◆ dimacs()

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

Definition at line 7633 of file z3py.py.

7633 def dimacs(self, include_names=True):
7634 """Return a textual representation of the solver in DIMACS format."""
7635 return Z3_solver_to_dimacs_string(self.ctx.ref(), self.solver, include_names)
7636
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.

◆ explain_congruent()

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

Definition at line 7492 of file z3py.py.

7492 def explain_congruent(self, a, b):
7493 """Explain congruence of a and b relative to the current search state"""
7494 a = _py2expr(a, self.ctx)
7495 b = _py2expr(b, self.ctx)
7496 return _to_expr_ref(Z3_solver_congruence_explain(self.ctx.ref(), self.solver, a.ast, b.ast), self.ctx)
7497
7498
Z3_ast Z3_API Z3_solver_congruence_explain(Z3_context c, Z3_solver s, Z3_ast a, Z3_ast b)
retrieve explanation for congruence.

◆ from_file()

from_file (   self,
  filename 
)
Parse assertions from a file

Definition at line 7440 of file z3py.py.

7440 def from_file(self, filename):
7441 """Parse assertions from a file"""
7442 Z3_solver_from_file(self.ctx.ref(), self.solver, filename)
7443
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 7444 of file z3py.py.

7444 def from_string(self, s):
7445 """Parse assertions from a string"""
7446 Z3_solver_from_string(self.ctx.ref(), self.solver, s)
7447
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 7590 of file z3py.py.

7590 def help(self):
7591 """Display a string describing all available options."""
7592 print(Z3_solver_get_help(self.ctx.ref(), self.solver))
7593
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 7368 of file z3py.py.

7368 def import_model_converter(self, other):
7369 """Import model converter from other into the current solver"""
7370 Z3_solver_import_model_converter(self.ctx.ref(), other.solver, self.solver)
7371

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

7279 def insert(self, *args):
7280 """Assert constraints into the solver.
7281
7282 >>> x = Int('x')
7283 >>> s = Solver()
7284 >>> s.insert(x > 0, x < 2)
7285 >>> s
7286 [x > 0, x < 2]
7287 """
7288 self.assert_exprs(*args)
7289

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

7372 def interrupt(self):
7373 """Interrupt the execution of the solver object.
7374 Remarks: This ensures that the interrupt applies only
7375 to the given solver object and it applies only if it is running.
7376 """
7377 Z3_solver_interrupt(self.ctx.ref(), self.solver)
7378
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 7349 of file z3py.py.

7349 def model(self):
7350 """Return a model for the last `check()`.
7351
7352 This function raises an exception if
7353 a model is not available (e.g., last `check()` returned unsat).
7354
7355 >>> s = Solver()
7356 >>> a = Int('a')
7357 >>> s.add(a + 2 == 0)
7358 >>> s.check()
7359 sat
7360 >>> s.model()
7361 [a = -2]
7362 """
7363 try:
7364 return ModelRef(Z3_solver_get_model(self.ctx.ref(), self.solver), self.ctx)
7365 except Z3Exception:
7366 raise Z3Exception("model is not available")
7367
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().

◆ next()

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

7484 def next(self, t):
7485 """Retrieve congruence closure sibling of the term t relative to the current search state
7486 The function primarily works for SimpleSolver. Terms and variables that are
7487 eliminated during pre-processing are not visible to the congruence closure.
7488 """
7489 t = _py2expr(t, self.ctx)
7490 return _to_expr_ref(Z3_solver_congruence_next(self.ctx.ref(), self.solver, t.ast), self.ctx)
7491
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...

◆ non_units()

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

Definition at line 7534 of file z3py.py.

7534 def non_units(self):
7535 """Return an AST vector containing all atomic formulas in solver state that are not units.
7536 """
7537 return AstVector(Z3_solver_get_non_units(self.ctx.ref(), self.solver), self.ctx)
7538
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 7202 of file z3py.py.

7202 def num_scopes(self):
7203 """Return the current number of backtracking points.
7204
7205 >>> s = Solver()
7206 >>> s.num_scopes()
7207 0
7208 >>> s.push()
7209 >>> s.num_scopes()
7210 1
7211 >>> s.push()
7212 >>> s.num_scopes()
7213 2
7214 >>> s.pop()
7215 >>> s.num_scopes()
7216 1
7217 """
7218 return Z3_solver_get_num_scopes(self.ctx.ref(), self.solver)
7219
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 7594 of file z3py.py.

7594 def param_descrs(self):
7595 """Return the parameter description set."""
7596 return ParamDescrsRef(Z3_solver_get_param_descrs(self.ctx.ref(), self.solver), self.ctx)
7597
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 7180 of file z3py.py.

7180 def pop(self, num=1):
7181 """Backtrack \\c num backtracking points.
7182
7183 >>> x = Int('x')
7184 >>> s = Solver()
7185 >>> s.add(x > 0)
7186 >>> s
7187 [x > 0]
7188 >>> s.push()
7189 >>> s.add(x < 1)
7190 >>> s
7191 [x > 0, x < 1]
7192 >>> s.check()
7193 unsat
7194 >>> s.pop()
7195 >>> s.check()
7196 sat
7197 >>> s
7198 [x > 0]
7199 """
7200 Z3_solver_pop(self.ctx.ref(), self.solver, num)
7201
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 7511 of file z3py.py.

7511 def proof(self):
7512 """Return a proof for the last `check()`. Proof construction must be enabled."""
7513 return _to_expr_ref(Z3_solver_get_proof(self.ctx.ref(), self.solver), self.ctx)
7514
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 7158 of file z3py.py.

7158 def push(self):
7159 """Create a backtracking point.
7160
7161 >>> x = Int('x')
7162 >>> s = Solver()
7163 >>> s.add(x > 0)
7164 >>> s
7165 [x > 0]
7166 >>> s.push()
7167 >>> s.add(x < 1)
7168 >>> s
7169 [x > 0, x < 1]
7170 >>> s.check()
7171 unsat
7172 >>> s.pop()
7173 >>> s.check()
7174 sat
7175 >>> s
7176 [x > 0]
7177 """
7178 Z3_solver_push(self.ctx.ref(), self.solver)
7179
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 7577 of file z3py.py.

7577 def reason_unknown(self):
7578 """Return a string describing why the last `check()` returned `unknown`.
7579
7580 >>> x = Int('x')
7581 >>> s = SimpleSolver()
7582 >>> s.add(x == 2**x)
7583 >>> s.check()
7584 unknown
7585 >>> s.reason_unknown()
7586 '(incomplete (theory arithmetic))'
7587 """
7588 return Z3_solver_get_reason_unknown(self.ctx.ref(), self.solver)
7589
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 7220 of file z3py.py.

7220 def reset(self):
7221 """Remove all asserted constraints and backtracking points created using `push()`.
7222
7223 >>> x = Int('x')
7224 >>> s = Solver()
7225 >>> s.add(x > 0)
7226 >>> s
7227 [x > 0]
7228 >>> s.reset()
7229 >>> s
7230 []
7231 """
7232 Z3_solver_reset(self.ctx.ref(), self.solver)
7233
void Z3_API Z3_solver_reset(Z3_context c, Z3_solver s)
Remove all assertions from the solver.

◆ root()

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

7476 def root(self, t):
7477 """Retrieve congruence closure root of the term t relative to the current search state
7478 The function primarily works for SimpleSolver. Terms and variables that are
7479 eliminated during pre-processing are not visible to the congruence closure.
7480 """
7481 t = _py2expr(t, self.ctx)
7482 return _to_expr_ref(Z3_solver_congruence_root(self.ctx.ref(), self.solver, t.ast), self.ctx)
7483
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...

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

7145 def set(self, *args, **keys):
7146 """Set a configuration option.
7147 The method `help()` return a string containing all available options.
7148
7149 >>> s = Solver()
7150 >>> # The option MBQI can be set using three different approaches.
7151 >>> s.set(mbqi=True)
7152 >>> s.set('MBQI', True)
7153 >>> s.set(':mbqi', True)
7154 """
7155 p = args2params(args, keys, self.ctx)
7156 Z3_solver_set_params(self.ctx.ref(), self.solver, p.params)
7157
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 7547 of file z3py.py.

7547 def set_initial_value(self, var, value):
7548 """initialize the solver's state by setting the initial value of var to value
7549 """
7550 s = var.sort()
7551 value = s.cast(value)
7552 Z3_solver_set_initial_value(self.ctx.ref(), self.solver, var.ast, value.ast)
7553
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.
We say the string is in s-expression format.

>>> x = Int('x')
>>> s = Solver()
>>> s.add(x > 0)
>>> s.add(x < 2)
>>> r = s.sexpr()

Definition at line 7621 of file z3py.py.

7621 def sexpr(self):
7622 """Return a formatted string (in Lisp-like format) with all added constraints.
7623 We say the string is in s-expression format.
7624
7625 >>> x = Int('x')
7626 >>> s = Solver()
7627 >>> s.add(x > 0)
7628 >>> s.add(x < 2)
7629 >>> r = s.sexpr()
7630 """
7631 return Z3_solver_to_string(self.ctx.ref(), self.solver)
7632
Z3_string Z3_API Z3_solver_to_string(Z3_context c, Z3_solver s)
Convert a solver into a string.

◆ solve_for()

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

Definition at line 7499 of file z3py.py.

7499 def solve_for(self, ts):
7500 """Retrieve a solution for t relative to linear equations maintained in the current state."""
7501 vars = AstVector(ctx=self.ctx);
7502 terms = AstVector(ctx=self.ctx);
7503 guards = AstVector(ctx=self.ctx);
7504 for t in ts:
7505 t = _py2expr(t, self.ctx)
7506 vars.push(t)
7507 Z3_solver_solve_for(self.ctx.ref(), self.solver, vars.vector, terms.vector, guards.vector)
7508 return [(vars[i], terms[i], guards[i]) for i in range(len(vars))]
7509
7510
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 7559 of file z3py.py.

7559 def statistics(self):
7560 """Return statistics for the last `check()`.
7561
7562 >>> s = SimpleSolver()
7563 >>> x = Int('x')
7564 >>> s.add(x > 0)
7565 >>> s.check()
7566 sat
7567 >>> st = s.statistics()
7568 >>> st.get_key_value('final checks')
7569 1
7570 >>> len(st) > 0
7571 True
7572 >>> st[0] != 0
7573 True
7574 """
7575 return Statistics(Z3_solver_get_statistics(self.ctx.ref(), self.solver), self.ctx)
7576
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 7637 of file z3py.py.

7637 def to_smt2(self):
7638 """return SMTLIB2 formatted benchmark for solver's assertions"""
7639 es = self.assertions()
7640 sz = len(es)
7641 sz1 = sz
7642 if sz1 > 0:
7643 sz1 -= 1
7644 v = (Ast * sz1)()
7645 for i in range(sz1):
7646 v[i] = es[i].as_ast()
7647 if sz > 0:
7648 e = es[sz1].as_ast()
7649 else:
7650 e = BoolVal(True, self.ctx).as_ast()
7652 self.ctx.ref(), "benchmark generated from python API", "", "unknown", "", sz1, v, e,
7653 )
7654
7655
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 7554 of file z3py.py.

7554 def trail(self):
7555 """Return trail of the solver state after a check() call.
7556 """
7557 return AstVector(Z3_solver_get_trail(self.ctx.ref(), self.solver), self.ctx)
7558
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 7539 of file z3py.py.

7539 def trail_levels(self):
7540 """Return trail and decision levels of the solver state after a check() call.
7541 """
7542 trail = self.trail()
7543 levels = (ctypes.c_uint * len(trail))()
7544 Z3_solver_get_levels(self.ctx.ref(), self.solver, trail.vector, len(trail), levels)
7545 return trail, levels
7546
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 7602 of file z3py.py.

7602 def translate(self, target):
7603 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
7604
7605 >>> c1 = Context()
7606 >>> c2 = Context()
7607 >>> s1 = Solver(ctx=c1)
7608 >>> s2 = s1.translate(c2)
7609 """
7610 if z3_debug():
7611 _z3_assert(isinstance(target, Context), "argument must be a Z3 context")
7612 solver = Z3_solver_translate(self.ctx.ref(), self.solver, target.ref())
7613 return Solver(solver, target)
7614
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 7529 of file z3py.py.

7529 def units(self):
7530 """Return an AST vector containing all currently inferred units.
7531 """
7532 return AstVector(Z3_solver_get_units(self.ctx.ref(), self.solver), self.ctx)
7533
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 7379 of file z3py.py.

7379 def unsat_core(self):
7380 """Return a subset (as an AST vector) of the assumptions provided to the last check().
7381
7382 These are the assumptions Z3 used in the unsatisfiability proof.
7383 Assumptions are available in Z3. They are used to extract unsatisfiable cores.
7384 They may be also used to "retract" assumptions. Note that, assumptions are not really
7385 "soft constraints", but they can be used to implement them.
7386
7387 >>> p1, p2, p3 = Bools('p1 p2 p3')
7388 >>> x, y = Ints('x y')
7389 >>> s = Solver()
7390 >>> s.add(Implies(p1, x > 0))
7391 >>> s.add(Implies(p2, y > x))
7392 >>> s.add(Implies(p2, y < 1))
7393 >>> s.add(Implies(p3, y > -3))
7394 >>> s.check(p1, p2, p3)
7395 unsat
7396 >>> core = s.unsat_core()
7397 >>> len(core)
7398 2
7399 >>> p1 in core
7400 True
7401 >>> p2 in core
7402 True
7403 >>> p3 in core
7404 False
7405 >>> # "Retracting" p2
7406 >>> s.check(p1, p3)
7407 sat
7408 """
7409 return AstVector(Z3_solver_get_unsat_core(self.ctx.ref(), self.solver), self.ctx)
7410
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 7124 of file z3py.py.

◆ ctx

ctx

Definition at line 7123 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(), 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(), ParamsRef.validate(), FuncEntry.value(), QuantifierRef.var_name(), and QuantifierRef.var_sort().

◆ cube_vs

cube_vs

Definition at line 7455 of file z3py.py.

◆ solver

solver