Skip to content

Commit e99097e

Browse files
committed
Added SMT encoding of array_comprehension_exprt
1 parent f899754 commit e99097e

File tree

2 files changed

+37
-1
lines changed

2 files changed

+37
-1
lines changed

regression/cbmc/byte_update15/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
CORE broken-smt-backend
1+
CORE smt-backend
22
main.c
33

44
^EXIT=0$

src/solvers/smt2/smt2_conv.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1289,6 +1289,19 @@ void smt2_convt::convert_expr(const exprt &expr)
12891289
CHECK_RETURN(it != defined_expressions.end());
12901290
out << it->second;
12911291
}
1292+
else if(expr.id() == ID_array_comprehension)
1293+
{
1294+
const auto &array_comprehension = to_array_comprehension_expr(expr);
1295+
1296+
DATA_INVARIANT(
1297+
array_comprehension.type().id() == ID_array,
1298+
"array_comprehension expression shall have array type");
1299+
1300+
const auto it = defined_expressions.find(array_comprehension);
1301+
CHECK_RETURN(it != defined_expressions.end());
1302+
1303+
out << it->second;
1304+
}
12921305
else if(expr.id()==ID_index)
12931306
{
12941307
convert_index(to_index_expr(expr));
@@ -4390,6 +4403,29 @@ void smt2_convt::find_symbols(const exprt &expr)
43904403
defined_expressions[expr]=id;
43914404
}
43924405
}
4406+
else if(expr.id() == ID_array_comprehension)
4407+
{
4408+
if(defined_expressions.find(expr) == defined_expressions.end())
4409+
{
4410+
const auto &array_comprehension = to_array_comprehension_expr(expr);
4411+
4412+
const irep_idt id =
4413+
"array_comprehension." + std::to_string(defined_expressions.size());
4414+
out << "(define-fun " << id << " () ";
4415+
convert_type(array_comprehension.type());
4416+
out << " (lambda ((";
4417+
convert_expr(array_comprehension.arg());
4418+
out << " ";
4419+
convert_type(array_comprehension.type().size().type());
4420+
out << ")) ";
4421+
convert_expr(array_comprehension.body());
4422+
out << "))\n";
4423+
4424+
defined_expressions[expr] = id;
4425+
4426+
defined_expressions[expr] = id;
4427+
}
4428+
}
43934429
else if(expr.id()==ID_array)
43944430
{
43954431
if(defined_expressions.find(expr)==defined_expressions.end())

0 commit comments

Comments
 (0)