CBMC
string_builtin_function.h
Go to the documentation of this file.
1 
4 #ifndef CPROVER_SOLVERS_REFINEMENT_STRING_BUILTIN_FUNCTION_H
5 #define CPROVER_SOLVERS_REFINEMENT_STRING_BUILTIN_FUNCTION_H
6 
8 
10 #include <util/optional.h>
11 #include <util/string_expr.h>
12 
13 #include <vector>
14 
15 #define CHARACTER_FOR_UNKNOWN '?'
16 
73 {
74 public:
75  string_builtin_functiont() = delete;
77  virtual ~string_builtin_functiont() = default;
78 
80  {
81  return {};
82  }
83 
84  virtual std::vector<array_string_exprt> string_arguments() const
85  {
86  return {};
87  }
88 
93  virtual optionalt<exprt>
94  eval(const std::function<exprt(const exprt &)> &get_value) const = 0;
95 
96  virtual std::string name() const = 0;
97 
104  virtual string_constraintst
106 
109  virtual exprt length_constraint() const = 0;
110 
112 
116  virtual bool maybe_testing_function() const
117  {
118  return true;
119  }
120 
121 protected:
123 
126  {
127  }
128 };
129 
132 {
133 public:
136 
143  result(std::move(result)),
144  input(std::move(input))
145  {
146  }
147 
154  const exprt &return_code,
155  const std::vector<exprt> &fun_args,
157 
159  {
160  return result;
161  }
162  std::vector<array_string_exprt> string_arguments() const override
163  {
164  return {input};
165  }
166  bool maybe_testing_function() const override
167  {
168  return false;
169  }
170 };
171 
175 {
176 public:
178 
184  const exprt &return_code,
185  const std::vector<exprt> &fun_args,
188  {
189  PRECONDITION(fun_args.size() == 4);
190  character = fun_args[3];
191  }
192 
194  eval(const std::function<exprt(const exprt &)> &get_value) const override;
195 
196  std::string name() const override
197  {
198  return "concat_char";
199  }
200 
202  string_constraint_generatort &generator,
203  message_handlert &message_handlert) const override;
204 
205  exprt length_constraint() const override;
206 };
207 
211 {
212 public:
215 
221  const exprt &return_code,
222  const std::vector<exprt> &fun_args,
225  {
226  PRECONDITION(fun_args.size() == 5);
227  position = fun_args[3];
228  character = fun_args[4];
229  }
230 
232  eval(const std::function<exprt(const exprt &)> &get_value) const override;
233 
234  std::string name() const override
235  {
236  return "set_char";
237  }
238 
240  string_constraint_generatort &generator,
241  message_handlert &message_handler) const override;
242 
243  // \todo: length_constraint is not the best possible name because we also
244  // \todo: add constraint about the return code
245  exprt length_constraint() const override;
246 };
247 
252 {
253 public:
255  const exprt &return_code,
256  const std::vector<exprt> &fun_args,
259  {
260  }
261 
263  eval(const std::function<exprt(const exprt &)> &get_value) const override;
264 
265  std::string name() const override
266  {
267  return "to_lower_case";
268  }
269 
271  string_constraint_generatort &generator,
272  message_handlert &message_handler) const override;
273 
274  exprt length_constraint() const override
275  {
276  return and_exprt(
277  equal_exprt(
281  };
282 };
283 
288 {
289 public:
291  const exprt &return_code,
292  const std::vector<exprt> &fun_args,
295  {
296  }
297 
304  std::move(return_code),
305  std::move(result),
306  std::move(input),
307  array_pool)
308  {
309  }
310 
312  eval(const std::function<exprt(const exprt &)> &get_value) const override;
313 
314  std::string name() const override
315  {
316  return "to_upper_case";
317  }
318 
320  class symbol_generatort &fresh_symbol,
321  message_handlert &message_handler) const;
322 
324  string_constraint_generatort &generator,
325  message_handlert &message_handler) const override
326  {
327  return constraints(generator.fresh_symbol, message_handler);
328  };
329 
330  exprt length_constraint() const override
331  {
332  return and_exprt(
333  equal_exprt(
337  };
338 };
339 
342 {
343 public:
346 
348  const exprt &return_code,
349  const std::vector<exprt> &fun_args,
351 
353  {
354  return result;
355  }
356 
357  bool maybe_testing_function() const override
358  {
359  return false;
360  }
361 };
362 
365 {
366 public:
368  const exprt &return_code,
369  const std::vector<exprt> &fun_args,
372  {
373  PRECONDITION(fun_args.size() <= 4);
374  if(fun_args.size() == 4)
375  radix = fun_args[3];
376  else
377  radix = from_integer(10, arg.type());
378  };
379 
381  eval(const std::function<exprt(const exprt &)> &get_value) const override;
382 
383  std::string name() const override
384  {
385  return "string_of_int";
386  }
387 
389  string_constraint_generatort &generator,
390  message_handlert &message_handler) const override;
391 
392  exprt length_constraint() const override;
393 
394 private:
396 };
397 
400 {
401 public:
403  std::vector<array_string_exprt> under_test;
404  std::vector<exprt> args;
405  std::vector<array_string_exprt> string_arguments() const override
406  {
407  return under_test;
408  }
409 };
410 
416 {
417 public:
420  std::vector<array_string_exprt> string_args;
421  std::vector<exprt> args;
422 
424  const exprt &return_code,
427 
428  std::string name() const override
429  {
430  PRECONDITION(function_application.function().id() == ID_symbol);
431  return id2string(
433  }
434  std::vector<array_string_exprt> string_arguments() const override
435  {
436  return std::vector<array_string_exprt>(string_args);
437  }
439  {
440  return string_res;
441  }
442 
444  eval(const std::function<exprt(const exprt &)> &) const override
445  {
446  return {};
447  }
448 
450  string_constraint_generatort &generator,
451  message_handlert &message_handler) const override;
452 
453  exprt length_constraint() const override
454  {
455  // For now, there is no need for implementing that as `constraints`
456  // should always be called on these functions
458  }
459 };
460 
465  const array_string_exprt &a,
466  const std::function<exprt(const exprt &)> &get_value);
467 
470  const std::vector<mp_integer> &array,
471  const array_typet &array_type);
472 
473 #endif // CPROVER_SOLVERS_REFINEMENT_STRING_BUILTIN_FUNCTION_H
string_builtin_functiont::maybe_testing_function
virtual bool maybe_testing_function() const
Tells whether the builtin function can be a testing function, that is a function that does not return...
Definition: string_builtin_function.h:116
string_to_upper_case_builtin_functiont::constraints
string_constraintst constraints(string_constraint_generatort &generator, message_handlert &message_handler) const override
Add constraints ensuring that the value of result expression of the builtin function corresponds to t...
Definition: string_builtin_function.h:323
make_string
array_string_exprt make_string(const std::vector< mp_integer > &array, const array_typet &array_type)
Make a string from a constant array.
Definition: string_builtin_function.cpp:71
string_creation_builtin_functiont::maybe_testing_function
bool maybe_testing_function() const override
Tells whether the builtin function can be a testing function, that is a function that does not return...
Definition: string_builtin_function.h:357
string_of_int_builtin_functiont::radix
exprt radix
Definition: string_builtin_function.h:395
UNIMPLEMENTED
#define UNIMPLEMENTED
Definition: invariant.h:525
string_test_builtin_functiont::result
exprt result
Definition: string_builtin_function.h:402
string_builtin_functiont::~string_builtin_functiont
virtual ~string_builtin_functiont()=default
string_to_lower_case_builtin_functiont::name
std::string name() const override
Definition: string_builtin_function.h:265
string_to_lower_case_builtin_functiont::length_constraint
exprt length_constraint() const override
Constraint ensuring that the length of the strings are coherent with the function call.
Definition: string_builtin_function.h:274
string_builtin_function_with_no_evalt::name
std::string name() const override
Definition: string_builtin_function.h:428
string_to_upper_case_builtin_functiont::constraints
string_constraintst constraints(class symbol_generatort &fresh_symbol, message_handlert &message_handler) const
Set of constraints ensuring result corresponds to input in which lowercase characters of Basic Latin ...
Definition: string_builtin_function.cpp:343
array_poolt
Correspondance between arrays and pointers string representations.
Definition: array_pool.h:41
optional.h
string_builtin_functiont::return_code
exprt return_code
Definition: string_builtin_function.h:111
string_transformation_builtin_functiont
String builtin_function transforming one string into another.
Definition: string_builtin_function.h:131
string_of_int_builtin_functiont::length_constraint
exprt length_constraint() const override
Constraint ensuring that the length of the strings are coherent with the function call.
Definition: string_builtin_function.cpp:427
string_constraint_generatort::fresh_symbol
symbol_generatort fresh_symbol
Definition: string_constraint_generator.h:61
string_builtin_function_with_no_evalt::constraints
string_constraintst constraints(string_constraint_generatort &generator, message_handlert &message_handler) const override
Add constraints ensuring that the value of result expression of the builtin function corresponds to t...
Definition: string_builtin_function.cpp:487
and_exprt
Boolean AND.
Definition: std_expr.h:2070
string_set_char_builtin_functiont::position
exprt position
Definition: string_builtin_function.h:213
array_poolt::get_or_create_length
exprt get_or_create_length(const array_string_exprt &s)
Get the length of an array_string_exprt from the array_pool.
Definition: array_pool.cpp:26
string_to_lower_case_builtin_functiont::string_to_lower_case_builtin_functiont
string_to_lower_case_builtin_functiont(const exprt &return_code, const std::vector< exprt > &fun_args, array_poolt &array_pool)
Definition: string_builtin_function.h:254
string_builtin_function_with_no_evalt::function_application
function_application_exprt function_application
Definition: string_builtin_function.h:418
string_creation_builtin_functiont
String creation from other types.
Definition: string_builtin_function.h:341
exprt
Base class for all expressions.
Definition: expr.h:55
string_builtin_function_with_no_evalt::string_args
std::vector< array_string_exprt > string_args
Definition: string_builtin_function.h:420
string_to_upper_case_builtin_functiont::eval
optionalt< exprt > eval(const std::function< exprt(const exprt &)> &get_value) const override
Given a function get_value which gives a valuation to expressions, attempt to find the result of the ...
Definition: string_builtin_function.cpp:316
string_concat_char_builtin_functiont::string_concat_char_builtin_functiont
string_concat_char_builtin_functiont(const exprt &return_code, const std::vector< exprt > &fun_args, array_poolt &array_pool)
Constructor from arguments of a function application.
Definition: string_builtin_function.h:183
string_of_int_builtin_functiont::string_of_int_builtin_functiont
string_of_int_builtin_functiont(const exprt &return_code, const std::vector< exprt > &fun_args, array_poolt &array_pool)
Definition: string_builtin_function.h:367
string_constraintst
Collection of constraints of different types: existential formulas, universal formulas,...
Definition: string_constraint_generator.h:38
string_builtin_function_with_no_evalt::args
std::vector< exprt > args
Definition: string_builtin_function.h:421
string_to_lower_case_builtin_functiont
Converting each uppercase character of Basic Latin and Latin-1 supplement to the corresponding lowerc...
Definition: string_builtin_function.h:250
string_builtin_functiont::string_result
virtual optionalt< array_string_exprt > string_result() const
Definition: string_builtin_function.h:79
string_to_lower_case_builtin_functiont::eval
optionalt< exprt > eval(const std::function< exprt(const exprt &)> &get_value) const override
Given a function get_value which gives a valuation to expressions, attempt to find the result of the ...
Definition: string_builtin_function.cpp:220
equal_exprt
Equality.
Definition: std_expr.h:1305
string_builtin_functiont::string_arguments
virtual std::vector< array_string_exprt > string_arguments() const
Definition: string_builtin_function.h:84
string_constraint_generatort
Definition: string_constraint_generator.h:47
string_set_char_builtin_functiont::string_set_char_builtin_functiont
string_set_char_builtin_functiont(const exprt &return_code, const std::vector< exprt > &fun_args, array_poolt &array_pool)
Constructor from arguments of a function application.
Definition: string_builtin_function.h:220
string_builtin_functiont::array_pool
array_poolt & array_pool
Definition: string_builtin_function.h:122
string_to_lower_case_builtin_functiont::constraints
string_constraintst constraints(string_constraint_generatort &generator, message_handlert &message_handler) const override
Set of constraints ensuring result corresponds to input in which uppercase characters have been conve...
Definition: string_builtin_function.cpp:285
string_concat_char_builtin_functiont::name
std::string name() const override
Definition: string_builtin_function.h:196
string_set_char_builtin_functiont::constraints
string_constraintst constraints(string_constraint_generatort &generator, message_handlert &message_handler) const override
Set of constraints ensuring that result is similar to input where the character at index position is ...
Definition: string_builtin_function.cpp:154
exprt::type
typet & type()
Return the type of the expression.
Definition: expr.h:84
string_concat_char_builtin_functiont::length_constraint
exprt length_constraint() const override
Constraint ensuring that the length of the strings are coherent with the function call.
Definition: string_builtin_function.cpp:124
string_transformation_builtin_functiont::input
array_string_exprt input
Definition: string_builtin_function.h:135
symbol_generatort
Generation of fresh symbols of a given type.
Definition: array_pool.h:21
string_builtin_function_with_no_evalt
Functions that are not yet supported in this class but are supported by string_constraint_generatort.
Definition: string_builtin_function.h:415
string_to_upper_case_builtin_functiont
Converting each lowercase character of Basic Latin and Latin-1 supplement to the corresponding upperc...
Definition: string_builtin_function.h:286
string_set_char_builtin_functiont::name
std::string name() const override
Definition: string_builtin_function.h:234
string_builtin_function_with_no_evalt::string_builtin_function_with_no_evalt
string_builtin_function_with_no_evalt(const exprt &return_code, const function_application_exprt &f, array_poolt &array_pool)
Definition: string_builtin_function.cpp:457
string_set_char_builtin_functiont::length_constraint
exprt length_constraint() const override
Constraint ensuring that the length of the strings are coherent with the function call.
Definition: string_builtin_function.cpp:191
id2string
const std::string & id2string(const irep_idt &d)
Definition: irep.h:47
string_test_builtin_functiont::args
std::vector< exprt > args
Definition: string_builtin_function.h:404
string_builtin_function_with_no_evalt::length_constraint
exprt length_constraint() const override
Constraint ensuring that the length of the strings are coherent with the function call.
Definition: string_builtin_function.h:453
PRECONDITION
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
symbol_exprt::get_identifier
const irep_idt & get_identifier() const
Definition: std_expr.h:142
string_test_builtin_functiont::string_arguments
std::vector< array_string_exprt > string_arguments() const override
Definition: string_builtin_function.h:405
string_test_builtin_functiont::under_test
std::vector< array_string_exprt > under_test
Definition: string_builtin_function.h:403
string_builtin_functiont::string_builtin_functiont
string_builtin_functiont(exprt return_code, array_poolt &array_pool)
Definition: string_builtin_function.h:124
string_concat_char_builtin_functiont::constraints
string_constraintst constraints(string_constraint_generatort &generator, message_handlert &message_handlert) const override
Set of constraints enforcing that result is the concatenation of input with character.
Definition: string_builtin_function.cpp:103
function_application_exprt
Application of (mathematical) function.
Definition: mathematical_expr.h:196
string_concat_char_builtin_functiont::character
exprt character
Definition: string_builtin_function.h:177
string_of_int_builtin_functiont
String creation from integer types.
Definition: string_builtin_function.h:364
string_to_upper_case_builtin_functiont::string_to_upper_case_builtin_functiont
string_to_upper_case_builtin_functiont(exprt return_code, array_string_exprt result, array_string_exprt input, array_poolt &array_pool)
Definition: string_builtin_function.h:298
to_symbol_expr
const symbol_exprt & to_symbol_expr(const exprt &expr)
Cast an exprt to a symbol_exprt.
Definition: std_expr.h:222
irept::id
const irep_idt & id() const
Definition: irep.h:396
message_handlert
Definition: message.h:27
string_concat_char_builtin_functiont::eval
optionalt< exprt > eval(const std::function< exprt(const exprt &)> &get_value) const override
Given a function get_value which gives a valuation to expressions, attempt to find the result of the ...
Definition: string_builtin_function.cpp:76
eval_string
optionalt< std::vector< mp_integer > > eval_string(const array_string_exprt &a, const std::function< exprt(const exprt &)> &get_value)
Given a function get_value which gives a valuation to expressions, attempt to find the current value ...
Definition: string_builtin_function.cpp:24
string_builtin_function_with_no_evalt::string_result
optionalt< array_string_exprt > string_result() const override
Definition: string_builtin_function.h:438
string_builtin_functiont::string_builtin_functiont
string_builtin_functiont()=delete
optionalt
nonstd::optional< T > optionalt
Definition: optional.h:35
string_builtin_functiont
Base class for string functions that are built in the solver.
Definition: string_builtin_function.h:72
string_transformation_builtin_functiont::string_arguments
std::vector< array_string_exprt > string_arguments() const override
Definition: string_builtin_function.h:162
string_transformation_builtin_functiont::string_result
optionalt< array_string_exprt > string_result() const override
Definition: string_builtin_function.h:158
string_builtin_functiont::eval
virtual optionalt< exprt > eval(const std::function< exprt(const exprt &)> &get_value) const =0
Given a function get_value which gives a valuation to expressions, attempt to find the result of the ...
string_of_int_builtin_functiont::constraints
string_constraintst constraints(string_constraint_generatort &generator, message_handlert &message_handler) const override
Add constraints ensuring that the value of result expression of the builtin function corresponds to t...
Definition: string_builtin_function.cpp:417
string_to_upper_case_builtin_functiont::name
std::string name() const override
Definition: string_builtin_function.h:314
string_of_int_builtin_functiont::name
std::string name() const override
Definition: string_builtin_function.h:383
string_set_char_builtin_functiont
Setting a character at a particular position of a string.
Definition: string_builtin_function.h:209
string_builtin_function_with_no_evalt::string_res
optionalt< array_string_exprt > string_res
Definition: string_builtin_function.h:419
array_typet
Arrays with given size.
Definition: std_types.h:762
function_application_exprt::function
exprt & function()
Definition: mathematical_expr.h:205
string_creation_builtin_functiont::result
array_string_exprt result
Definition: string_builtin_function.h:344
from_integer
constant_exprt from_integer(const mp_integer &int_value, const typet &type)
Definition: arith_tools.cpp:100
string_concat_char_builtin_functiont
Adding a character at the end of a string.
Definition: string_builtin_function.h:173
string_transformation_builtin_functiont::string_transformation_builtin_functiont
string_transformation_builtin_functiont(exprt return_code, array_string_exprt result, array_string_exprt input, array_poolt &array_pool)
Definition: string_builtin_function.h:137
string_creation_builtin_functiont::arg
exprt arg
Definition: string_builtin_function.h:345
string_builtin_functiont::length_constraint
virtual exprt length_constraint() const =0
Constraint ensuring that the length of the strings are coherent with the function call.
string_builtin_functiont::constraints
virtual string_constraintst constraints(string_constraint_generatort &, message_handlert &) const =0
Add constraints ensuring that the value of result expression of the builtin function corresponds to t...
string_transformation_builtin_functiont::maybe_testing_function
bool maybe_testing_function() const override
Tells whether the builtin function can be a testing function, that is a function that does not return...
Definition: string_builtin_function.h:166
string_set_char_builtin_functiont::eval
optionalt< exprt > eval(const std::function< exprt(const exprt &)> &get_value) const override
Given a function get_value which gives a valuation to expressions, attempt to find the result of the ...
Definition: string_builtin_function.cpp:129
string_builtin_functiont::name
virtual std::string name() const =0
string_test_builtin_functiont
String test.
Definition: string_builtin_function.h:399
string_set_char_builtin_functiont::character
exprt character
Definition: string_builtin_function.h:214
string_to_upper_case_builtin_functiont::length_constraint
exprt length_constraint() const override
Constraint ensuring that the length of the strings are coherent with the function call.
Definition: string_builtin_function.h:330
string_to_upper_case_builtin_functiont::string_to_upper_case_builtin_functiont
string_to_upper_case_builtin_functiont(const exprt &return_code, const std::vector< exprt > &fun_args, array_poolt &array_pool)
Definition: string_builtin_function.h:290
string_constraint_generator.h
string_expr.h
string_creation_builtin_functiont::string_result
optionalt< array_string_exprt > string_result() const override
Definition: string_builtin_function.h:352
string_transformation_builtin_functiont::result
array_string_exprt result
Definition: string_builtin_function.h:134
array_string_exprt
Definition: string_expr.h:66
string_builtin_function_with_no_evalt::eval
optionalt< exprt > eval(const std::function< exprt(const exprt &)> &) const override
Given a function get_value which gives a valuation to expressions, attempt to find the result of the ...
Definition: string_builtin_function.h:444
string_builtin_function_with_no_evalt::string_arguments
std::vector< array_string_exprt > string_arguments() const override
Definition: string_builtin_function.h:434
string_creation_builtin_functiont::string_creation_builtin_functiont
string_creation_builtin_functiont(const exprt &return_code, const std::vector< exprt > &fun_args, array_poolt &array_pool)
Constructor from arguments of a function application.
Definition: string_builtin_function.cpp:372
mathematical_expr.h
string_of_int_builtin_functiont::eval
optionalt< exprt > eval(const std::function< exprt(const exprt &)> &get_value) const override
Given a function get_value which gives a valuation to expressions, attempt to find the result of the ...
Definition: string_builtin_function.cpp:383