def walk_symbol(self, formula, **kwargs): symbol_type = formula.symbol_type() if symbol_type.is_function_type(): res = self._z3_func_decl(formula) else: sname = formula.symbol_name() z3_sname = z3.Z3_mk_string_symbol(self.ctx.ref(), sname) if symbol_type.is_bool_type(): sort_ast = self.z3BoolSort.ast elif symbol_type.is_real_type(): sort_ast = self.z3RealSort.ast elif symbol_type.is_int_type(): sort_ast = self.z3IntSort.ast elif symbol_type.is_array_type(): sort_ast = self._type_to_z3(symbol_type).ast elif symbol_type.is_string_type(): raise ConvertExpressionError(message=("Unsupported string symbol: %s" % str(formula)), expression=formula) elif symbol_type.is_enum_type(): sort_ast = self._type_to_z3(symbol_type).ast elif symbol_type.is_custom_type(): sort_ast = self._type_to_z3(symbol_type).ast else: sort_ast = self._type_to_z3(symbol_type).ast # Create const with given sort res = z3.Z3_mk_const(self.ctx.ref(), z3_sname, sort_ast) z3.Z3_inc_ref(self.ctx.ref(), res) return res
def walk_quantifier(self, formula, args, **kwargs): qvars = formula.quantifier_vars() qvars, qvars_sz = self._to_ast_array([self.walk_symbol(x)\ for x in qvars]) empty_str = z3.Z3_mk_string_symbol(self.ctx.ref(), "") z3term = z3.Z3_mk_quantifier_const_ex(self.ctx.ref(), formula.is_forall(), 1, empty_str, empty_str, qvars_sz, qvars, 0, None, 0, None, args[0]) z3.Z3_inc_ref(self.ctx.ref(), z3term) return z3term
def walk_symbol(self, formula, **kwargs): symbol_type = formula.symbol_type() sname = formula.symbol_name() z3_sname = z3.Z3_mk_string_symbol(self.ctx.ref(), sname) if symbol_type.is_bool_type(): sort_ast = self.z3BoolSort.ast elif symbol_type.is_real_type(): sort_ast = self.z3RealSort.ast elif symbol_type.is_int_type(): sort_ast = self.z3IntSort.ast else: sort_ast = self._type_to_z3(symbol_type).ast # Create const with given sort res = z3.Z3_mk_const(self.ctx.ref(), z3_sname, sort_ast) z3.Z3_inc_ref(self.ctx.ref(), res) return res
def _z3_func_decl(self, func_name): """Create a Z3 Function Declaration for the given function.""" try: return self._z3_func_decl_cache[func_name] except KeyError: tp = func_name.symbol_type() arity = len(tp.param_types) z3dom = (z3.Sort * arity)() for i, t in enumerate(tp.param_types): z3dom[i] = self._type_to_z3(t).ast z3ret = self._type_to_z3(tp.return_type).ast z3name = z3.Z3_mk_string_symbol(self.ctx.ref(), func_name.symbol_name()) z3func = z3.Z3_mk_func_decl(self.ctx.ref(), z3name, arity, z3dom, z3ret) self._z3_func_decl_cache[func_name] = z3func return z3func