Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
 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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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