Skip to content

Commit f0004a5

Browse files
romainbrenguierJoel Allred
authored and
Joel Allred
committed
Corrections on generated axioms
Corrected axiom on positive length not added to axiom list Added missing addition of default axioms in fresh string Removing lemma that makes conditions too strong on strings This was causing the verfication of several goal fail after the first one is concretized. Also added some debugging information.
1 parent e05353e commit f0004a5

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

src/solvers/refinement/string_constraint_generator_main.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ string_exprt string_constraint_generatort::fresh_string(
177177
symbol_exprt content=fresh_symbol("string_content", type.get_content_type());
178178
string_exprt str(length, content, type);
179179
created_strings.insert(str);
180+
add_default_axioms(str);
180181
return str;
181182
}
182183

@@ -246,7 +247,7 @@ string_exprt string_constraint_generatort::convert_java_string_to_string_exprt(
246247

247248
/*******************************************************************\
248249
249-
Function: string_constraint_generatort::add_default_constraints
250+
Function: string_constraint_generatort::add_default_axioms
250251
251252
Inputs:
252253
s - a string expression
@@ -267,7 +268,8 @@ Function: string_constraint_generatort::add_default_constraints
267268
void string_constraint_generatort::add_default_axioms(
268269
const string_exprt &s)
269270
{
270-
s.axiom_for_is_longer_than(from_integer(0, s.length().type()));
271+
axioms.push_back(
272+
s.axiom_for_is_longer_than(from_integer(0, s.length().type())));
271273
if(max_string_length!=std::numeric_limits<size_t>::max())
272274
axioms.push_back(s.axiom_for_is_shorter_than(max_string_length));
273275

src/solvers/refinement/string_refinement.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,6 @@ void string_refinementt::concretize_string(const exprt &expr)
332332
{
333333
string_exprt str=to_string_expr(expr);
334334
exprt length=get(str.length());
335-
add_lemma(equal_exprt(str.length(), length));
336335
exprt content=str.content();
337336
replace_expr(symbol_resolve, content);
338337
found_length[content]=length;
@@ -350,6 +349,7 @@ void string_refinementt::concretize_string(const exprt &expr)
350349
else
351350
{
352351
size_t concretize_limit=found_length.to_long();
352+
assert(concretize_limit<=generator.max_string_length);
353353
concretize_limit=concretize_limit>generator.max_string_length?
354354
generator.max_string_length:concretize_limit;
355355
exprt content_expr=str.content();
@@ -596,7 +596,11 @@ decision_proceduret::resultt string_refinementt::dec_solve()
596596
do_concretizing=false;
597597
}
598598
else
599+
{
600+
debug() << "check_SAT: the model is correct and "
601+
<< "does not need concretizing" << eom;
599602
return D_SATISFIABLE;
603+
}
600604
}
601605

602606
display_index_set();
@@ -611,6 +615,7 @@ decision_proceduret::resultt string_refinementt::dec_solve()
611615
}
612616
break;
613617
default:
618+
debug() << "check_SAT: default return " << res << eom;
614619
return res;
615620
}
616621
}

0 commit comments

Comments
 (0)