Skip to content

Commit 95efc6f

Browse files
committed
TG-672 Grouped string axioms together
1 parent a65407e commit 95efc6f

File tree

2 files changed

+30
-35
lines changed

2 files changed

+30
-35
lines changed

src/solvers/refinement/string_refinement.cpp

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,7 @@ static optionalt<exprt> find_counter_example(
4343
const symbol_exprt &var);
4444

4545
static std::pair<bool, std::vector<exprt>> check_axioms(
46-
const std::vector<string_constraintt> &universal_axioms,
47-
const std::vector<string_not_contains_constraintt> &not_contains_axioms,
46+
const string_axiomst &axioms,
4847
string_constraint_generatort &generator,
4948
const std::function<exprt(const exprt &)> &get,
5049
messaget::mstreamt &stream,
@@ -67,8 +66,7 @@ static void initial_index_set(
6766
static void initial_index_set(
6867
index_set_pairt &index_set,
6968
const namespacet &ns,
70-
const std::vector<string_constraintt> &string_axioms,
71-
const std::vector<string_not_contains_constraintt> &nc_axioms);
69+
const string_axiomst &axioms);
7270

7371
exprt simplify_sum(const exprt &f);
7472

@@ -237,19 +235,18 @@ static std::vector<exprt> generate_instantiations(
237235
const namespacet &ns,
238236
string_constraint_generatort &generator,
239237
const index_set_pairt &index_set,
240-
const std::vector<string_constraintt> &universal_axioms,
241-
const std::vector<string_not_contains_constraintt> &not_contains_axioms)
238+
const string_axiomst &axioms)
242239
{
243240
std::vector<exprt> lemmas;
244241
for(const auto &i : index_set.current)
245242
{
246-
for(const auto &univ_axiom : universal_axioms)
243+
for(const auto &univ_axiom : axioms.universal)
247244
{
248245
for(const auto &j : i.second)
249246
lemmas.push_back(instantiate(stream, univ_axiom, i.first, j));
250247
}
251248
}
252-
for(const auto &nc_axiom : not_contains_axioms)
249+
for(const auto &nc_axiom : axioms.not_contains)
253250
{
254251
for(const auto &instance :
255252
instantiate(nc_axiom, index_set, generator))
@@ -684,7 +681,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
684681
is_valid_string_constraint(error(), ns, univ_axiom),
685682
string_refinement_invariantt(
686683
"string constraints satisfy their invariant"));
687-
universal_axioms.push_back(univ_axiom);
684+
axioms.universal.push_back(univ_axiom);
688685
}
689686
else if(axiom.id()==ID_string_not_contains_constraint)
690687
{
@@ -696,7 +693,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
696693
array_typet witness_type(index_type, infinity_exprt(index_type));
697694
generator.witness[nc_axiom]=
698695
generator.fresh_symbol("not_contains_witness", witness_type);
699-
not_contains_axioms.push_back(nc_axiom);
696+
axioms.not_contains.push_back(nc_axiom);
700697
}
701698
else
702699
{
@@ -716,8 +713,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
716713
bool satisfied;
717714
std::vector<exprt> counter_examples;
718715
std::tie(satisfied, counter_examples)=check_axioms(
719-
universal_axioms,
720-
not_contains_axioms,
716+
axioms,
721717
generator,
722718
get,
723719
debug(),
@@ -752,8 +748,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
752748
initial_index_set(
753749
index_sets,
754750
ns,
755-
universal_axioms,
756-
not_contains_axioms);
751+
axioms);
757752
update_index_set(index_sets, ns, current_constraints);
758753
display_index_set(debug(), ns, index_sets);
759754
current_constraints.clear();
@@ -763,8 +758,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
763758
ns,
764759
generator,
765760
index_sets,
766-
universal_axioms,
767-
not_contains_axioms))
761+
axioms))
768762
add_lemma(instance);
769763

770764
while((loop_bound_--)>0)
@@ -776,8 +770,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
776770
bool satisfied;
777771
std::vector<exprt> counter_examples;
778772
std::tie(satisfied, counter_examples)=check_axioms(
779-
universal_axioms,
780-
not_contains_axioms,
773+
axioms,
781774
generator,
782775
get,
783776
debug(),
@@ -825,8 +818,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
825818
ns,
826819
generator,
827820
index_sets,
828-
universal_axioms,
829-
not_contains_axioms))
821+
axioms))
830822
add_lemma(instance);
831823
}
832824
else
@@ -1343,8 +1335,7 @@ exprt concretize_arrays_in_expression(exprt expr, std::size_t string_max_length)
13431335
/// return true if the current model satisfies all the axioms
13441336
/// \return a Boolean
13451337
static std::pair<bool, std::vector<exprt>> check_axioms(
1346-
const std::vector<string_constraintt> &universal_axioms,
1347-
const std::vector<string_not_contains_constraintt> &not_contains_axioms,
1338+
const string_axiomst &axioms,
13481339
string_constraint_generatort &generator,
13491340
const std::function<exprt(const exprt &)> &get,
13501341
messaget::mstreamt &stream,
@@ -1370,11 +1361,11 @@ static std::pair<bool, std::vector<exprt>> check_axioms(
13701361
// Maps from indexes of violated universal axiom to a witness of violation
13711362
std::map<size_t, exprt> violated;
13721363

1373-
stream << "string_refinement::check_axioms: " << universal_axioms.size()
1364+
stream << "string_refinement::check_axioms: " << axioms.universal.size()
13741365
<< " universal axioms:" << eom;
1375-
for(size_t i=0; i<universal_axioms.size(); i++)
1366+
for(size_t i=0; i<axioms.universal.size(); i++)
13761367
{
1377-
const string_constraintt &axiom=universal_axioms[i];
1368+
const string_constraintt &axiom=axioms.universal[i];
13781369
const symbol_exprt &univ_var=axiom.univ_var();
13791370
const exprt &bound_inf=axiom.lower_bound();
13801371
const exprt &bound_sup=axiom.upper_bound();
@@ -1418,11 +1409,11 @@ static std::pair<bool, std::vector<exprt>> check_axioms(
14181409
// Maps from indexes of violated not_contains axiom to a witness of violation
14191410
std::map<std::size_t, exprt> violated_not_contains;
14201411

1421-
stream << "there are " << not_contains_axioms.size()
1412+
stream << "there are " << axioms.not_contains.size()
14221413
<< " not_contains axioms" << eom;
1423-
for(size_t i=0; i<not_contains_axioms.size(); i++)
1414+
for(size_t i=0; i<axioms.not_contains.size(); i++)
14241415
{
1425-
const string_not_contains_constraintt &nc_axiom=not_contains_axioms[i];
1416+
const string_not_contains_constraintt &nc_axiom=axioms.not_contains[i];
14261417
const exprt &univ_bound_inf=nc_axiom.univ_lower_bound();
14271418
const exprt &univ_bound_sup=nc_axiom.univ_upper_bound();
14281419
const exprt &prem=nc_axiom.premise();
@@ -1496,7 +1487,7 @@ static std::pair<bool, std::vector<exprt>> check_axioms(
14961487
{
14971488
const exprt &val=v.second;
14981489
const string_not_contains_constraintt &axiom=
1499-
not_contains_axioms[v.first];
1490+
axioms.not_contains[v.first];
15001491

15011492
const exprt func_val=generator.get_witness_of(axiom, val);
15021493
const exprt comp_val=simplify_sum(plus_exprt(val, func_val));
@@ -1721,12 +1712,11 @@ static bool find_qvar(const exprt &index, const symbol_exprt &qvar)
17211712
static void initial_index_set(
17221713
index_set_pairt &index_set,
17231714
const namespacet &ns,
1724-
const std::vector<string_constraintt> &string_axioms,
1725-
const std::vector<string_not_contains_constraintt> &nc_axioms)
1715+
const string_axiomst &axioms)
17261716
{
1727-
for(const auto &axiom : string_axioms)
1717+
for(const auto &axiom : axioms.universal)
17281718
initial_index_set(index_set, ns, axiom);
1729-
for(const auto &axiom : nc_axioms)
1719+
for(const auto &axiom : axioms.not_contains)
17301720
initial_index_set(index_set, ns, axiom);
17311721
}
17321722

src/solvers/refinement/string_refinement.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ struct index_set_pairt
3535
std::map<exprt, std::set<exprt>> current;
3636
};
3737

38+
struct string_axiomst
39+
{
40+
std::vector<string_constraintt> universal;
41+
std::vector<string_not_contains_constraintt> not_contains;
42+
};
43+
3844
class string_refinementt final: public bv_refinementt
3945
{
4046
private:
@@ -79,8 +85,7 @@ class string_refinementt final: public bv_refinementt
7985
// Simple constraints that have been given to the solver
8086
expr_sett seen_instances;
8187

82-
std::vector<string_constraintt> universal_axioms;
83-
std::vector<string_not_contains_constraintt> not_contains_axioms;
88+
string_axiomst axioms;
8489

8590
// Unquantified lemmas that have newly been added
8691
std::vector<exprt> current_constraints;

0 commit comments

Comments
 (0)