Skip to content

Commit 9d08aa6

Browse files
Merge pull request #1150 from jasigal/fix/universal-constraint-instantiation#780
Corrected instantiation of universal string constraints.
2 parents 7379da4 + ff6135c commit 9d08aa6

File tree

1 file changed

+29
-27
lines changed

1 file changed

+29
-27
lines changed

src/solvers/refinement/string_refinement.cpp

Lines changed: 29 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -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
15121510
class find_index_visitort: public const_expr_visitort
15131511
{
15141512
private:
15151513
const exprt &str_;
1514+
const symbol_exprt &qvar_;
15161515

15171516
public:
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)
15531557
exprt 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

Comments
 (0)