Skip to content

Commit 82f552c

Browse files
Add and add_constraint method to builtin functions
This will be used to directly add constraints by traversing the string dependency graph.
1 parent 2e7057a commit 82f552c

File tree

2 files changed

+55
-19
lines changed

2 files changed

+55
-19
lines changed

src/solvers/refinement/string_builtin_function.h

+35
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include <vector>
88
#include <util/optional.h>
99
#include <util/string_expr.h>
10+
#include "string_constraint_generator.h"
1011

1112
class array_poolt;
1213

@@ -32,6 +33,11 @@ class string_builtin_functiont
3233

3334
virtual std::string name() const = 0;
3435

36+
/// Add constraints ensuring that the value of result expression of the
37+
/// builtin function corresponds to the value of the function call.
38+
virtual exprt
39+
add_constraints(string_constraint_generatort &constraint_generator) const = 0;
40+
3541
protected:
3642
string_builtin_functiont() = default;
3743
};
@@ -96,6 +102,11 @@ class string_concat_char_builtin_functiont
96102
{
97103
return "concat_char";
98104
}
105+
106+
exprt add_constraints(string_constraint_generatort &generator) const override
107+
{
108+
return generator.add_axioms_for_concat_char(result, input, args[0]);
109+
};
99110
};
100111

101112
/// String inserting a string into another one
@@ -141,6 +152,15 @@ class string_insertion_builtin_functiont : public string_builtin_functiont
141152
return "insert";
142153
}
143154

155+
exprt add_constraints(string_constraint_generatort &generator) const override
156+
{
157+
if(args.size() == 1)
158+
return generator.add_axioms_for_insert(result, input1, input2, args[0]);
159+
if(args.size() == 3)
160+
UNIMPLEMENTED;
161+
UNREACHABLE;
162+
};
163+
144164
protected:
145165
string_insertion_builtin_functiont() = default;
146166
};
@@ -168,6 +188,16 @@ class string_concatenation_builtin_functiont final
168188
{
169189
return "concat";
170190
}
191+
192+
exprt add_constraints(string_constraint_generatort &generator) const override
193+
{
194+
if(args.size() == 0)
195+
return generator.add_axioms_for_concat(result, input1, input2);
196+
if(args.size() == 2)
197+
return generator.add_axioms_for_concat_substr(
198+
result, input1, input2, args[0], args[1]);
199+
UNREACHABLE;
200+
};
171201
};
172202

173203
/// String creation from other types
@@ -231,6 +261,11 @@ class string_builtin_function_with_no_evalt : public string_builtin_functiont
231261
{
232262
return {};
233263
}
264+
265+
exprt add_constraints(string_constraint_generatort &generator) const override
266+
{
267+
return generator.add_axioms_for_function_application(function_application);
268+
};
234269
};
235270

236271
#endif // CPROVER_SOLVERS_REFINEMENT_STRING_BUILTIN_FUNCTION_H

src/solvers/refinement/string_constraint_generator.h

+20-19
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,26 @@ class string_constraint_generatort final
148148
return signedbv_typet(32);
149149
}
150150

151+
exprt add_axioms_for_concat_char(
152+
const array_string_exprt &res,
153+
const array_string_exprt &s1,
154+
const exprt &c);
155+
exprt add_axioms_for_concat(
156+
const array_string_exprt &res,
157+
const array_string_exprt &s1,
158+
const array_string_exprt &s2);
159+
exprt add_axioms_for_concat_substr(
160+
const array_string_exprt &res,
161+
const array_string_exprt &s1,
162+
const array_string_exprt &s2,
163+
const exprt &start_index,
164+
const exprt &end_index);
165+
exprt add_axioms_for_insert(
166+
const array_string_exprt &res,
167+
const array_string_exprt &s1,
168+
const array_string_exprt &s2,
169+
const exprt &offset);
170+
151171
private:
152172
symbol_exprt fresh_boolean(const irep_idt &prefix);
153173
array_string_exprt
@@ -203,21 +223,7 @@ class string_constraint_generatort final
203223
exprt add_axioms_for_empty_string(const function_application_exprt &f);
204224
exprt add_axioms_for_char_set(const function_application_exprt &f);
205225
exprt add_axioms_for_copy(const function_application_exprt &f);
206-
exprt add_axioms_for_concat(
207-
const array_string_exprt &res,
208-
const array_string_exprt &s1,
209-
const array_string_exprt &s2);
210-
exprt add_axioms_for_concat_char(
211-
const array_string_exprt &res,
212-
const array_string_exprt &s1,
213-
const exprt &c);
214226
exprt add_axioms_for_concat_char(const function_application_exprt &f);
215-
exprt add_axioms_for_concat_substr(
216-
const array_string_exprt &res,
217-
const array_string_exprt &s1,
218-
const array_string_exprt &s2,
219-
const exprt &start_index,
220-
const exprt &end_index);
221227
exprt add_axioms_for_concat(const function_application_exprt &f);
222228
exprt add_axioms_for_concat_code_point(const function_application_exprt &f);
223229
exprt add_axioms_for_constant(
@@ -244,11 +250,6 @@ class string_constraint_generatort final
244250
const typet &index_type,
245251
const typet &char_type);
246252

247-
exprt add_axioms_for_insert(
248-
const array_string_exprt &res,
249-
const array_string_exprt &s1,
250-
const array_string_exprt &s2,
251-
const exprt &offset);
252253
exprt add_axioms_for_insert(const function_application_exprt &f);
253254
exprt add_axioms_for_insert_int(const function_application_exprt &f);
254255
exprt add_axioms_for_insert_bool(const function_application_exprt &f);

0 commit comments

Comments
 (0)