@@ -47,14 +47,17 @@ std::pair<exprt, string_constraintst> add_axioms_for_equals(
47
47
48
48
// Axiom 1.
49
49
constraints.existential .push_back (implies_exprt (
50
- eq, equal_exprt (array_pool.get_length (s1), array_pool.get_length (s2))));
50
+ eq,
51
+ equal_exprt (
52
+ array_pool.get_or_create_length (s1),
53
+ array_pool.get_or_create_length (s2))));
51
54
52
55
// Axiom 2.
53
56
constraints.universal .push_back ([&] {
54
57
const symbol_exprt qvar = fresh_symbol (" QA_equal" , index_type);
55
58
return string_constraintt (
56
59
qvar,
57
- zero_if_negative (array_pool.get_length (s1)),
60
+ zero_if_negative (array_pool.get_or_create_length (s1)),
58
61
implies_exprt (eq, equal_exprt (s1[qvar], s2[qvar])));
59
62
}());
60
63
@@ -63,12 +66,15 @@ std::pair<exprt, string_constraintst> add_axioms_for_equals(
63
66
const symbol_exprt witness = fresh_symbol (" witness_unequal" , index_type);
64
67
const exprt zero = from_integer (0 , index_type);
65
68
const and_exprt bound_witness (
66
- binary_relation_exprt (witness, ID_lt, array_pool.get_length (s1)),
69
+ binary_relation_exprt (
70
+ witness, ID_lt, array_pool.get_or_create_length (s1)),
67
71
binary_relation_exprt (witness, ID_ge, zero));
68
72
const and_exprt witnessing (
69
73
bound_witness, notequal_exprt (s1[witness], s2[witness]));
70
74
const and_exprt diff_length (
71
- notequal_exprt (array_pool.get_length (s1), array_pool.get_length (s2)),
75
+ notequal_exprt (
76
+ array_pool.get_or_create_length (s1),
77
+ array_pool.get_or_create_length (s2)),
72
78
equal_exprt (witness, from_integer (-1 , index_type)));
73
79
return implies_exprt (not_exprt (eq), or_exprt (diff_length, witnessing));
74
80
}());
@@ -148,31 +154,36 @@ std::pair<exprt, string_constraintst> add_axioms_for_equals_ignore_case(
148
154
const typet index_type = s1.length_type ();
149
155
150
156
const implies_exprt a1 (
151
- eq, equal_exprt (array_pool.get_length (s1), array_pool.get_length (s2)));
157
+ eq,
158
+ equal_exprt (
159
+ array_pool.get_or_create_length (s1),
160
+ array_pool.get_or_create_length (s2)));
152
161
constraints.existential .push_back (a1);
153
162
154
163
const symbol_exprt qvar = fresh_symbol (" QA_equal_ignore_case" , index_type);
155
164
const exprt constr2 =
156
165
character_equals_ignore_case (s1[qvar], s2[qvar], char_a, char_A, char_Z);
157
166
const string_constraintt a2 (
158
167
qvar,
159
- zero_if_negative (array_pool.get_length (s1)),
168
+ zero_if_negative (array_pool.get_or_create_length (s1)),
160
169
implies_exprt (eq, constr2));
161
170
constraints.universal .push_back (a2);
162
171
163
172
const symbol_exprt witness =
164
173
fresh_symbol (" witness_unequal_ignore_case" , index_type);
165
174
const exprt zero = from_integer (0 , witness.type ());
166
175
const and_exprt bound_witness (
167
- binary_relation_exprt (witness, ID_lt, array_pool.get_length (s1)),
176
+ binary_relation_exprt (witness, ID_lt, array_pool.get_or_create_length (s1)),
168
177
binary_relation_exprt (witness, ID_ge, zero));
169
178
const exprt witness_eq = character_equals_ignore_case (
170
179
s1[witness], s2[witness], char_a, char_A, char_Z);
171
180
const not_exprt witness_diff (witness_eq);
172
181
const implies_exprt a3 (
173
182
not_exprt (eq),
174
183
or_exprt (
175
- notequal_exprt (array_pool.get_length (s1), array_pool.get_length (s2)),
184
+ notequal_exprt (
185
+ array_pool.get_or_create_length (s1),
186
+ array_pool.get_or_create_length (s2)),
176
187
and_exprt (bound_witness, witness_diff)));
177
188
constraints.existential .push_back (a3);
178
189
@@ -207,13 +218,17 @@ string_constraint_generatort::add_axioms_for_hash_code(
207
218
const symbol_exprt i = fresh_symbol (" index_hash" , index_type);
208
219
const equal_exprt c1 (it.second , hash);
209
220
const notequal_exprt c2 (
210
- array_pool.get_length (it.first ), array_pool.get_length (str));
221
+ array_pool.get_or_create_length (it.first ),
222
+ array_pool.get_or_create_length (str));
211
223
const and_exprt c3 (
212
- equal_exprt (array_pool.get_length (it.first ), array_pool.get_length (str)),
224
+ equal_exprt (
225
+ array_pool.get_or_create_length (it.first ),
226
+ array_pool.get_or_create_length (str)),
213
227
and_exprt (
214
228
notequal_exprt (str[i], it.first [i]),
215
229
and_exprt (
216
- greater_than (array_pool.get_length (str), i), is_positive (i))));
230
+ greater_than (array_pool.get_or_create_length (str), i),
231
+ is_positive (i))));
217
232
hash_constraints.existential .push_back (or_exprt (c1, or_exprt (c2, c3)));
218
233
}
219
234
return {hash, std::move (hash_constraints)};
@@ -257,13 +272,15 @@ std::pair<exprt, string_constraintst> add_axioms_for_compare_to(
257
272
const equal_exprt res_null (res, from_integer (0 , return_type));
258
273
const implies_exprt a1 (
259
274
res_null,
260
- equal_exprt (array_pool.get_length (s1), array_pool.get_length (s2)));
275
+ equal_exprt (
276
+ array_pool.get_or_create_length (s1),
277
+ array_pool.get_or_create_length (s2)));
261
278
constraints.existential .push_back (a1);
262
279
263
280
const symbol_exprt i = fresh_symbol (" QA_compare_to" , index_type);
264
281
const string_constraintt a2 (
265
282
i,
266
- zero_if_negative (array_pool.get_length (s1)),
283
+ zero_if_negative (array_pool.get_or_create_length (s1)),
267
284
implies_exprt (res_null, equal_exprt (s1[i], s2[i])));
268
285
constraints.universal .push_back (a2);
269
286
@@ -275,24 +292,31 @@ std::pair<exprt, string_constraintst> add_axioms_for_compare_to(
275
292
const equal_exprt ret_length_diff (
276
293
res,
277
294
minus_exprt (
278
- typecast_exprt (array_pool.get_length (s1), return_type),
279
- typecast_exprt (array_pool.get_length (s2), return_type)));
295
+ typecast_exprt (array_pool.get_or_create_length (s1), return_type),
296
+ typecast_exprt (array_pool.get_or_create_length (s2), return_type)));
280
297
const or_exprt guard1 (
281
298
and_exprt (
282
299
less_than_or_equal_to (
283
- array_pool.get_length (s1), array_pool.get_length (s2)),
284
- greater_than (array_pool.get_length (s1), x)),
300
+ array_pool.get_or_create_length (s1),
301
+ array_pool.get_or_create_length (s2)),
302
+ greater_than (array_pool.get_or_create_length (s1), x)),
285
303
and_exprt (
286
- greater_or_equal_to (array_pool.get_length (s1), array_pool.get_length (s2)),
287
- greater_than (array_pool.get_length (s2), x)));
304
+ greater_or_equal_to (
305
+ array_pool.get_or_create_length (s1),
306
+ array_pool.get_or_create_length (s2)),
307
+ greater_than (array_pool.get_or_create_length (s2), x)));
288
308
const and_exprt cond1 (ret_char_diff, guard1);
289
309
const or_exprt guard2 (
290
310
and_exprt (
291
- greater_than (array_pool.get_length (s2), array_pool.get_length (s1)),
292
- equal_to (array_pool.get_length (s1), x)),
311
+ greater_than (
312
+ array_pool.get_or_create_length (s2),
313
+ array_pool.get_or_create_length (s1)),
314
+ equal_to (array_pool.get_or_create_length (s1), x)),
293
315
and_exprt (
294
- greater_than (array_pool.get_length (s1), array_pool.get_length (s2)),
295
- equal_to (array_pool.get_length (s2), x)));
316
+ greater_than (
317
+ array_pool.get_or_create_length (s1),
318
+ array_pool.get_or_create_length (s2)),
319
+ equal_to (array_pool.get_or_create_length (s2), x)));
296
320
const and_exprt cond2 (ret_length_diff, guard2);
297
321
298
322
const implies_exprt a3 (
0 commit comments