Z3
Loading...
Searching...
No Matches
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 = _get_ctx(ctx)
int backtrack_level = 4000000000
 solver = None
 cube_vs = AstVector(None, self.ctx)

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

Constructor & Destructor Documentation

◆ __init__()

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

Definition at line 7144 of file z3py.py.

7144 def __init__(self, solver=None, ctx=None, logFile=None):
7145 assert solver is None or ctx is not None
7146 self.ctx = _get_ctx(ctx)
7147 self.backtrack_level = 4000000000
7148 self.solver = None
7149 if solver is None:
7150 self.solver = Z3_mk_solver(self.ctx.ref())
7151 else:
7152 self.solver = solver
7153 Z3_solver_inc_ref(self.ctx.ref(), self.solver)
7154 if logFile is not None:
7155 self.set("smtlib2_log", logFile)
7156
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 7157 of file z3py.py.

7157 def __del__(self):
7158 if self.solver is not None and self.ctx.ref() is not None and Z3_solver_dec_ref is not None:
7159 Z3_solver_dec_ref(self.ctx.ref(), self.solver)
7160
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 7638 of file z3py.py.

7638 def __copy__(self):
7639 return self.translate(self.ctx)
7640

◆ __deepcopy__()

__deepcopy__ ( self,
memo = {} )

Definition at line 7641 of file z3py.py.

7641 def __deepcopy__(self, memo={}):
7642 return self.translate(self.ctx)
7643

◆ __enter__()

__enter__ ( self)

Definition at line 7161 of file z3py.py.

7161 def __enter__(self):
7162 self.push()
7163 return self
7164

◆ __exit__()

__exit__ ( self,
* exc_info )

Definition at line 7165 of file z3py.py.

7165 def __exit__(self, *exc_info):
7166 self.pop()
7167

◆ __iadd__()

__iadd__ ( self,
fml )

Definition at line 7287 of file z3py.py.

7287 def __iadd__(self, fml):
7288 self.add(fml)
7289 return self
7290

◆ __repr__()

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

Definition at line 7621 of file z3py.py.

7621 def __repr__(self):
7622 """Return a formatted string with all added constraints."""
7623 return obj_to_string(self)
7624

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

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

Referenced by __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 7291 of file z3py.py.

7291 def append(self, *args):
7292 """Assert constraints into the solver.
7293
7294 >>> x = Int('x')
7295 >>> s = Solver()
7296 >>> s.append(x > 0, x < 2)
7297 >>> s
7298 [x > 0, x < 2]
7299 """
7300 self.assert_exprs(*args)
7301

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

7313 def assert_and_track(self, a, p):
7314 """Assert constraint `a` and track it in the unsat core using the Boolean constant `p`.
7315
7316 If `p` is a string, it will be automatically converted into a Boolean constant.
7317
7318 >>> x = Int('x')
7319 >>> p3 = Bool('p3')
7320 >>> s = Solver()
7321 >>> s.set(unsat_core=True)
7322 >>> s.assert_and_track(x > 0, 'p1')
7323 >>> s.assert_and_track(x != 1, 'p2')
7324 >>> s.assert_and_track(x < 0, p3)
7325 >>> print(s.check())
7326 unsat
7327 >>> c = s.unsat_core()
7328 >>> len(c)
7329 2
7330 >>> Bool('p1') in c
7331 True
7332 >>> Bool('p2') in c
7333 False
7334 >>> p3 in c
7335 True
7336 """
7337 if isinstance(p, str):
7338 p = Bool(p, self.ctx)
7339 _z3_assert(isinstance(a, BoolRef), "Boolean expression expected")
7340 _z3_assert(isinstance(p, BoolRef) and is_const(p), "Boolean expression expected")
7341 Z3_solver_assert_and_track(self.ctx.ref(), self.solver, a.as_ast(), p.as_ast())
7342
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 7257 of file z3py.py.

7257 def assert_exprs(self, *args):
7258 """Assert constraints into the solver.
7259
7260 >>> x = Int('x')
7261 >>> s = Solver()
7262 >>> s.assert_exprs(x > 0, x < 2)
7263 >>> s
7264 [x > 0, x < 2]
7265 """
7266 args = _get_args(args)
7267 s = BoolSort(self.ctx)
7268 for arg in args:
7269 if isinstance(arg, Goal) or isinstance(arg, AstVector):
7270 for f in arg:
7271 Z3_solver_assert(self.ctx.ref(), self.solver, f.as_ast())
7272 else:
7273 arg = s.cast(arg)
7274 Z3_solver_assert(self.ctx.ref(), self.solver, arg.as_ast())
7275
void Z3_API Z3_solver_assert(Z3_context c, Z3_solver s, Z3_ast a)
Assert a constraint into the solver.

Referenced by add(), append(), and 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 7538 of file z3py.py.

7538 def assertions(self):
7539 """Return an AST vector containing all added constraints.
7540
7541 >>> s = Solver()
7542 >>> s.assertions()
7543 []
7544 >>> a = Int('a')
7545 >>> s.add(a > 0)
7546 >>> s.add(a < 10)
7547 >>> s.assertions()
7548 [a > 0, a < 10]
7549 """
7550 return AstVector(Z3_solver_get_assertions(self.ctx.ref(), self.solver), self.ctx)
7551
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 7343 of file z3py.py.

7343 def check(self, *assumptions):
7344 """Check whether the assertions in the given solver plus the optional assumptions are consistent or not.
7345
7346 >>> x = Int('x')
7347 >>> s = Solver()
7348 >>> s.check()
7349 sat
7350 >>> s.add(x > 0, x < 2)
7351 >>> s.check()
7352 sat
7353 >>> s.model().eval(x)
7354 1
7355 >>> s.add(x < 1)
7356 >>> s.check()
7357 unsat
7358 >>> s.reset()
7359 >>> s.add(2**x == 4)
7360 >>> s.check()
7361 sat
7362 """
7363 s = BoolSort(self.ctx)
7364 assumptions = _get_args(assumptions)
7365 num = len(assumptions)
7366 _assumptions = (Ast * num)()
7367 for i in range(num):
7368 _assumptions[i] = s.cast(assumptions[i]).as_ast()
7369 r = Z3_solver_check_assumptions(self.ctx.ref(), self.solver, num, _assumptions)
7370 return CheckSatResult(r)
7371
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 7434 of file z3py.py.

7434 def consequences(self, assumptions, variables):
7435 """Determine fixed values for the variables based on the solver state and assumptions.
7436 >>> s = Solver()
7437 >>> a, b, c, d = Bools('a b c d')
7438 >>> s.add(Implies(a,b), Implies(b, c))
7439 >>> s.consequences([a],[b,c,d])
7440 (sat, [Implies(a, b), Implies(a, c)])
7441 >>> s.consequences([Not(c),d],[a,b,c,d])
7442 (sat, [Implies(d, d), Implies(Not(c), Not(c)), Implies(Not(c), Not(b)), Implies(Not(c), Not(a))])
7443 """
7444 if isinstance(assumptions, list):
7445 _asms = AstVector(None, self.ctx)
7446 for a in assumptions:
7447 _asms.push(a)
7448 assumptions = _asms
7449 if isinstance(variables, list):
7450 _vars = AstVector(None, self.ctx)
7451 for a in variables:
7452 _vars.push(a)
7453 variables = _vars
7454 _z3_assert(isinstance(assumptions, AstVector), "ast vector expected")
7455 _z3_assert(isinstance(variables, AstVector), "ast vector expected")
7456 consequences = AstVector(None, self.ctx)
7457 r = Z3_solver_get_consequences(self.ctx.ref(), self.solver, assumptions.vector,
7458 variables.vector, consequences.vector)
7459 sz = len(consequences)
7460 consequences = [consequences[i] for i in range(sz)]
7461 return CheckSatResult(r), consequences
7462
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 7471 of file z3py.py.

7471 def cube(self, vars=None):
7472 """Get set of cubes
7473 The method takes an optional set of variables that restrict which
7474 variables may be used as a starting point for cubing.
7475 If vars is not None, then the first case split is based on a variable in
7476 this set.
7477 """
7478 self.cube_vs = AstVector(None, self.ctx)
7479 if vars is not None:
7480 for v in vars:
7481 self.cube_vs.push(v)
7482 while True:
7483 lvl = self.backtrack_level
7484 self.backtrack_level = 4000000000
7485 r = AstVector(Z3_solver_cube(self.ctx.ref(), self.solver, self.cube_vs.vector, lvl), self.ctx)
7486 if (len(r) == 1 and is_false(r[0])):
7487 return
7488 yield r
7489 if (len(r) == 0):
7490 return
7491
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 7492 of file z3py.py.

7492 def cube_vars(self):
7493 """Access the set of variables that were touched by the most recently generated cube.
7494 This set of variables can be used as a starting point for additional cubes.
7495 The idea is that variables that appear in clauses that are reduced by the most recent
7496 cube are likely more useful to cube on."""
7497 return self.cube_vs
7498

◆ dimacs()

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

Definition at line 7656 of file z3py.py.

7656 def dimacs(self, include_names=True):
7657 """Return a textual representation of the solver in DIMACS format."""
7658 return Z3_solver_to_dimacs_string(self.ctx.ref(), self.solver, include_names)
7659
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 7515 of file z3py.py.

7515 def explain_congruent(self, a, b):
7516 """Explain congruence of a and b relative to the current search state"""
7517 a = _py2expr(a, self.ctx)
7518 b = _py2expr(b, self.ctx)
7519 return _to_expr_ref(Z3_solver_congruence_explain(self.ctx.ref(), self.solver, a.ast, b.ast), self.ctx)
7520
7521
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 7463 of file z3py.py.

7463 def from_file(self, filename):
7464 """Parse assertions from a file"""
7465 Z3_solver_from_file(self.ctx.ref(), self.solver, filename)
7466
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 7467 of file z3py.py.

7467 def from_string(self, s):
7468 """Parse assertions from a string"""
7469 Z3_solver_from_string(self.ctx.ref(), self.solver, s)
7470
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 7613 of file z3py.py.

7613 def help(self):
7614 """Display a string describing all available options."""
7615 print(Z3_solver_get_help(self.ctx.ref(), self.solver))
7616
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 7391 of file z3py.py.

7391 def import_model_converter(self, other):
7392 """Import model converter from other into the current solver"""
7393 Z3_solver_import_model_converter(self.ctx.ref(), other.solver, self.solver)
7394

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

7302 def insert(self, *args):
7303 """Assert constraints into the solver.
7304
7305 >>> x = Int('x')
7306 >>> s = Solver()
7307 >>> s.insert(x > 0, x < 2)
7308 >>> s
7309 [x > 0, x < 2]
7310 """
7311 self.assert_exprs(*args)
7312

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

7395 def interrupt(self):
7396 """Interrupt the execution of the solver object.
7397 Remarks: This ensures that the interrupt applies only
7398 to the given solver object and it applies only if it is running.
7399 """
7400 Z3_solver_interrupt(self.ctx.ref(), self.solver)
7401
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 7372 of file z3py.py.

7372 def model(self):
7373 """Return a model for the last `check()`.
7374
7375 This function raises an exception if
7376 a model is not available (e.g., last `check()` returned unsat).
7377
7378 >>> s = Solver()
7379 >>> a = Int('a')
7380 >>> s.add(a + 2 == 0)
7381 >>> s.check()
7382 sat
7383 >>> s.model()
7384 [a = -2]
7385 """
7386 try:
7387 return ModelRef(Z3_solver_get_model(self.ctx.ref(), self.solver), self.ctx)
7388 except Z3Exception:
7389 raise Z3Exception("model is not available")
7390
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.

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

7507 def next(self, t):
7508 """Retrieve congruence closure sibling of the term t relative to the current search state
7509 The function primarily works for SimpleSolver. Terms and variables that are
7510 eliminated during pre-processing are not visible to the congruence closure.
7511 """
7512 t = _py2expr(t, self.ctx)
7513 return _to_expr_ref(Z3_solver_congruence_next(self.ctx.ref(), self.solver, t.ast), self.ctx)
7514
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 7557 of file z3py.py.

7557 def non_units(self):
7558 """Return an AST vector containing all atomic formulas in solver state that are not units.
7559 """
7560 return AstVector(Z3_solver_get_non_units(self.ctx.ref(), self.solver), self.ctx)
7561
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 7225 of file z3py.py.

7225 def num_scopes(self):
7226 """Return the current number of backtracking points.
7227
7228 >>> s = Solver()
7229 >>> s.num_scopes()
7230 0
7231 >>> s.push()
7232 >>> s.num_scopes()
7233 1
7234 >>> s.push()
7235 >>> s.num_scopes()
7236 2
7237 >>> s.pop()
7238 >>> s.num_scopes()
7239 1
7240 """
7241 return Z3_solver_get_num_scopes(self.ctx.ref(), self.solver)
7242
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 7617 of file z3py.py.

7617 def param_descrs(self):
7618 """Return the parameter description set."""
7619 return ParamDescrsRef(Z3_solver_get_param_descrs(self.ctx.ref(), self.solver), self.ctx)
7620
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 7203 of file z3py.py.

7203 def pop(self, num=1):
7204 """Backtrack \\c num backtracking points.
7205
7206 >>> x = Int('x')
7207 >>> s = Solver()
7208 >>> s.add(x > 0)
7209 >>> s
7210 [x > 0]
7211 >>> s.push()
7212 >>> s.add(x < 1)
7213 >>> s
7214 [x > 0, x < 1]
7215 >>> s.check()
7216 unsat
7217 >>> s.pop()
7218 >>> s.check()
7219 sat
7220 >>> s
7221 [x > 0]
7222 """
7223 Z3_solver_pop(self.ctx.ref(), self.solver, num)
7224
void Z3_API Z3_solver_pop(Z3_context c, Z3_solver s, unsigned n)
Backtrack n backtracking points.

Referenced by __exit__().

◆ proof()

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

Definition at line 7534 of file z3py.py.

7534 def proof(self):
7535 """Return a proof for the last `check()`. Proof construction must be enabled."""
7536 return _to_expr_ref(Z3_solver_get_proof(self.ctx.ref(), self.solver), self.ctx)
7537
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 7181 of file z3py.py.

7181 def push(self):
7182 """Create a backtracking point.
7183
7184 >>> x = Int('x')
7185 >>> s = Solver()
7186 >>> s.add(x > 0)
7187 >>> s
7188 [x > 0]
7189 >>> s.push()
7190 >>> s.add(x < 1)
7191 >>> s
7192 [x > 0, x < 1]
7193 >>> s.check()
7194 unsat
7195 >>> s.pop()
7196 >>> s.check()
7197 sat
7198 >>> s
7199 [x > 0]
7200 """
7201 Z3_solver_push(self.ctx.ref(), self.solver)
7202
void Z3_API Z3_solver_push(Z3_context c, Z3_solver s)
Create a backtracking point.

Referenced by __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 7600 of file z3py.py.

7600 def reason_unknown(self):
7601 """Return a string describing why the last `check()` returned `unknown`.
7602
7603 >>> x = Int('x')
7604 >>> s = SimpleSolver()
7605 >>> s.add(x == 2**x)
7606 >>> s.check()
7607 unknown
7608 >>> s.reason_unknown()
7609 '(incomplete (theory arithmetic))'
7610 """
7611 return Z3_solver_get_reason_unknown(self.ctx.ref(), self.solver)
7612
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 7243 of file z3py.py.

7243 def reset(self):
7244 """Remove all asserted constraints and backtracking points created using `push()`.
7245
7246 >>> x = Int('x')
7247 >>> s = Solver()
7248 >>> s.add(x > 0)
7249 >>> s
7250 [x > 0]
7251 >>> s.reset()
7252 >>> s
7253 []
7254 """
7255 Z3_solver_reset(self.ctx.ref(), self.solver)
7256
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 7499 of file z3py.py.

7499 def root(self, t):
7500 """Retrieve congruence closure root of the term t relative to the current search state
7501 The function primarily works for SimpleSolver. Terms and variables that are
7502 eliminated during pre-processing are not visible to the congruence closure.
7503 """
7504 t = _py2expr(t, self.ctx)
7505 return _to_expr_ref(Z3_solver_congruence_root(self.ctx.ref(), self.solver, t.ast), self.ctx)
7506
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 7168 of file z3py.py.

7168 def set(self, *args, **keys):
7169 """Set a configuration option.
7170 The method `help()` return a string containing all available options.
7171
7172 >>> s = Solver()
7173 >>> # The option MBQI can be set using three different approaches.
7174 >>> s.set(mbqi=True)
7175 >>> s.set('MBQI', True)
7176 >>> s.set(':mbqi', True)
7177 """
7178 p = args2params(args, keys, self.ctx)
7179 Z3_solver_set_params(self.ctx.ref(), self.solver, p.params)
7180
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 7570 of file z3py.py.

7570 def set_initial_value(self, var, value):
7571 """initialize the solver's state by setting the initial value of var to value
7572 """
7573 s = var.sort()
7574 value = s.cast(value)
7575 Z3_solver_set_initial_value(self.ctx.ref(), self.solver, var.ast, value.ast)
7576
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 7644 of file z3py.py.

7644 def sexpr(self):
7645 """Return a formatted string (in Lisp-like format) with all added constraints.
7646 We say the string is in s-expression format.
7647
7648 >>> x = Int('x')
7649 >>> s = Solver()
7650 >>> s.add(x > 0)
7651 >>> s.add(x < 2)
7652 >>> r = s.sexpr()
7653 """
7654 return Z3_solver_to_string(self.ctx.ref(), self.solver)
7655
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 7522 of file z3py.py.

7522 def solve_for(self, ts):
7523 """Retrieve a solution for t relative to linear equations maintained in the current state."""
7524 vars = AstVector(ctx=self.ctx);
7525 terms = AstVector(ctx=self.ctx);
7526 guards = AstVector(ctx=self.ctx);
7527 for t in ts:
7528 t = _py2expr(t, self.ctx)
7529 vars.push(t)
7530 Z3_solver_solve_for(self.ctx.ref(), self.solver, vars.vector, terms.vector, guards.vector)
7531 return [(vars[i], terms[i], guards[i]) for i in range(len(vars))]
7532
7533
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 7582 of file z3py.py.

7582 def statistics(self):
7583 """Return statistics for the last `check()`.
7584
7585 >>> s = SimpleSolver()
7586 >>> x = Int('x')
7587 >>> s.add(x > 0)
7588 >>> s.check()
7589 sat
7590 >>> st = s.statistics()
7591 >>> st.get_key_value('final checks')
7592 1
7593 >>> len(st) > 0
7594 True
7595 >>> st[0] != 0
7596 True
7597 """
7598 return Statistics(Z3_solver_get_statistics(self.ctx.ref(), self.solver), self.ctx)
7599
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 7660 of file z3py.py.

7660 def to_smt2(self):
7661 """return SMTLIB2 formatted benchmark for solver's assertions"""
7662 es = self.assertions()
7663 sz = len(es)
7664 sz1 = sz
7665 if sz1 > 0:
7666 sz1 -= 1
7667 v = (Ast * sz1)()
7668 for i in range(sz1):
7669 v[i] = es[i].as_ast()
7670 if sz > 0:
7671 e = es[sz1].as_ast()
7672 else:
7673 e = BoolVal(True, self.ctx).as_ast()
7675 self.ctx.ref(), "benchmark generated from python API", "", "unknown", "", sz1, v, e,
7676 )
7677
7678
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 7577 of file z3py.py.

7577 def trail(self):
7578 """Return trail of the solver state after a check() call.
7579 """
7580 return AstVector(Z3_solver_get_trail(self.ctx.ref(), self.solver), self.ctx)
7581
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 7562 of file z3py.py.

7562 def trail_levels(self):
7563 """Return trail and decision levels of the solver state after a check() call.
7564 """
7565 trail = self.trail()
7566 levels = (ctypes.c_uint * len(trail))()
7567 Z3_solver_get_levels(self.ctx.ref(), self.solver, trail.vector, len(trail), levels)
7568 return trail, levels
7569
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 7625 of file z3py.py.

7625 def translate(self, target):
7626 """Translate `self` to the context `target`. That is, return a copy of `self` in the context `target`.
7627
7628 >>> c1 = Context()
7629 >>> c2 = Context()
7630 >>> s1 = Solver(ctx=c1)
7631 >>> s2 = s1.translate(c2)
7632 """
7633 if z3_debug():
7634 _z3_assert(isinstance(target, Context), "argument must be a Z3 context")
7635 solver = Z3_solver_translate(self.ctx.ref(), self.solver, target.ref())
7636 return Solver(solver, target)
7637
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.

◆ units()

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

Definition at line 7552 of file z3py.py.

7552 def units(self):
7553 """Return an AST vector containing all currently inferred units.
7554 """
7555 return AstVector(Z3_solver_get_units(self.ctx.ref(), self.solver), self.ctx)
7556
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 7402 of file z3py.py.

7402 def unsat_core(self):
7403 """Return a subset (as an AST vector) of the assumptions provided to the last check().
7404
7405 These are the assumptions Z3 used in the unsatisfiability proof.
7406 Assumptions are available in Z3. They are used to extract unsatisfiable cores.
7407 They may be also used to "retract" assumptions. Note that, assumptions are not really
7408 "soft constraints", but they can be used to implement them.
7409
7410 >>> p1, p2, p3 = Bools('p1 p2 p3')
7411 >>> x, y = Ints('x y')
7412 >>> s = Solver()
7413 >>> s.add(Implies(p1, x > 0))
7414 >>> s.add(Implies(p2, y > x))
7415 >>> s.add(Implies(p2, y < 1))
7416 >>> s.add(Implies(p3, y > -3))
7417 >>> s.check(p1, p2, p3)
7418 unsat
7419 >>> core = s.unsat_core()
7420 >>> len(core)
7421 2
7422 >>> p1 in core
7423 True
7424 >>> p2 in core
7425 True
7426 >>> p3 in core
7427 False
7428 >>> # "Retracting" p2
7429 >>> s.check(p1, p3)
7430 sat
7431 """
7432 return AstVector(Z3_solver_get_unsat_core(self.ctx.ref(), self.solver), self.ctx)
7433
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

int backtrack_level = 4000000000

Definition at line 7147 of file z3py.py.

◆ ctx

ctx = _get_ctx(ctx)

Definition at line 7146 of file z3py.py.

Referenced by __del__(), assert_and_track(), assert_exprs(), check(), model(), num_scopes(), pop(), push(), reset(), and set().

◆ cube_vs

cube_vs = AstVector(None, self.ctx)

Definition at line 7478 of file z3py.py.

◆ solver

solver = None

Definition at line 7148 of file z3py.py.

Referenced by __del__(), assert_and_track(), assert_exprs(), check(), model(), num_scopes(), pop(), push(), reset(), and set().