3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-22 16:45:31 +00:00

add selected type annotations to python API

This commit is contained in:
Nikolaj Bjorner 2025-04-04 18:39:39 -07:00
parent 26ab0de8fc
commit 5e10fd39fc

View file

@ -56,6 +56,18 @@ import copy
if sys.version_info.major >= 3:
from typing import Iterable
from collections.abc import Callable
from typing import (
Any,
Iterable,
Sequence,
TypeGuard,
TypeVar,
Self,
Union,
)
Z3_DEBUG = __debug__
@ -121,7 +133,7 @@ def append_log(s):
Z3_append_log(s)
def to_symbol(s, ctx=None):
def to_symbol(s : int | str, ctx = None):
"""Convert an integer or string into a Z3 symbol."""
if _is_int(s):
return Z3_mk_int_symbol(_get_ctx(ctx).ref(), s)
@ -236,7 +248,7 @@ class Context:
_main_ctx = None
def main_ctx():
def main_ctx() -> Context:
"""Return a reference to the global Z3 context.
>>> x = Real('x')
@ -257,14 +269,14 @@ def main_ctx():
return _main_ctx
def _get_ctx(ctx):
def _get_ctx(ctx : Context | None) -> Context:
if ctx is None:
return main_ctx()
else:
return ctx
def get_ctx(ctx):
def get_ctx(ctx : Context | None) -> Context:
return _get_ctx(ctx)
@ -292,7 +304,7 @@ def set_param(*args, **kws):
prev = None
def reset_params():
def reset_params() -> None:
"""Reset all global (or module) parameters.
"""
Z3_global_param_reset_all()
@ -304,7 +316,7 @@ def set_option(*args, **kws):
return set_param(*args, **kws)
def get_param(name):
def get_param(name : str) -> str:
"""Return the value of a Z3 global (or module) parameter
>>> get_param('nlsat.reorder')
@ -452,7 +464,7 @@ class AstRef(Z3PPObject):
return None
def is_ast(a):
def is_ast(a : Any) -> TypeGuard[AstRef]:
"""Return `True` if `a` is an AST node.
>>> is_ast(10)
@ -473,7 +485,7 @@ def is_ast(a):
return isinstance(a, AstRef)
def eq(a, b):
def eq(a : AstRef, b : AstRef) -> bool:
"""Return `True` if `a` and `b` are structurally identical AST nodes.
>>> x = Int('x')
@ -492,7 +504,7 @@ def eq(a, b):
return a.eq(b)
def _ast_kind(ctx, a):
def _ast_kind(ctx : Context, a : Any) -> int:
if is_ast(a):
a = a.as_ast()
return Z3_get_ast_kind(ctx.ref(), a)
@ -648,7 +660,7 @@ class SortRef(AstRef):
return AstRef.__hash__(self)
def is_sort(s):
def is_sort(s : Any) -> TypeGuard[SortRef]:
"""Return `True` if `s` is a Z3 sort.
>>> is_sort(IntSort())
@ -692,11 +704,11 @@ def _to_sort_ref(s, ctx):
return SortRef(s, ctx)
def _sort(ctx, a):
def _sort(ctx : Context, a : Any) -> SortRef:
return _to_sort_ref(Z3_get_sort(ctx.ref(), a), ctx)
def DeclareSort(name, ctx=None):
def DeclareSort(name, ctx : Context | None = None) -> SortRef:
"""Create a new uninterpreted sort named `name`.
If `ctx=None`, then the new sort is declared in the global Z3Py context.
@ -1500,7 +1512,7 @@ def FreshConst(sort, prefix="c"):
return _to_expr_ref(Z3_mk_fresh_const(ctx.ref(), prefix, sort.ast), ctx)
def Var(idx, s):
def Var(idx : int, s : SortRef) -> ExprRef:
"""Create a Z3 free variable. Free variables are used to create quantified formulas.
A free variable with index n is bound when it occurs within the scope of n+1 quantified
declarations.
@ -1515,7 +1527,7 @@ def Var(idx, s):
return _to_expr_ref(Z3_mk_bound(s.ctx_ref(), idx, s.ast), s.ctx)
def RealVar(idx, ctx=None):
def RealVar(idx: int, ctx: Context | None = None) -> ExprRef:
"""
Create a real free variable. Free variables are used to create quantified formulas.
They are also used to create polynomials.
@ -1525,8 +1537,7 @@ def RealVar(idx, ctx=None):
"""
return Var(idx, RealSort(ctx))
def RealVarVector(n, ctx=None):
def RealVarVector(n: int, ctx: Context | None = None) -> list[ExprRef]:
"""
Create a list of Real free variables.
The variables have ids: 0, 1, ..., n-1
@ -1630,7 +1641,7 @@ class BoolRef(ExprRef):
def is_bool(a):
def is_bool(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is a Z3 Boolean expression.
>>> p = Bool('p')
@ -1648,7 +1659,7 @@ def is_bool(a):
return isinstance(a, BoolRef)
def is_true(a):
def is_true(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is the Z3 true expression.
>>> p = Bool('p')
@ -1666,7 +1677,7 @@ def is_true(a):
return is_app_of(a, Z3_OP_TRUE)
def is_false(a):
def is_false(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is the Z3 false expression.
>>> p = Bool('p')
@ -1680,7 +1691,7 @@ def is_false(a):
return is_app_of(a, Z3_OP_FALSE)
def is_and(a):
def is_and(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is a Z3 and expression.
>>> p, q = Bools('p q')
@ -1692,7 +1703,7 @@ def is_and(a):
return is_app_of(a, Z3_OP_AND)
def is_or(a):
def is_or(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is a Z3 or expression.
>>> p, q = Bools('p q')
@ -1704,7 +1715,7 @@ def is_or(a):
return is_app_of(a, Z3_OP_OR)
def is_implies(a):
def is_implies(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is a Z3 implication expression.
>>> p, q = Bools('p q')
@ -1716,7 +1727,7 @@ def is_implies(a):
return is_app_of(a, Z3_OP_IMPLIES)
def is_not(a):
def is_not(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is a Z3 not expression.
>>> p = Bool('p')
@ -1728,7 +1739,7 @@ def is_not(a):
return is_app_of(a, Z3_OP_NOT)
def is_eq(a):
def is_eq(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is a Z3 equality expression.
>>> x, y = Ints('x y')
@ -1738,7 +1749,7 @@ def is_eq(a):
return is_app_of(a, Z3_OP_EQ)
def is_distinct(a):
def is_distinct(a : Any) -> TypeGuard[BoolRef]:
"""Return `True` if `a` is a Z3 distinct expression.
>>> x, y, z = Ints('x y z')
@ -2433,7 +2444,7 @@ class ArithSortRef(SortRef):
_z3_assert(False, msg % self)
def is_arith_sort(s):
def is_arith_sort(s : Any) -> TypeGuard[ArithSortRef]:
"""Return `True` if s is an arithmetical sort (type).
>>> is_arith_sort(IntSort())
@ -2755,7 +2766,7 @@ def is_arith(a):
return isinstance(a, ArithRef)
def is_int(a):
def is_int(a) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an integer expression.
>>> x = Int('x')
@ -2861,7 +2872,7 @@ def is_algebraic_value(a):
return is_arith(a) and a.is_real() and _is_algebraic(a.ctx, a.as_ast())
def is_add(a):
def is_add(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b + c.
>>> x, y = Ints('x y')
@ -2873,7 +2884,7 @@ def is_add(a):
return is_app_of(a, Z3_OP_ADD)
def is_mul(a):
def is_mul(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b * c.
>>> x, y = Ints('x y')
@ -2885,7 +2896,7 @@ def is_mul(a):
return is_app_of(a, Z3_OP_MUL)
def is_sub(a):
def is_sub(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b - c.
>>> x, y = Ints('x y')
@ -2897,7 +2908,7 @@ def is_sub(a):
return is_app_of(a, Z3_OP_SUB)
def is_div(a):
def is_div(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b / c.
>>> x, y = Reals('x y')
@ -2914,7 +2925,7 @@ def is_div(a):
return is_app_of(a, Z3_OP_DIV)
def is_idiv(a):
def is_idiv(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b div c.
>>> x, y = Ints('x y')
@ -2926,7 +2937,7 @@ def is_idiv(a):
return is_app_of(a, Z3_OP_IDIV)
def is_mod(a):
def is_mod(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b % c.
>>> x, y = Ints('x y')
@ -2938,7 +2949,7 @@ def is_mod(a):
return is_app_of(a, Z3_OP_MOD)
def is_le(a):
def is_le(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b <= c.
>>> x, y = Ints('x y')
@ -2950,7 +2961,7 @@ def is_le(a):
return is_app_of(a, Z3_OP_LE)
def is_lt(a):
def is_lt(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b < c.
>>> x, y = Ints('x y')
@ -2962,7 +2973,7 @@ def is_lt(a):
return is_app_of(a, Z3_OP_LT)
def is_ge(a):
def is_ge(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b >= c.
>>> x, y = Ints('x y')
@ -2974,7 +2985,7 @@ def is_ge(a):
return is_app_of(a, Z3_OP_GE)
def is_gt(a):
def is_gt(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form b > c.
>>> x, y = Ints('x y')
@ -2986,7 +2997,7 @@ def is_gt(a):
return is_app_of(a, Z3_OP_GT)
def is_is_int(a):
def is_is_int(a : Any) -> bool:
"""Return `True` if `a` is an expression of the form IsInt(b).
>>> x = Real('x')
@ -2998,7 +3009,7 @@ def is_is_int(a):
return is_app_of(a, Z3_OP_IS_INT)
def is_to_real(a):
def is_to_real(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form ToReal(b).
>>> x = Int('x')
@ -3013,7 +3024,7 @@ def is_to_real(a):
return is_app_of(a, Z3_OP_TO_REAL)
def is_to_int(a):
def is_to_int(a : Any) -> TypeGuard[ArithRef]:
"""Return `True` if `a` is an expression of the form ToInt(b).
>>> x = Real('x')
@ -4689,7 +4700,7 @@ def is_array_sort(a):
return Z3_get_sort_kind(a.ctx.ref(), Z3_get_sort(a.ctx.ref(), a.ast)) == Z3_ARRAY_SORT
def is_array(a):
def is_array(a : Any) -> TypeGuard[ArrayRef]:
"""Return `True` if `a` is a Z3 array expression.
>>> a = Array('a', IntSort(), IntSort())
@ -11140,7 +11151,7 @@ def is_seq(a):
return isinstance(a, SeqRef)
def is_string(a):
def is_string(a: Any) -> TypeGuard[SeqRef]:
"""Return `True` if `a` is a Z3 string expression.
>>> print (is_string(StringVal("ab")))
True
@ -11148,7 +11159,7 @@ def is_string(a):
return isinstance(a, SeqRef) and a.is_string()
def is_string_value(a):
def is_string_value(a: Any) -> TypeGuard[SeqRef]:
"""return 'True' if 'a' is a Z3 string constant expression.
>>> print (is_string_value(StringVal("a")))
True