@@ -27,6 +27,7 @@ Date: February 2016
27
27
#include < util/format_type.h>
28
28
#include < util/fresh_symbol.h>
29
29
#include < util/mathematical_types.h>
30
+ #include < util/mathematical_expr.h>
30
31
#include < util/message.h>
31
32
#include < util/pointer_offset_size.h>
32
33
#include < util/pointer_predicates.h>
@@ -169,41 +170,44 @@ void code_contractst::add_quantified_variable(
169
170
irep_idt mode)
170
171
{
171
172
if (
172
- expression.id () == ID_not || expression.id () == ID_notequal ||
173
- expression.id () == ID_typecast)
173
+ expression.id () == ID_not || expression.id () == ID_typecast)
174
174
{
175
175
// For unary connectives, recursively check for
176
176
// nested quantified formulae in the term
177
- exprt term = expression.operands ().at (0 );
177
+ unary_exprt unary_expression = to_unary_expr (expression);
178
+ exprt term = unary_expression.operands ().at (0 );
178
179
add_quantified_variable (term, replace, mode);
179
180
}
180
181
if (
181
182
expression.id () == ID_and || expression.id () == ID_or ||
182
- expression.id () == ID_implies)
183
+ expression.id () == ID_notequal || expression. id () == ID_implies)
183
184
{
184
185
// For binary connectives, recursively check for
185
186
// nested quantified formulae in the left and right terms
186
- exprt left = expression.operands ().at (0 );
187
+ binary_exprt binary_expression = to_binary_expr (expression);
188
+ exprt left = binary_expression.operands ().at (0 );
187
189
add_quantified_variable (left, replace, mode);
188
- exprt right = expression .operands ().at (1 );
190
+ exprt right = binary_expression .operands ().at (1 );
189
191
add_quantified_variable (right, replace, mode);
190
192
}
191
193
if (expression.id () == ID_if)
192
194
{
193
195
// For ternary connectives, recursively check for
194
196
// nested quantified formulae in all three terms
195
- exprt condition = expression.operands ().at (0 );
197
+ if_exprt if_expression = to_if_expr (expression);
198
+ exprt condition = if_expression.operands ().at (0 );
196
199
add_quantified_variable (condition, replace, mode);
197
- exprt first = expression .operands ().at (1 );
200
+ exprt first = if_expression .operands ().at (1 );
198
201
add_quantified_variable (first, replace, mode);
199
- exprt second = expression .operands ().at (2 );
202
+ exprt second = if_expression .operands ().at (2 );
200
203
add_quantified_variable (second, replace, mode);
201
204
}
202
205
else if (expression.id () == ID_exists || expression.id () == ID_forall)
203
206
{
204
- // When a quantified expression is found,
207
+ // When a quantifier expression is found,
205
208
// 1. get quantified symbol
206
- exprt tuple = expression.operands ().at (0 );
209
+ quantifier_exprt quantifier_expression = to_quantifier_expr (expression);
210
+ exprt tuple = quantifier_expression.operands ().at (0 );
207
211
exprt quantified_variable = tuple.operands ().at (0 );
208
212
symbol_exprt quantified_symbol = to_symbol_expr (quantified_variable);
209
213
@@ -222,7 +226,7 @@ void code_contractst::add_quantified_variable(
222
226
replace.insert (q, new_symbol.symbol_expr ());
223
227
224
228
// 4. recursively check for nested quantified formulae
225
- exprt quantified_expression = expression .operands ().at (1 );
229
+ exprt quantified_expression = quantifier_expression .operands ().at (1 );
226
230
add_quantified_variable (quantified_expression, replace, mode);
227
231
}
228
232
}
0 commit comments