@@ -55,35 +55,30 @@ static std::pair<bool, std::vector<exprt>> check_axioms(
5555 const replace_mapt &symbol_resolve);
5656
5757static void initial_index_set (
58- std::map<exprt, std::set<exprt>> &index_set,
59- std::map<exprt, std::set<exprt>> ¤t_index_set,
58+ index_set_pairt &index_set,
6059 const namespacet &ns,
6160 const string_constraintt &axiom);
6261
6362static void initial_index_set (
64- std::map<exprt, std::set<exprt>> &index_set,
65- std::map<exprt, std::set<exprt>> ¤t_index_set,
63+ index_set_pairt &index_set,
6664 const namespacet &ns,
6765 const string_not_contains_constraintt &axiom);
6866
6967static void initial_index_set (
70- std::map<exprt, std::set<exprt>> &index_set,
71- std::map<exprt, std::set<exprt>> ¤t_index_set,
68+ index_set_pairt &index_set,
7269 const namespacet &ns,
7370 const std::vector<string_constraintt> &string_axioms,
7471 const std::vector<string_not_contains_constraintt> &nc_axioms);
7572
7673exprt simplify_sum (const exprt &f);
7774
7875static void update_index_set (
79- std::map<exprt, std::set<exprt>> &index_set,
80- std::map<exprt, std::set<exprt>> ¤t_index_set,
76+ index_set_pairt &index_set,
8177 const namespacet &ns,
8278 const std::vector<exprt> ¤t_constraints);
8379
8480static void update_index_set (
85- std::map<exprt, std::set<exprt>> &index_set,
86- std::map<exprt, std::set<exprt>> ¤t_index_set,
81+ index_set_pairt &index_set,
8782 const namespacet &ns,
8883 const exprt &formula);
8984
@@ -95,8 +90,7 @@ static exprt instantiate(
9590
9691static std::vector<exprt> instantiate (
9792 const string_not_contains_constraintt &axiom,
98- const std::map<exprt, std::set<exprt>> &index_set,
99- const std::map<exprt, std::set<exprt>> ¤t_index_set,
93+ const index_set_pairt &index_set,
10094 const string_constraint_generatort &generator);
10195
10296static exprt get_array (
@@ -211,21 +205,20 @@ string_refinementt::string_refinementt(const infot &info):
211205static void display_index_set (
212206 messaget::mstreamt stream,
213207 const namespacet &ns,
214- const std::map<exprt, std::set<exprt>> ¤t_index_set,
215- const std::map<exprt, std::set<exprt>> &index_set)
208+ const index_set_pairt &index_set)
216209{
217210 const auto eom=messaget::eom;
218211 std::size_t count=0 ;
219212 std::size_t count_current=0 ;
220- for (const auto &i : index_set)
213+ for (const auto &i : index_set. cumulative )
221214 {
222215 const exprt &s=i.first ;
223216 stream << " IS(" << from_expr (ns, " " , s) << " )=={" << eom;
224217
225218 for (const auto &j : i.second )
226219 {
227- const auto it=current_index_set .find (i.first );
228- if (it!=current_index_set .end () && it->second .find (j)!=it->second .end ())
220+ const auto it=index_set. current .find (i.first );
221+ if (it!=index_set. current .end () && it->second .find (j)!=it->second .end ())
229222 {
230223 count_current++;
231224 stream << " **" ;
@@ -243,13 +236,12 @@ static std::vector<exprt> generate_instantiations(
243236 messaget::mstreamt &stream,
244237 const namespacet &ns,
245238 string_constraint_generatort &generator,
246- const std::map<exprt, std::set<exprt>> &index_set,
247- const std::map<exprt, std::set<exprt>> ¤t_index_set,
239+ const index_set_pairt &index_set,
248240 const std::vector<string_constraintt> &universal_axioms,
249241 const std::vector<string_not_contains_constraintt> ¬_contains_axioms)
250242{
251243 std::vector<exprt> lemmas;
252- for (const auto &i : current_index_set )
244+ for (const auto &i : index_set. current )
253245 {
254246 for (const auto &univ_axiom : universal_axioms)
255247 {
@@ -260,7 +252,7 @@ static std::vector<exprt> generate_instantiations(
260252 for (const auto &nc_axiom : not_contains_axioms)
261253 {
262254 for (const auto &instance :
263- instantiate (nc_axiom, index_set, current_index_set, generator))
255+ instantiate (nc_axiom, index_set, generator))
264256 lemmas.push_back (instance);
265257 }
266258 return lemmas;
@@ -758,21 +750,19 @@ decision_proceduret::resultt string_refinementt::dec_solve()
758750 }
759751
760752 initial_index_set (
761- index_set,
762- current_index_set,
753+ index_sets,
763754 ns,
764755 universal_axioms,
765756 not_contains_axioms);
766- update_index_set (index_set, current_index_set , ns, current_constraints);
767- display_index_set (debug (), ns, current_index_set, index_set );
757+ update_index_set (index_sets , ns, current_constraints);
758+ display_index_set (debug (), ns, index_sets );
768759 current_constraints.clear ();
769760 for (const auto &instance :
770761 generate_instantiations (
771762 debug (),
772763 ns,
773764 generator,
774- index_set,
775- current_index_set,
765+ index_sets,
776766 universal_axioms,
777767 not_contains_axioms))
778768 add_lemma (instance);
@@ -818,24 +808,23 @@ decision_proceduret::resultt string_refinementt::dec_solve()
818808 // the property we are checking by adding more indices to the index set,
819809 // and instantiating universal formulas with this indices.
820810 // We will then relaunch the solver with these added lemmas.
821- current_index_set .clear ();
822- update_index_set (index_set, current_index_set , ns, current_constraints);
811+ index_sets. current .clear ();
812+ update_index_set (index_sets , ns, current_constraints);
823813
824- if (current_index_set .empty ())
814+ if (index_sets. current .empty ())
825815 {
826816 debug () << " current index set is empty" << eom;
827817 return resultt::D_ERROR;
828818 }
829819
830- display_index_set (debug (), ns, current_index_set, index_set );
820+ display_index_set (debug (), ns, index_sets );
831821 current_constraints.clear ();
832822 for (const auto &instance :
833823 generate_instantiations (
834824 debug (),
835825 ns,
836826 generator,
837- index_set,
838- current_index_set,
827+ index_sets,
839828 universal_axioms,
840829 not_contains_axioms))
841830 add_lemma (instance);
@@ -1730,28 +1719,26 @@ static bool find_qvar(const exprt &index, const symbol_exprt &qvar)
17301719// / upper bound minus one
17311720// / \par parameters: a list of string constraints
17321721static void initial_index_set (
1733- std::map<exprt, std::set<exprt>> &index_set,
1734- std::map<exprt, std::set<exprt>> ¤t_index_set,
1722+ index_set_pairt &index_set,
17351723 const namespacet &ns,
17361724 const std::vector<string_constraintt> &string_axioms,
17371725 const std::vector<string_not_contains_constraintt> &nc_axioms)
17381726{
17391727 for (const auto &axiom : string_axioms)
1740- initial_index_set (index_set, current_index_set, ns, axiom);
1728+ initial_index_set (index_set, ns, axiom);
17411729 for (const auto &axiom : nc_axioms)
1742- initial_index_set (index_set, current_index_set, ns, axiom);
1730+ initial_index_set (index_set, ns, axiom);
17431731}
17441732
17451733// / add to the index set all the indices that appear in the formulas
17461734// / \par parameters: a list of string constraints
17471735static void update_index_set (
1748- std::map<exprt, std::set<exprt>> &index_set,
1749- std::map<exprt, std::set<exprt>> ¤t_index_set,
1736+ index_set_pairt &index_set,
17501737 const namespacet &ns,
17511738 const std::vector<exprt> ¤t_constraints)
17521739{
17531740 for (const auto &axiom : current_constraints)
1754- update_index_set (index_set, current_index_set, ns, axiom);
1741+ update_index_set (index_set, ns, axiom);
17551742}
17561743
17571744// / An expression representing an array of characters can be in the form of an
@@ -1782,8 +1769,7 @@ static std::vector<exprt> sub_arrays(const exprt &array_expr)
17821769// / upper bound minus one
17831770// / \par parameters: a string constraint
17841771static void add_to_index_set (
1785- std::map<exprt, std::set<exprt>> &index_set,
1786- std::map<exprt, std::set<exprt>> ¤t_index_set,
1772+ index_set_pairt &index_set,
17871773 const namespacet &ns,
17881774 const exprt &s,
17891775 exprt i)
@@ -1793,14 +1779,13 @@ static void add_to_index_set(
17931779 if (i.id ()!=ID_constant || is_size_t )
17941780 {
17951781 for (const auto &sub : sub_arrays (s))
1796- if (index_set[sub].insert (i).second )
1797- current_index_set [sub].insert (i);
1782+ if (index_set. cumulative [sub].insert (i).second )
1783+ index_set. current [sub].insert (i);
17981784 }
17991785}
18001786
18011787static void initial_index_set (
1802- std::map<exprt, std::set<exprt>> &index_set,
1803- std::map<exprt, std::set<exprt>> ¤t_index_set,
1788+ index_set_pairt &index_set,
18041789 const namespacet &ns,
18051790 const string_constraintt &axiom)
18061791{
@@ -1822,7 +1807,7 @@ static void initial_index_set(
18221807 // if cur is of the form s[i] and no quantified variable appears in i
18231808 if (!has_quant_var)
18241809 {
1825- add_to_index_set (index_set, current_index_set, ns, s, i);
1810+ add_to_index_set (index_set, ns, s, i);
18261811 }
18271812 else
18281813 {
@@ -1832,7 +1817,7 @@ static void initial_index_set(
18321817 axiom.upper_bound (),
18331818 from_integer (1 , axiom.upper_bound ().type ()));
18341819 replace_expr (qvar, kminus1, e);
1835- add_to_index_set (index_set, current_index_set, ns, s, e);
1820+ add_to_index_set (index_set, ns, s, e);
18361821 }
18371822 }
18381823 else
@@ -1842,8 +1827,7 @@ static void initial_index_set(
18421827}
18431828
18441829static void initial_index_set (
1845- std::map<exprt, std::set<exprt>> &index_set,
1846- std::map<exprt, std::set<exprt>> ¤t_index_set,
1830+ index_set_pairt &index_set,
18471831 const namespacet &ns,
18481832 const string_not_contains_constraintt &axiom)
18491833{
@@ -1857,7 +1841,7 @@ static void initial_index_set(
18571841 const exprt &i=it->op1 ();
18581842
18591843 // cur is of the form s[i] and no quantified variable appears in i
1860- add_to_index_set (index_set, current_index_set, ns, s, i);
1844+ add_to_index_set (index_set, ns, s, i);
18611845
18621846 it.next_sibling_or_parent ();
18631847 }
@@ -1868,19 +1852,13 @@ static void initial_index_set(
18681852 minus_exprt kminus1 (
18691853 axiom.exists_upper_bound (),
18701854 from_integer (1 , axiom.exists_upper_bound ().type ()));
1871- add_to_index_set (
1872- index_set,
1873- current_index_set,
1874- ns,
1875- axiom.s1 ().content (),
1876- kminus1);
1855+ add_to_index_set (index_set, ns, axiom.s1 ().content (), kminus1);
18771856}
18781857
18791858// / add to the index set all the indices that appear in the formula
18801859// / \par parameters: a string constraint
18811860static void update_index_set (
1882- std::map<exprt, std::set<exprt>> &index_set,
1883- std::map<exprt, std::set<exprt>> ¤t_index_set,
1861+ index_set_pairt &index_set,
18841862 const namespacet &ns,
18851863 const exprt &formula)
18861864{
@@ -1899,7 +1877,7 @@ static void update_index_set(
18991877 s.type ().id ()==ID_array,
19001878 string_refinement_invariantt (" index expressions must index on arrays" ));
19011879 exprt simplified=simplify_sum (i);
1902- add_to_index_set (index_set, current_index_set, ns, s, simplified);
1880+ add_to_index_set (index_set, ns, s, simplified);
19031881 }
19041882 else
19051883 {
@@ -1987,22 +1965,21 @@ static exprt instantiate(
19871965// / \return the lemmas produced through instantiation
19881966static std::vector<exprt> instantiate (
19891967 const string_not_contains_constraintt &axiom,
1990- const std::map<exprt, std::set<exprt>> &index_set,
1991- const std::map<exprt, std::set<exprt>> ¤t_index_set,
1968+ const index_set_pairt &index_set,
19921969 const string_constraint_generatort &generator)
19931970{
19941971 const string_exprt &s0=axiom.s0 ();
19951972 const string_exprt &s1=axiom.s1 ();
19961973
1997- const auto &index_set0=index_set.find (s0.content ());
1998- const auto &index_set1=index_set.find (s1.content ());
1999- const auto ¤t_index_set0=current_index_set .find (s0.content ());
2000- const auto ¤t_index_set1=current_index_set .find (s1.content ());
1974+ const auto &index_set0=index_set.cumulative . find (s0.content ());
1975+ const auto &index_set1=index_set.cumulative . find (s1.content ());
1976+ const auto ¤t_index_set0=index_set. current .find (s0.content ());
1977+ const auto ¤t_index_set1=index_set. current .find (s1.content ());
20011978
2002- if (index_set0!=index_set.end () &&
2003- index_set1!=index_set.end () &&
2004- current_index_set0!=index_set.end () &&
2005- current_index_set1!=index_set.end ())
1979+ if (index_set0!=index_set.cumulative . end () &&
1980+ index_set1!=index_set.cumulative . end () &&
1981+ current_index_set0!=index_set.current . end () &&
1982+ current_index_set1!=index_set.current . end ())
20061983 {
20071984 typedef std::pair<exprt, exprt> expr_pairt;
20081985 std::set<expr_pairt> index_pairs;
0 commit comments