Skip to content

Commit e333b06

Browse files
Make equations of type exprt instead of equal_exprt
Accept formulas that are not equations as input. This is to make the solver more robust to different kind of formulas. In particular, formulas of the form `guard1 => result = some_string_builin_function(s)` should be accepted.
1 parent 7a6526d commit e333b06

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

src/solvers/strings/string_refinement.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ Author: Alberto Griggio, [email protected]
2727
#include <util/expr_iterator.h>
2828
#include <util/expr_util.h>
2929
#include <util/magic.h>
30+
#include <util/range.h>
3031
#include <util/simplify_expr.h>
3132

3233
#include "equation_symbol_mapping.h"
@@ -306,16 +307,19 @@ void string_refinementt::set_to(const exprt &expr, bool value)
306307
/// by an equation are associated to the same element
307308
static void add_equations_for_symbol_resolution(
308309
union_find_replacet &symbol_solver,
309-
const std::vector<equal_exprt> &equations,
310+
const std::vector<exprt> &equations,
310311
const namespacet &ns,
311312
messaget::mstreamt &stream)
312313
{
313314
const std::string log_message =
314315
"WARNING string_refinement.cpp generate_symbol_resolution_from_equations:";
315-
for(const equal_exprt &eq : equations)
316+
auto equalities = make_range(equations).filter(
317+
[&](const exprt &e) { return can_cast_expr<equal_exprt>(e); });
318+
for(const exprt &e : equalities)
316319
{
317-
const exprt &lhs = eq.lhs();
318-
const exprt &rhs = eq.rhs();
320+
const equal_exprt &eq = to_equal_expr(e);
321+
const exprt &lhs = to_equal_expr(eq).lhs();
322+
const exprt &rhs = to_equal_expr(eq).rhs();
319323
if(lhs.id() != ID_symbol)
320324
{
321325
stream << log_message << "non symbol lhs: " << format(lhs)
@@ -537,11 +541,10 @@ union_find_replacet string_identifiers_resolution_from_equations(
537541
/// Output a vector of equations to the given stream, used for debugging.
538542
static void output_equations(
539543
std::ostream &output,
540-
const std::vector<equal_exprt> &equations)
544+
const std::vector<exprt> &equations)
541545
{
542546
for(std::size_t i = 0; i < equations.size(); ++i)
543-
output << " [" << i << "] " << format(equations[i].lhs())
544-
<< " == " << format(equations[i].rhs()) << std::endl;
547+
output << " [" << i << "] " << format(equations[i]) << std::endl;
545548
}
546549
#endif
547550

@@ -630,7 +633,18 @@ decision_proceduret::resultt string_refinementt::dec_solve()
630633
#endif
631634

632635
const union_find_replacet string_id_symbol_resolve =
633-
string_identifiers_resolution_from_equations(equations, ns, log.debug());
636+
string_identifiers_resolution_from_equations(
637+
[&] {
638+
std::vector<equal_exprt> equalities;
639+
for(const auto &eq : equations)
640+
{
641+
if(auto equal_expr = expr_try_dynamic_cast<equal_exprt>(eq))
642+
equalities.push_back(*equal_expr);
643+
}
644+
return equalities;
645+
}(),
646+
ns,
647+
log.debug());
634648
#ifdef DEBUG
635649
log.debug() << "symbol resolve string:" << messaget::eom;
636650
for(const auto &pair : string_id_symbol_resolve.to_vector())
@@ -643,7 +657,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
643657
log.debug() << "dec_solve: Replacing string ids and simplifying arguments"
644658
" in function applications"
645659
<< messaget::eom;
646-
for(equal_exprt &expr : equations)
660+
for(exprt &expr : equations)
647661
{
648662
auto it = expr.depth_begin();
649663
while(it != expr.depth_end())
@@ -675,12 +689,12 @@ decision_proceduret::resultt string_refinementt::dec_solve()
675689
log.debug() << "dec_solve: compute dependency graph and remove function "
676690
<< "applications captured by the dependencies:" << messaget::eom;
677691
std::vector<exprt> local_equations;
678-
for(const equal_exprt &eq : equations)
692+
for(const exprt &eq : equations)
679693
{
680694
// Ensures that arrays that are equal, are associated to the same nodes
681695
// in the graph.
682-
const equal_exprt eq_with_char_array_replaced_with_representative_elements =
683-
to_equal_expr(replace_expr_copy(symbol_resolve, eq));
696+
const exprt eq_with_char_array_replaced_with_representative_elements =
697+
replace_expr_copy(symbol_resolve, eq);
684698
const optionalt<exprt> new_equation = add_node(
685699
dependencies,
686700
eq_with_char_array_replaced_with_representative_elements,

src/solvers/strings/string_refinement.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class string_refinementt final : public bv_refinementt
111111
index_set_pairt index_sets;
112112
union_find_replacet symbol_resolve;
113113

114-
std::vector<equal_exprt> equations;
114+
std::vector<exprt> equations;
115115

116116
string_dependenciest dependencies;
117117

0 commit comments

Comments
 (0)