Skip to content

Commit 1843e44

Browse files
Lukasz A.J. Wronaromainbrenguier
Lukasz A.J. Wrona
authored andcommitted
Split string generator axioms into separate vectors
These axioms used to be all added in the same exprt vector by the constraint generator and then filtered by the solver according to their type. We now make the constraint generator add to appropriate vector according to the type of axiom (simple lemma, string constraint or "not contains" constraint). This has mainly two advantages: * there is no need for filtering the vector in the solver since they are already prefiltered * string_constraintt and string_not_contains_constraintt no longer need to inherit from exprt since they are not stored in the same vector.
1 parent f17e2c8 commit 1843e44

12 files changed

+187
-157
lines changed

src/solvers/refinement/string_constraint_generator.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ class string_constraint_generatort final
4848

4949
/// Axioms are of three kinds: universally quantified string constraint,
5050
/// not contains string constraints and simple formulas.
51-
const std::vector<exprt> &get_axioms() const;
51+
const std::vector<exprt> &get_lemmas() const;
52+
const std::vector<string_constraintt> &get_constraints() const;
53+
const std::vector<string_not_contains_constraintt> &
54+
get_not_contains_constraints() const;
5255

5356
/// Boolean symbols for the results of some string functions
5457
const std::vector<symbol_exprt> &get_boolean_symbols() const;
@@ -349,7 +352,9 @@ class string_constraint_generatort final
349352
unsigned symbol_count=0;
350353
const messaget message;
351354

352-
std::vector<exprt> axioms;
355+
std::vector<exprt> lemmas;
356+
std::vector<string_constraintt> constraints;
357+
std::vector<string_not_contains_constraintt> not_contains_constraints;
353358
std::vector<symbol_exprt> boolean_symbols;
354359
std::vector<symbol_exprt> index_symbols;
355360
const namespacet ns;

src/solvers/refinement/string_constraint_generator_code_points.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -41,27 +41,27 @@ exprt string_constraint_generatort::add_axioms_for_code_point(
4141

4242
binary_relation_exprt small(code_point, ID_lt, hex010000);
4343
implies_exprt a1(small, res.axiom_for_has_length(1));
44-
axioms.push_back(a1);
44+
lemmas.push_back(a1);
4545

4646
implies_exprt a2(not_exprt(small), res.axiom_for_has_length(2));
47-
axioms.push_back(a2);
47+
lemmas.push_back(a2);
4848

4949
typecast_exprt code_point_as_char(code_point, char_type);
5050
implies_exprt a3(small, equal_exprt(res[0], code_point_as_char));
51-
axioms.push_back(a3);
51+
lemmas.push_back(a3);
5252

5353
plus_exprt first_char(
5454
hexD800, div_exprt(minus_exprt(code_point, hex010000), hex0400));
5555
implies_exprt a4(
5656
not_exprt(small),
5757
equal_exprt(res[0], typecast_exprt(first_char, char_type)));
58-
axioms.push_back(a4);
58+
lemmas.push_back(a4);
5959

6060
plus_exprt second_char(hexDC00, mod_exprt(code_point, hex0400));
6161
implies_exprt a5(
6262
not_exprt(small),
6363
equal_exprt(res[1], typecast_exprt(second_char, char_type)));
64-
axioms.push_back(a5);
64+
lemmas.push_back(a5);
6565

6666
return from_integer(0, get_return_code_type());
6767
}
@@ -136,8 +136,8 @@ exprt string_constraint_generatort::add_axioms_for_code_point_at(
136136
is_low_surrogate(str[plus_exprt_with_overflow_check(pos, index1)]);
137137
const and_exprt return_pair(is_high_surrogate(str[pos]), is_low);
138138

139-
axioms.push_back(implies_exprt(return_pair, equal_exprt(result, pair)));
140-
axioms.push_back(
139+
lemmas.push_back(implies_exprt(return_pair, equal_exprt(result, pair)));
140+
lemmas.push_back(
141141
implies_exprt(not_exprt(return_pair), equal_exprt(result, char1_as_int)));
142142
return result;
143143
}
@@ -167,8 +167,8 @@ exprt string_constraint_generatort::add_axioms_for_code_point_before(
167167
const and_exprt return_pair(
168168
is_high_surrogate(char1), is_low_surrogate(char2));
169169

170-
axioms.push_back(implies_exprt(return_pair, equal_exprt(result, pair)));
171-
axioms.push_back(
170+
lemmas.push_back(implies_exprt(return_pair, equal_exprt(result, pair)));
171+
lemmas.push_back(
172172
implies_exprt(not_exprt(return_pair), equal_exprt(result, char2_as_int)));
173173
return result;
174174
}
@@ -189,8 +189,8 @@ exprt string_constraint_generatort::add_axioms_for_code_point_count(
189189
const symbol_exprt result = fresh_symbol("code_point_count", return_type);
190190
const minus_exprt length(end, begin);
191191
const div_exprt minimum(length, from_integer(2, length.type()));
192-
axioms.push_back(binary_relation_exprt(result, ID_le, length));
193-
axioms.push_back(binary_relation_exprt(result, ID_ge, minimum));
192+
lemmas.push_back(binary_relation_exprt(result, ID_le, length));
193+
lemmas.push_back(binary_relation_exprt(result, ID_ge, minimum));
194194

195195
return result;
196196
}
@@ -212,8 +212,8 @@ exprt string_constraint_generatort::add_axioms_for_offset_by_code_point(
212212

213213
const exprt minimum = plus_exprt_with_overflow_check(index, offset);
214214
const exprt maximum = plus_exprt_with_overflow_check(minimum, offset);
215-
axioms.push_back(binary_relation_exprt(result, ID_le, maximum));
216-
axioms.push_back(binary_relation_exprt(result, ID_ge, minimum));
215+
lemmas.push_back(binary_relation_exprt(result, ID_le, maximum));
216+
lemmas.push_back(binary_relation_exprt(result, ID_ge, minimum));
217217

218218
return result;
219219
}

src/solvers/refinement/string_constraint_generator_comparison.cpp

+13-13
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ exprt string_constraint_generatort::add_axioms_for_equals(
4040

4141

4242
implies_exprt a1(eq, equal_exprt(s1.length(), s2.length()));
43-
axioms.push_back(a1);
43+
lemmas.push_back(a1);
4444

4545
symbol_exprt qvar=fresh_univ_index("QA_equal", index_type);
4646
string_constraintt a2(qvar, s1.length(), eq, equal_exprt(s1[qvar], s2[qvar]));
47-
axioms.push_back(a2);
47+
constraints.push_back(a2);
4848

4949
symbol_exprt witness=fresh_exist_index("witness_unequal", index_type);
5050
exprt zero=from_integer(0, index_type);
@@ -56,7 +56,7 @@ exprt string_constraint_generatort::add_axioms_for_equals(
5656
notequal_exprt(s1.length(), s2.length()),
5757
equal_exprt(witness, from_integer(-1, index_type)));
5858
implies_exprt a3(not_exprt(eq), or_exprt(diff_length, witnessing));
59-
axioms.push_back(a3);
59+
lemmas.push_back(a3);
6060

6161
return tc_eq;
6262
}
@@ -124,14 +124,14 @@ exprt string_constraint_generatort::add_axioms_for_equals_ignore_case(
124124
const typet index_type = s1.length().type();
125125

126126
const implies_exprt a1(eq, equal_exprt(s1.length(), s2.length()));
127-
axioms.push_back(a1);
127+
lemmas.push_back(a1);
128128

129129
const symbol_exprt qvar =
130130
fresh_univ_index("QA_equal_ignore_case", index_type);
131131
const exprt constr2 =
132132
character_equals_ignore_case(s1[qvar], s2[qvar], char_a, char_A, char_Z);
133133
const string_constraintt a2(qvar, s1.length(), eq, constr2);
134-
axioms.push_back(a2);
134+
constraints.push_back(a2);
135135

136136
const symbol_exprt witness =
137137
fresh_exist_index("witness_unequal_ignore_case", index_type);
@@ -147,7 +147,7 @@ exprt string_constraint_generatort::add_axioms_for_equals_ignore_case(
147147
or_exprt(
148148
notequal_exprt(s1.length(), s2.length()),
149149
and_exprt(bound_witness, witness_diff)));
150-
axioms.push_back(a3);
150+
lemmas.push_back(a3);
151151

152152
return typecast_exprt(eq, f.type());
153153
}
@@ -183,7 +183,7 @@ exprt string_constraint_generatort::add_axioms_for_hash_code(
183183
and_exprt(
184184
notequal_exprt(str[i], it.first[i]),
185185
and_exprt(str.axiom_for_length_gt(i), axiom_for_is_positive_index(i))));
186-
axioms.push_back(or_exprt(c1, or_exprt(c2, c3)));
186+
lemmas.push_back(or_exprt(c1, or_exprt(c2, c3)));
187187
}
188188
return hash;
189189
}
@@ -220,12 +220,12 @@ exprt string_constraint_generatort::add_axioms_for_compare_to(
220220

221221
const equal_exprt res_null(res, from_integer(0, return_type));
222222
const implies_exprt a1(res_null, equal_exprt(s1.length(), s2.length()));
223-
axioms.push_back(a1);
223+
lemmas.push_back(a1);
224224

225225
const symbol_exprt i = fresh_univ_index("QA_compare_to", index_type);
226226
const string_constraintt a2(
227227
i, s1.length(), res_null, equal_exprt(s1[i], s2[i]));
228-
axioms.push_back(a2);
228+
constraints.push_back(a2);
229229

230230
const symbol_exprt x = fresh_exist_index("index_compare_to", index_type);
231231
const equal_exprt ret_char_diff(
@@ -251,12 +251,12 @@ exprt string_constraint_generatort::add_axioms_for_compare_to(
251251
and_exprt(
252252
binary_relation_exprt(x, ID_ge, from_integer(0, return_type)),
253253
or_exprt(cond1, cond2)));
254-
axioms.push_back(a3);
254+
lemmas.push_back(a3);
255255

256256
const symbol_exprt i2 = fresh_univ_index("QA_compare_to", index_type);
257257
const string_constraintt a4(
258258
i2, x, not_exprt(res_null), equal_exprt(s1[i2], s2[i2]));
259-
axioms.push_back(a4);
259+
constraints.push_back(a4);
260260

261261
return res;
262262
}
@@ -287,14 +287,14 @@ symbol_exprt string_constraint_generatort::add_axioms_for_intern(
287287
exprt::operandst disj;
288288
for(auto it : intern_of_string)
289289
disj.push_back(equal_exprt(intern, it.second));
290-
axioms.push_back(disjunction(disj));
290+
lemmas.push_back(disjunction(disj));
291291

292292
// WARNING: the specification may be incomplete or incorrect
293293
for(auto it : intern_of_string)
294294
if(it.second!=str)
295295
{
296296
symbol_exprt i=fresh_exist_index("index_intern", index_type);
297-
axioms.push_back(
297+
lemmas.push_back(
298298
or_exprt(
299299
equal_exprt(it.second, intern),
300300
or_exprt(

src/solvers/refinement/string_constraint_generator_concat.cpp

+7-7
Original file line numberDiff line numberDiff line change
@@ -49,20 +49,20 @@ exprt string_constraint_generatort::add_axioms_for_concat_substr(
4949
exprt res_length=plus_exprt_with_overflow_check(
5050
s1.length(), minus_exprt(end_index, start_index));
5151
implies_exprt a1(prem, equal_exprt(res.length(), res_length));
52-
axioms.push_back(a1);
52+
lemmas.push_back(a1);
5353

5454
implies_exprt a2(not_exprt(prem), equal_exprt(res.length(), s1.length()));
55-
axioms.push_back(a2);
55+
lemmas.push_back(a2);
5656

5757
symbol_exprt idx=fresh_univ_index("QA_index_concat", res.length().type());
5858
string_constraintt a3(idx, s1.length(), equal_exprt(s1[idx], res[idx]));
59-
axioms.push_back(a3);
59+
constraints.push_back(a3);
6060

6161
symbol_exprt idx2=fresh_univ_index("QA_index_concat2", res.length().type());
6262
equal_exprt res_eq(
6363
res[plus_exprt(idx2, s1.length())], s2[plus_exprt(start_index, idx2)]);
6464
string_constraintt a4(idx2, minus_exprt(end_index, start_index), res_eq);
65-
axioms.push_back(a4);
65+
constraints.push_back(a4);
6666

6767
// We should have a enum type for the possible error codes
6868
return from_integer(0, res.length().type());
@@ -87,14 +87,14 @@ exprt string_constraint_generatort::add_axioms_for_concat_char(
8787
const typet &index_type = res.length().type();
8888
const equal_exprt a1(
8989
res.length(), plus_exprt(s1.length(), from_integer(1, index_type)));
90-
axioms.push_back(a1);
90+
lemmas.push_back(a1);
9191

9292
symbol_exprt idx = fresh_univ_index("QA_index_concat_char", index_type);
9393
string_constraintt a2(idx, s1.length(), equal_exprt(s1[idx], res[idx]));
94-
axioms.push_back(a2);
94+
constraints.push_back(a2);
9595

9696
equal_exprt a3(res[s1.length()], c);
97-
axioms.push_back(a3);
97+
lemmas.push_back(a3);
9898

9999
// We should have a enum type for the possible error codes
100100
return from_integer(0, get_return_code_type());

src/solvers/refinement/string_constraint_generator_constants.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ exprt string_constraint_generatort::add_axioms_for_constant(
4545
const exprt idx = from_integer(i, index_type);
4646
const exprt c = from_integer(str[i], char_type);
4747
const equal_exprt lemma(res[idx], c);
48-
axioms.push_back(implies_exprt(guard, lemma));
48+
lemmas.push_back(implies_exprt(guard, lemma));
4949
}
5050

5151
const exprt s_length = from_integer(str.size(), index_type);
5252

53-
axioms.push_back(implies_exprt(guard, equal_exprt(res.length(), s_length)));
53+
lemmas.push_back(implies_exprt(guard, equal_exprt(res.length(), s_length)));
5454
return from_integer(0, get_return_code_type());
5555
}
5656

@@ -63,7 +63,7 @@ exprt string_constraint_generatort::add_axioms_for_empty_string(
6363
{
6464
PRECONDITION(f.arguments().size() == 2);
6565
exprt length = f.arguments()[0];
66-
axioms.push_back(equal_exprt(length, from_integer(0, length.type())));
66+
lemmas.push_back(equal_exprt(length, from_integer(0, length.type())));
6767
return from_integer(0, get_return_code_type());
6868
}
6969

src/solvers/refinement/string_constraint_generator_float.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ exprt string_constraint_generatort::add_axioms_for_fractional_part(
251251

252252
and_exprt a1(res.axiom_for_length_gt(1),
253253
res.axiom_for_length_le(max));
254-
axioms.push_back(a1);
254+
lemmas.push_back(a1);
255255

256256
equal_exprt starts_with_dot(res[0], from_integer('.', char_type));
257257

@@ -289,10 +289,10 @@ exprt string_constraint_generatort::add_axioms_for_fractional_part(
289289
}
290290

291291
exprt a2=conjunction(digit_constraints);
292-
axioms.push_back(a2);
292+
lemmas.push_back(a2);
293293

294294
equal_exprt a3(int_expr, sum);
295-
axioms.push_back(a3);
295+
lemmas.push_back(a3);
296296

297297
return from_integer(0, signedbv_typet(32));
298298
}

0 commit comments

Comments
 (0)