Skip to content

Commit c731b98

Browse files
author
Thomas Kiley
authored
Merge pull request diffblue#1404 from LAJW/string-refinement-functional
TG-634 Functional style for string refinement
2 parents 585fb66 + 05d5a9b commit c731b98

9 files changed

+757
-533
lines changed

src/solvers/refinement/bv_refinement.h

+9-11
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,9 @@ Author: Daniel Kroening, [email protected]
2020

2121
class bv_refinementt:public bv_pointerst
2222
{
23-
public:
24-
struct infot
23+
private:
24+
struct configt
2525
{
26-
const namespacet *ns=nullptr;
27-
propt *prop=nullptr;
2826
ui_message_handlert::uit ui=ui_message_handlert::uit::PLAIN;
2927
/// Max number of times we refine a formula node
3028
unsigned max_node_refinement=5;
@@ -33,6 +31,12 @@ class bv_refinementt:public bv_pointerst
3331
/// Enable arithmetic refinement
3432
bool refine_arithmetic=true;
3533
};
34+
public:
35+
struct infot:public configt
36+
{
37+
const namespacet *ns=nullptr;
38+
propt *prop=nullptr;
39+
};
3640

3741
explicit bv_refinementt(const infot &info);
3842

@@ -103,18 +107,12 @@ class bv_refinementt:public bv_pointerst
103107

104108
// MEMBERS
105109

106-
// Maximum number of times we refine a formula node
107-
const unsigned max_node_refinement;
108-
// Refinement toggles
109-
const bool do_array_refinement;
110-
const bool do_arithmetic_refinement;
111110
bool progress;
112111
std::vector<approximationt> approximations;
113112
bvt parent_assumptions;
114-
115113
protected:
116114
// use gui format
117-
ui_message_handlert::uit ui;
115+
configt config_;
118116
};
119117

120118
#endif // CPROVER_SOLVERS_REFINEMENT_BV_REFINEMENT_H

src/solvers/refinement/bv_refinement_loop.cpp

+3-6
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,8 @@ Author: Daniel Kroening, [email protected]
1414

1515
bv_refinementt::bv_refinementt(const infot &info):
1616
bv_pointerst(*info.ns, *info.prop),
17-
max_node_refinement(info.max_node_refinement),
18-
do_array_refinement(info.refine_arrays),
19-
do_arithmetic_refinement(info.refine_arithmetic),
2017
progress(false),
21-
ui(info.ui)
18+
config_(info)
2219
{
2320
// check features we need
2421
PRECONDITION(prop.has_set_assumptions());
@@ -44,11 +41,11 @@ decision_proceduret::resultt bv_refinementt::dec_solve()
4441
status() << "BV-Refinement: iteration " << iteration << eom;
4542

4643
// output the very same information in a structured fashion
47-
if(ui==ui_message_handlert::uit::XML_UI)
44+
if(config_.ui==ui_message_handlert::uit::XML_UI)
4845
{
4946
xmlt xml("refinement-iteration");
5047
xml.data=std::to_string(iteration);
51-
std::cout << xml << '\n';
48+
status() << xml << '\n';
5249
}
5350

5451
switch(prop_solve())

src/solvers/refinement/refine_arithmetic.cpp

+5-5
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ void bv_refinementt::approximationt::add_under_assumption(literalt l)
3838

3939
bvt bv_refinementt::convert_floatbv_op(const exprt &expr)
4040
{
41-
if(!do_arithmetic_refinement)
41+
if(!config_.refine_arithmetic)
4242
return SUB::convert_floatbv_op(expr);
4343

4444
if(ns.follow(expr.type()).id()!=ID_floatbv ||
@@ -52,7 +52,7 @@ bvt bv_refinementt::convert_floatbv_op(const exprt &expr)
5252

5353
bvt bv_refinementt::convert_mult(const exprt &expr)
5454
{
55-
if(!do_arithmetic_refinement || expr.type().id()==ID_fixedbv)
55+
if(!config_.refine_arithmetic || expr.type().id()==ID_fixedbv)
5656
return SUB::convert_mult(expr);
5757

5858
// we catch any multiplication
@@ -100,7 +100,7 @@ bvt bv_refinementt::convert_mult(const exprt &expr)
100100

101101
bvt bv_refinementt::convert_div(const div_exprt &expr)
102102
{
103-
if(!do_arithmetic_refinement || expr.type().id()==ID_fixedbv)
103+
if(!config_.refine_arithmetic || expr.type().id()==ID_fixedbv)
104104
return SUB::convert_div(expr);
105105

106106
// we catch any division
@@ -118,7 +118,7 @@ bvt bv_refinementt::convert_div(const div_exprt &expr)
118118

119119
bvt bv_refinementt::convert_mod(const mod_exprt &expr)
120120
{
121-
if(!do_arithmetic_refinement || expr.type().id()==ID_fixedbv)
121+
if(!config_.refine_arithmetic || expr.type().id()==ID_fixedbv)
122122
return SUB::convert_mod(expr);
123123

124124
// we catch any mod
@@ -228,7 +228,7 @@ void bv_refinementt::check_SAT(approximationt &a)
228228

229229
// if(a.over_state==1) { debug() << "DISAGREEMENT!\n"; exit(1); }
230230

231-
if(a.over_state<max_node_refinement)
231+
if(a.over_state<config_.max_node_refinement)
232232
{
233233
bvt r;
234234
float_utilst float_utils(prop);

src/solvers/refinement/refine_arrays.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ void bv_refinementt::post_process_arrays()
2929
update_index_map(true);
3030

3131
// we don't actually add any constraints
32-
lazy_arrays=do_array_refinement;
32+
lazy_arrays=config_.refine_arrays;
3333
add_array_constraints();
3434
freeze_lazy_constraints();
3535
}
3636

3737
/// check whether counterexample is spurious
3838
void bv_refinementt::arrays_overapproximated()
3939
{
40-
if(!do_array_refinement)
40+
if(!config_.refine_arrays)
4141
return;
4242

4343
unsigned nb_active=0;

src/solvers/refinement/string_constraint_generator.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,13 @@ class string_constraint_generatort final
4040
/// Arguments pack for the string_constraint_generator constructor
4141
struct infot
4242
{
43-
const namespacet *ns=nullptr;
4443
/// Max length of non-deterministic strings
4544
size_t string_max_length=std::numeric_limits<size_t>::max();
4645
/// Prefer printable characters in non-deterministic strings
4746
bool string_printable=false;
4847
};
4948

50-
explicit string_constraint_generatort(const infot& info);
49+
string_constraint_generatort(const infot& info, const namespacet& ns);
5150

5251
/// Axioms are of three kinds: universally quantified string constraint,
5352
/// not contains string constraints and simple formulas.
@@ -81,6 +80,11 @@ class string_constraint_generatort final
8180

8281
symbol_exprt fresh_exist_index(const irep_idt &prefix, const typet &type);
8382

83+
/// remove functions applications and create the necessary axioms
84+
/// \par parameters: an expression containing function applications
85+
/// \return an expression containing no function application
86+
exprt substitute_function_applications(const exprt& expr);
87+
8488
private:
8589
symbol_exprt fresh_boolean(const irep_idt &prefix);
8690
string_exprt fresh_string(const refined_string_typet &type);

src/solvers/refinement/string_constraint_generator_main.cpp

+18-2
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ Author: Romain Brenguier, [email protected]
2828
#include <util/ssa_expr.h>
2929

3030
string_constraint_generatort::string_constraint_generatort(
31-
const string_constraint_generatort::infot& info):
31+
const string_constraint_generatort::infot& info, const namespacet& ns):
3232
max_string_length(info.string_max_length),
3333
m_force_printable_characters(info.string_printable),
34-
m_ns(*info.ns) { }
34+
m_ns(ns) { }
3535

3636
const std::vector<exprt> &string_constraint_generatort::get_axioms() const
3737
{
@@ -628,3 +628,19 @@ exprt string_constraint_generatort::add_axioms_for_to_char_array(
628628
string_exprt str=get_string_expr(args(f, 1)[0]);
629629
return str.content();
630630
}
631+
632+
exprt string_constraint_generatort::substitute_function_applications(
633+
const exprt &expr)
634+
{
635+
exprt copy=expr;
636+
for(exprt &operand : copy.operands())
637+
operand=substitute_function_applications(exprt(operand));
638+
639+
if(copy.id()==ID_function_application)
640+
{
641+
function_application_exprt f=to_function_application_expr(copy);
642+
return this->add_axioms_for_function_application(f);
643+
}
644+
645+
return copy;
646+
}

0 commit comments

Comments
 (0)