Ejemplo n.º 1
0
 def substitute_hole_in_expression(self, expression, pairs):
     """
     Expression is a z3 expression, and pairs is a list of pairs
     of the form (function declaration representing hole, substitute)
     For now substitute can only be a value.
     TODO: change this so substitute can be a conditional expression as well.
     The latter will require to introduce a 'table variable'.
     """
     assert z3p.is_expr(expression)
     holes = [pair[0] for pair in pairs]
     if z3p.is_bool_or_int_value(expression):
         return expression
     if z3p.is_app(expression):
         declaration = expression.decl()
         for hole, substitute in pairs:
             if declaration == hole:
                 input_variables = [expression.arg(i)
                                    for i in range(expression.num_args())]
                 conditional = constraint_model.lookup_table_to_conditional_expression(substitute, input_variables)
                 # introduce table variable and add table declaration in tables
                 table_id = len(self.tables.keys())
                 table_var_name = 'table_{}'.format(table_id)
                 self.tables[table_var_name] = conditional
                 return z3p.Const(table_var_name, hole.range())
         if expression.num_args() == 2:
             expression1 = self.substitute_hole_in_expression(expression.arg(0), pairs)
             expression2 = self.substitute_hole_in_expression(expression.arg(1), pairs)
             operator = expression.decl()
             return operator(expression1, expression2)
     return expression
Ejemplo n.º 2
0
def z3_to_python_value(value):
    """
    is_expr: Return `True` if `a` is a Z3 expression, is_expr(1) is False
    """
    assert z3p.is_expr(value)
    if z3p.is_int_value(value):
        return value.as_long()
    elif value.sort() == z3p.BoolSort():
        if z3p.is_true(value):
            return True
        elif z3p.is_false(value):
            return False
    raise NotImplementedError
Ejemplo n.º 3
0
def z3_to_python_value(value):
    """
    is_expr: Return `True` if `a` is a Z3 expression, is_expr(1) is False
    """
    assert z3p.is_expr(value)
    if z3p.is_int_value(value):
        return value.as_long()
    elif value.sort() == z3p.BoolSort():
        if z3p.is_true(value):
            return True
        elif z3p.is_false(value):
            return False
    raise NotImplementedError