@@ -106,13 +106,11 @@ void string_refinementt::add_instantiations()
106106 debug () << from_expr (ns, " " , j) << " ; " ;
107107 debug () << " }" << eom;
108108
109- for (const auto &j : i. second )
109+ for (const auto &ua : universal_axioms )
110110 {
111- const exprt &val=j;
112-
113- for (const auto &ua : universal_axioms)
111+ for (const auto &j : i.second )
114112 {
115- exprt lemma=instantiate (ua, s, val );
113+ exprt lemma=instantiate (ua, s, j );
116114 add_lemma (lemma);
117115 }
118116 }
@@ -1379,7 +1377,7 @@ class find_qvar_visitort: public const_expr_visitort
13791377
13801378 explicit find_qvar_visitort (const exprt &qvar): qvar_(qvar), found(false ) {}
13811379
1382- void operator ()(const exprt &expr)
1380+ void operator ()(const exprt &expr) override
13831381 {
13841382 if (expr==qvar_)
13851383 found=true ;
@@ -1508,39 +1506,45 @@ void string_refinementt::update_index_set(const exprt &formula)
15081506
15091507
15101508// Will be used to visit an expression and return the index used
1511- // with the given char array
1509+ // with the given char array that contains qvar
15121510class find_index_visitort : public const_expr_visitort
15131511{
15141512private:
15151513 const exprt &str_;
1514+ const symbol_exprt &qvar_;
15161515
15171516public:
1518- explicit find_index_visitort (const exprt &str): str_(str) {}
1517+ exprt index;
1518+
1519+ explicit find_index_visitort (
1520+ const exprt &str, const symbol_exprt &qvar):
1521+ str_(str),
1522+ qvar_(qvar),
1523+ index(nil_exprt()) {}
15191524
1520- void operator ()(const exprt &expr)
1525+ void operator ()(const exprt &expr) override
15211526 {
1522- if (expr.id ()==ID_index)
1527+ if (index. is_nil () && expr.id ()==ID_index)
15231528 {
15241529 const index_exprt &i=to_index_expr (expr);
1525- if (i.array ()==str_)
1526- throw i.index ();
1530+ if (i.array ()==str_ && find_qvar (i. index (), qvar_) )
1531+ index= i.index ();
15271532 }
15281533 }
15291534};
15301535
1531- // / find an index used in the expression for str, for instance with arguments
1532- // / (str[k] == 'a') and str, the function should return k
1533- // / \par parameters: a formula expr and a char array str
1534- // / \return an index expression
1535- exprt find_index (const exprt &expr, const exprt &str)
1536+ // / Finds an index on `str` used in `expr` that contains `qvar`, for instance
1537+ // / with arguments ``(str[k] == 'a')``, `str`, and `k`, the function should
1538+ // / return `k`.
1539+ // / \param [in] expr: the expression to search
1540+ // / \param [in] str: the string which must be indexed
1541+ // / \param [in] qvar: the universal variable that must be in the index
1542+ // / \return an index expression in `expr` on `str` containing `qvar`
1543+ exprt find_index (const exprt &expr, const exprt &str, const symbol_exprt &qvar)
15361544{
1537- find_index_visitort v1 (str);
1538- try
1539- {
1540- expr.visit (v1);
1541- return nil_exprt ();
1542- }
1543- catch (exprt i) { return i; }
1545+ find_index_visitort v (str, qvar);
1546+ expr.visit (v);
1547+ return v.index ;
15441548}
15451549
15461550// / \par parameters: a universally quantified formula `axiom`, an array of char
@@ -1553,11 +1557,9 @@ exprt find_index(const exprt &expr, const exprt &str)
15531557exprt string_refinementt::instantiate (
15541558 const string_constraintt &axiom, const exprt &str, const exprt &val)
15551559{
1556- exprt idx=find_index (axiom.body (), str);
1560+ exprt idx=find_index (axiom.body (), str, axiom. univ_var () );
15571561 if (idx.is_nil ())
15581562 return true_exprt ();
1559- if (!find_qvar (idx, axiom.univ_var ()))
1560- return true_exprt ();
15611563
15621564 exprt r=compute_inverse_function (axiom.univ_var (), val, idx);
15631565 implies_exprt instance (axiom.premise (), axiom.body ());
0 commit comments