@@ -137,6 +137,35 @@ std::vector<mp_integer> string_concatenation_builtin_functiont::eval(
137
137
return result;
138
138
}
139
139
140
+ string_constraintst string_concatenation_builtin_functiont::constraints (
141
+ string_constraint_generatort &generator) const
142
+
143
+ {
144
+ auto pair = [&]() -> std::pair<exprt, string_constraintst> {
145
+ if (args.size () == 0 )
146
+ return add_axioms_for_concat (
147
+ generator.fresh_symbol , result, input1, input2);
148
+ if (args.size () == 2 )
149
+ {
150
+ return add_axioms_for_concat_substr (
151
+ generator.fresh_symbol , result, input1, input2, args[0 ], args[1 ]);
152
+ }
153
+ UNREACHABLE;
154
+ }();
155
+ pair.second .existential .push_back (equal_exprt (pair.first , return_code));
156
+ return pair.second ;
157
+ }
158
+
159
+ exprt string_concatenation_builtin_functiont::length_constraint () const
160
+ {
161
+ if (args.size () == 0 )
162
+ return length_constraint_for_concat (result, input1, input2);
163
+ if (args.size () == 2 )
164
+ return length_constraint_for_concat_substr (
165
+ result, input1, input2, args[0 ], args[1 ]);
166
+ UNREACHABLE;
167
+ }
168
+
140
169
optionalt<exprt> string_concat_char_builtin_functiont::eval (
141
170
const std::function<exprt(const exprt &)> &get_value) const
142
171
{
@@ -158,6 +187,20 @@ optionalt<exprt> string_concat_char_builtin_functiont::eval(
158
187
return make_string (input_opt.value (), type);
159
188
}
160
189
190
+ string_constraintst string_concat_char_builtin_functiont::constraints (
191
+ string_constraint_generatort &generator) const
192
+ {
193
+ auto pair = add_axioms_for_concat_char (
194
+ generator.fresh_symbol , result, input, character);
195
+ pair.second .existential .push_back (equal_exprt (pair.first , return_code));
196
+ return pair.second ;
197
+ }
198
+
199
+ exprt string_concat_char_builtin_functiont::length_constraint () const
200
+ {
201
+ return length_constraint_for_concat_char (result, input);
202
+ }
203
+
161
204
optionalt<exprt> string_set_char_builtin_functiont::eval (
162
205
const std::function<exprt(const exprt &)> &get_value) const
163
206
{
@@ -174,6 +217,15 @@ optionalt<exprt> string_set_char_builtin_functiont::eval(
174
217
return make_string (input_opt.value (), type);
175
218
}
176
219
220
+ string_constraintst string_set_char_builtin_functiont::constraints (
221
+ string_constraint_generatort &generator) const
222
+ {
223
+ auto pair = add_axioms_for_set_char (
224
+ generator.fresh_symbol , result, input, position, character);
225
+ pair.second .existential .push_back (equal_exprt (pair.first , return_code));
226
+ return pair.second ;
227
+ }
228
+
177
229
exprt string_set_char_builtin_functiont::length_constraint () const
178
230
{
179
231
const exprt out_of_bounds = or_exprt (
@@ -284,6 +336,30 @@ optionalt<exprt> string_insertion_builtin_functiont::eval(
284
336
return make_string (result_value, type);
285
337
}
286
338
339
+ string_constraintst string_insertion_builtin_functiont::constraints (
340
+ string_constraint_generatort &generator) const
341
+ {
342
+ if (args.size () == 1 )
343
+ {
344
+ auto pair = add_axioms_for_insert (
345
+ generator.fresh_symbol , result, input1, input2, args[0 ]);
346
+ pair.second .existential .push_back (equal_exprt (pair.first , return_code));
347
+ return pair.second ;
348
+ }
349
+ if (args.size () == 3 )
350
+ UNIMPLEMENTED;
351
+ UNREACHABLE;
352
+ }
353
+
354
+ exprt string_insertion_builtin_functiont::length_constraint () const
355
+ {
356
+ if (args.size () == 1 )
357
+ return length_constraint_for_insert (result, input1, input2);
358
+ if (args.size () == 3 )
359
+ UNIMPLEMENTED;
360
+ UNREACHABLE;
361
+ }
362
+
287
363
// / Constructor from arguments of a function application.
288
364
// / The arguments in `fun_args` should be in order:
289
365
// / an integer `result.length`, a character pointer `&result[0]`,
@@ -333,6 +409,20 @@ optionalt<exprt> string_of_int_builtin_functiont::eval(
333
409
right_to_left_characters.rbegin (), right_to_left_characters.rend (), type);
334
410
}
335
411
412
+ string_constraintst string_of_int_builtin_functiont::constraints (
413
+ string_constraint_generatort &generator) const
414
+ {
415
+ auto pair = add_axioms_for_string_of_int_with_radix (
416
+ generator.fresh_symbol ,
417
+ result,
418
+ arg,
419
+ radix,
420
+ 0 ,
421
+ generator.ns );
422
+ pair.second .existential .push_back (equal_exprt (pair.first , return_code));
423
+ return pair.second ;
424
+ }
425
+
336
426
exprt string_of_int_builtin_functiont::length_constraint () const
337
427
{
338
428
const typet &type = result.length ().type ();
@@ -391,3 +481,12 @@ string_builtin_function_with_no_evalt::string_builtin_function_with_no_evalt(
391
481
args.push_back (fun_args[i]);
392
482
}
393
483
}
484
+
485
+ string_constraintst string_builtin_function_with_no_evalt::constraints (
486
+ string_constraint_generatort &generator) const
487
+ {
488
+ auto pair = generator.add_axioms_for_function_application (
489
+ generator.fresh_symbol , function_application);
490
+ pair.second .existential .push_back (equal_exprt (pair.first , return_code));
491
+ return pair.second ;
492
+ }
0 commit comments