@@ -55,35 +55,30 @@ static std::pair<bool, std::vector<exprt>> check_axioms(
55
55
const replace_mapt &symbol_resolve);
56
56
57
57
static 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,
60
59
const namespacet &ns,
61
60
const string_constraintt &axiom);
62
61
63
62
static 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,
66
64
const namespacet &ns,
67
65
const string_not_contains_constraintt &axiom);
68
66
69
67
static 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,
72
69
const namespacet &ns,
73
70
const std::vector<string_constraintt> &string_axioms,
74
71
const std::vector<string_not_contains_constraintt> &nc_axioms);
75
72
76
73
exprt simplify_sum (const exprt &f);
77
74
78
75
static 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,
81
77
const namespacet &ns,
82
78
const std::vector<exprt> ¤t_constraints);
83
79
84
80
static 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,
87
82
const namespacet &ns,
88
83
const exprt &formula);
89
84
@@ -95,8 +90,7 @@ static exprt instantiate(
95
90
96
91
static std::vector<exprt> instantiate (
97
92
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,
100
94
const string_constraint_generatort &generator);
101
95
102
96
static exprt get_array (
@@ -211,21 +205,20 @@ string_refinementt::string_refinementt(const infot &info):
211
205
static void display_index_set (
212
206
messaget::mstreamt stream,
213
207
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)
216
209
{
217
210
const auto eom=messaget::eom;
218
211
std::size_t count=0 ;
219
212
std::size_t count_current=0 ;
220
- for (const auto &i : index_set)
213
+ for (const auto &i : index_set. cumulative )
221
214
{
222
215
const exprt &s=i.first ;
223
216
stream << " IS(" << from_expr (ns, " " , s) << " )=={" << eom;
224
217
225
218
for (const auto &j : i.second )
226
219
{
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 ())
229
222
{
230
223
count_current++;
231
224
stream << " **" ;
@@ -243,13 +236,12 @@ static std::vector<exprt> generate_instantiations(
243
236
messaget::mstreamt &stream,
244
237
const namespacet &ns,
245
238
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,
248
240
const std::vector<string_constraintt> &universal_axioms,
249
241
const std::vector<string_not_contains_constraintt> ¬_contains_axioms)
250
242
{
251
243
std::vector<exprt> lemmas;
252
- for (const auto &i : current_index_set )
244
+ for (const auto &i : index_set. current )
253
245
{
254
246
for (const auto &univ_axiom : universal_axioms)
255
247
{
@@ -260,7 +252,7 @@ static std::vector<exprt> generate_instantiations(
260
252
for (const auto &nc_axiom : not_contains_axioms)
261
253
{
262
254
for (const auto &instance :
263
- instantiate (nc_axiom, index_set, current_index_set, generator))
255
+ instantiate (nc_axiom, index_set, generator))
264
256
lemmas.push_back (instance);
265
257
}
266
258
return lemmas;
@@ -758,21 +750,19 @@ decision_proceduret::resultt string_refinementt::dec_solve()
758
750
}
759
751
760
752
initial_index_set (
761
- index_set,
762
- current_index_set,
753
+ index_sets,
763
754
ns,
764
755
universal_axioms,
765
756
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 );
768
759
current_constraints.clear ();
769
760
for (const auto &instance :
770
761
generate_instantiations (
771
762
debug (),
772
763
ns,
773
764
generator,
774
- index_set,
775
- current_index_set,
765
+ index_sets,
776
766
universal_axioms,
777
767
not_contains_axioms))
778
768
add_lemma (instance);
@@ -818,24 +808,23 @@ decision_proceduret::resultt string_refinementt::dec_solve()
818
808
// the property we are checking by adding more indices to the index set,
819
809
// and instantiating universal formulas with this indices.
820
810
// 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);
823
813
824
- if (current_index_set .empty ())
814
+ if (index_sets. current .empty ())
825
815
{
826
816
debug () << " current index set is empty" << eom;
827
817
return resultt::D_ERROR;
828
818
}
829
819
830
- display_index_set (debug (), ns, current_index_set, index_set );
820
+ display_index_set (debug (), ns, index_sets );
831
821
current_constraints.clear ();
832
822
for (const auto &instance :
833
823
generate_instantiations (
834
824
debug (),
835
825
ns,
836
826
generator,
837
- index_set,
838
- current_index_set,
827
+ index_sets,
839
828
universal_axioms,
840
829
not_contains_axioms))
841
830
add_lemma (instance);
@@ -1730,28 +1719,26 @@ static bool find_qvar(const exprt &index, const symbol_exprt &qvar)
1730
1719
// / upper bound minus one
1731
1720
// / \par parameters: a list of string constraints
1732
1721
static 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,
1735
1723
const namespacet &ns,
1736
1724
const std::vector<string_constraintt> &string_axioms,
1737
1725
const std::vector<string_not_contains_constraintt> &nc_axioms)
1738
1726
{
1739
1727
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);
1741
1729
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);
1743
1731
}
1744
1732
1745
1733
// / add to the index set all the indices that appear in the formulas
1746
1734
// / \par parameters: a list of string constraints
1747
1735
static 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,
1750
1737
const namespacet &ns,
1751
1738
const std::vector<exprt> ¤t_constraints)
1752
1739
{
1753
1740
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);
1755
1742
}
1756
1743
1757
1744
// / 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)
1782
1769
// / upper bound minus one
1783
1770
// / \par parameters: a string constraint
1784
1771
static 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,
1787
1773
const namespacet &ns,
1788
1774
const exprt &s,
1789
1775
exprt i)
@@ -1793,14 +1779,13 @@ static void add_to_index_set(
1793
1779
if (i.id ()!=ID_constant || is_size_t )
1794
1780
{
1795
1781
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);
1798
1784
}
1799
1785
}
1800
1786
1801
1787
static 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,
1804
1789
const namespacet &ns,
1805
1790
const string_constraintt &axiom)
1806
1791
{
@@ -1822,7 +1807,7 @@ static void initial_index_set(
1822
1807
// if cur is of the form s[i] and no quantified variable appears in i
1823
1808
if (!has_quant_var)
1824
1809
{
1825
- add_to_index_set (index_set, current_index_set, ns, s, i);
1810
+ add_to_index_set (index_set, ns, s, i);
1826
1811
}
1827
1812
else
1828
1813
{
@@ -1832,7 +1817,7 @@ static void initial_index_set(
1832
1817
axiom.upper_bound (),
1833
1818
from_integer (1 , axiom.upper_bound ().type ()));
1834
1819
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);
1836
1821
}
1837
1822
}
1838
1823
else
@@ -1842,8 +1827,7 @@ static void initial_index_set(
1842
1827
}
1843
1828
1844
1829
static 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,
1847
1831
const namespacet &ns,
1848
1832
const string_not_contains_constraintt &axiom)
1849
1833
{
@@ -1857,7 +1841,7 @@ static void initial_index_set(
1857
1841
const exprt &i=it->op1 ();
1858
1842
1859
1843
// 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);
1861
1845
1862
1846
it.next_sibling_or_parent ();
1863
1847
}
@@ -1868,19 +1852,13 @@ static void initial_index_set(
1868
1852
minus_exprt kminus1 (
1869
1853
axiom.exists_upper_bound (),
1870
1854
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);
1877
1856
}
1878
1857
1879
1858
// / add to the index set all the indices that appear in the formula
1880
1859
// / \par parameters: a string constraint
1881
1860
static 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,
1884
1862
const namespacet &ns,
1885
1863
const exprt &formula)
1886
1864
{
@@ -1899,7 +1877,7 @@ static void update_index_set(
1899
1877
s.type ().id ()==ID_array,
1900
1878
string_refinement_invariantt (" index expressions must index on arrays" ));
1901
1879
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);
1903
1881
}
1904
1882
else
1905
1883
{
@@ -1987,22 +1965,21 @@ static exprt instantiate(
1987
1965
// / \return the lemmas produced through instantiation
1988
1966
static std::vector<exprt> instantiate (
1989
1967
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,
1992
1969
const string_constraint_generatort &generator)
1993
1970
{
1994
1971
const string_exprt &s0=axiom.s0 ();
1995
1972
const string_exprt &s1=axiom.s1 ();
1996
1973
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 ());
2001
1978
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 ())
2006
1983
{
2007
1984
typedef std::pair<exprt, exprt> expr_pairt;
2008
1985
std::set<expr_pairt> index_pairs;
0 commit comments