diff --git a/src/solvers/strings/string_constraint_generator.h b/src/solvers/strings/string_constraint_generator.h index f439e5f28b3..729f508e9c4 100644 --- a/src/solvers/strings/string_constraint_generator.h +++ b/src/solvers/strings/string_constraint_generator.h @@ -191,8 +191,6 @@ class string_constraint_generatort final std::pair add_axioms_from_bool(const function_application_exprt &f); std::pair - add_axioms_from_bool(const array_string_exprt &res, const exprt &b); - std::pair add_axioms_from_char(const function_application_exprt &f); std::pair add_axioms_from_char(const array_string_exprt &res, const exprt &c); diff --git a/src/solvers/strings/string_constraint_generator_valueof.cpp b/src/solvers/strings/string_constraint_generator_valueof.cpp index 039557734a1..0017d0e7395 100644 --- a/src/solvers/strings/string_constraint_generator_valueof.cpp +++ b/src/solvers/strings/string_constraint_generator_valueof.cpp @@ -54,57 +54,6 @@ string_constraint_generatort::add_axioms_from_long( return add_axioms_for_string_of_int(res, f.arguments()[2], 0); } -/// Add axioms stating that the returned string equals "true" when the Boolean -/// expression is true and "false" when it is false. -/// \deprecated This is Java specific and should be implemented in Java instead -/// \param res: string expression for the result -/// \param b: Boolean expression -/// \return code 0 on success -DEPRECATED(SINCE(2017, 10, 5, "Java specific, should be implemented in Java")) -std::pair -string_constraint_generatort::add_axioms_from_bool( - const array_string_exprt &res, - const exprt &b) -{ - const typet &char_type = to_type_with_subtype(res.content().type()).subtype(); - PRECONDITION(b.type() == bool_typet() || b.type().id() == ID_c_bool); - string_constraintst constraints; - typecast_exprt eq(b, bool_typet()); - - // We add axioms: - // a1 : eq => res = |"true"| - // a2 : forall i < |"true"|. eq => res[i]="true"[i] - // a3 : !eq => res = |"false"| - // a4 : forall i < |"false"|. !eq => res[i]="false"[i] - - std::string str_true = "true"; - const implies_exprt a1( - eq, equal_to(array_pool.get_or_create_length(res), str_true.length())); - constraints.existential.push_back(a1); - - for(std::size_t i = 0; i < str_true.length(); i++) - { - exprt chr = from_integer(str_true[i], char_type); - implies_exprt a2(eq, equal_exprt(res[i], chr)); - constraints.existential.push_back(a2); - } - - std::string str_false = "false"; - const implies_exprt a3( - not_exprt(eq), - equal_to(array_pool.get_or_create_length(res), str_false.length())); - constraints.existential.push_back(a3); - - for(std::size_t i = 0; i < str_false.length(); i++) - { - exprt chr = from_integer(str_false[i], char_type); - implies_exprt a4(not_exprt(eq), equal_exprt(res[i], chr)); - constraints.existential.push_back(a4); - } - - return {from_integer(0, get_return_code_type()), std::move(constraints)}; -} - /// Add axioms enforcing that the string corresponds to the result /// of String.valueOf(I) or String.valueOf(J) Java functions applied /// on the integer expression. diff --git a/src/solvers/strings/string_format_builtin_function.cpp b/src/solvers/strings/string_format_builtin_function.cpp index 14e32a86e8c..1d8df30b389 100644 --- a/src/solvers/strings/string_format_builtin_function.cpp +++ b/src/solvers/strings/string_format_builtin_function.cpp @@ -172,9 +172,48 @@ add_axioms_for_format_specifier( return {res, constraints}; } case format_specifiert::BOOLEAN: - return_code = generator.add_axioms_from_bool( - res, format_arg_from_string(string_arg, ID_boolean, array_pool)); - return {res, std::move(return_code.second)}; + { + // Inlined from deprecated add_axioms_from_bool + // Add axioms stating that the returned string equals "true" when the + // Boolean expression is true and "false" when it is false. + const exprt b = format_arg_from_string(string_arg, ID_boolean, array_pool); + const typet &char_type = + to_type_with_subtype(res.content().type()).subtype(); + typecast_exprt eq(b, bool_typet()); + + // We add axioms: + // a1 : eq => res = |"true"| + // a2 : forall i < |"true"|. eq => res[i]="true"[i] + // a3 : !eq => res = |"false"| + // a4 : forall i < |"false"|. !eq => res[i]="false"[i] + + std::string str_true = "true"; + const implies_exprt a1( + eq, equal_to(array_pool.get_or_create_length(res), str_true.length())); + constraints.existential.push_back(a1); + + for(std::size_t i = 0; i < str_true.length(); i++) + { + exprt chr = from_integer(str_true[i], char_type); + implies_exprt a2(eq, equal_exprt(res[i], chr)); + constraints.existential.push_back(a2); + } + + std::string str_false = "false"; + const implies_exprt a3( + not_exprt(eq), + equal_to(array_pool.get_or_create_length(res), str_false.length())); + constraints.existential.push_back(a3); + + for(std::size_t i = 0; i < str_false.length(); i++) + { + exprt chr = from_integer(str_false[i], char_type); + implies_exprt a4(not_exprt(eq), equal_exprt(res[i], chr)); + constraints.existential.push_back(a4); + } + + return {res, constraints}; + } case format_specifiert::STRING: { const exprt arg_string = string_arg;