В C API для z3 есть такие функции, как Z3_mk_bvadd_no_overflow, но, похоже, они недоступны в Python API. Прежде чем я начну взламывать, чтобы решить эту проблему, я просто хотел бы убедиться, что это так, а также попросить добавить их в официальную версию.
Я пытаюсь добавить такие вещи в z3.py, но до сих пор не удалось правильно разобраться в деталях. Предложения о том, где я ошибаюсь, будут оценены. Я работаю над веткой contrib.
def Bvadd_no_overflow(a, b, si, ctx=None):
"""Create a Z3 bvadd_no_overflow expression.
"""
ctx = _get_ctx(_ctx_from_ast_arg_list([a, b], ctx))
# argh can't hard-code the 32
s = BitVecSort(32,ctx)
a = s.cast(a)
b = s.cast(b)
# this function requires a bool as the last argument but is it a python bool, a
# z3 bool, or what?
return BitVecRef(Z3_mk_bvadd_no_overflow(ctx.ref(), a.as_ast(), b.as_ast(), 1), ctx)