Skip to content

Commit d6f7c5a

Browse files
author
Daniel Kroening
committed
smt2_solver: implement get-value
1 parent d5db868 commit d6f7c5a

File tree

2 files changed

+73
-19
lines changed

2 files changed

+73
-19
lines changed

scripts/delete_failing_smt2_solver_tests

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ rm Float4/test.desc
3939
rm Float5/test.desc
4040
rm Float6/test.desc
4141
rm Float8/test.desc
42-
rm Free2/test.desc
4342
rm Function1/test.desc
4443
rm Initialization6/test.desc
4544
rm Linking4/test.desc
@@ -51,14 +50,12 @@ rm Malloc19/test.desc
5150
rm Malloc21/test.desc
5251
rm Malloc23/test.desc
5352
rm Malloc24/test.desc
54-
rm Memory_leak1/test.desc
5553
rm Memory_leak2/test.desc
5654
rm Multi_Dimensional_Array1/test.desc
5755
rm Multi_Dimensional_Array2/test.desc
5856
rm Multi_Dimensional_Array3/test.desc
5957
rm Multi_Dimensional_Array4/test.desc
6058
rm Multi_Dimensional_Array6/test.desc
61-
rm Multiple_Properties1/test.desc
6259
rm Overflow_Leftshift1/test.desc
6360
rm Overflow_Multiplication1/test.desc
6461
rm Overflow_Subtraction1/test.desc
@@ -92,14 +89,12 @@ rm Quantifiers-not-exists/test.desc
9289
rm Quantifiers-two-dimension-array/test.desc
9390
rm Quantifiers-type/test.desc
9491
rm Quantifiers1/test.desc
95-
rm Recursion5/test.desc
9692
rm String2/test.desc
9793
rm Struct_Bytewise1/test.desc
9894
rm Struct_Bytewise2/test.desc
9995
rm Struct_Initialization2/test.desc
10096
rm Struct_Padding1/test.desc
10197
rm Typecast1/test.desc
102-
rm Undefined_Shift1/test.desc
10398
rm Union_Initialization1/test.desc
10499
rm Unwinding_Locality1/test.desc
105100
rm address_space_size_limit1/test.desc
@@ -117,7 +112,6 @@ rm byte_update6/test.desc
117112
rm byte_update7/test.desc
118113
rm byte_update8/test.desc
119114
rm byte_update9/test.desc
120-
rm compact-trace/test.desc
121115
rm dynamic_size1/stack_object.desc
122116
rm equality_through_array1/test.desc
123117
rm equality_through_array2/test.desc
@@ -134,19 +128,14 @@ rm equality_through_struct_containing_arrays2/test.desc
134128
rm equality_through_union1/test.desc
135129
rm equality_through_union2/test.desc
136130
rm equality_through_union3/test.desc
137-
rm full_slice1/test.desc
138-
rm full_slice2/test.desc
139131
rm gcc_bswap1/test.desc
140132
rm gcc_c99-bool-1/test.desc
141133
rm gcc_statement_expression4/test.desc
142-
rm gcc_switch_case_range1/test.desc
143-
rm gcc_switch_case_range2/test.desc
144134
rm gcc_vector1/test.desc
145135
rm gcc_vector2/test.desc
146136
rm graphml_witness1/test.desc
147137
rm havoc_object1/test.desc
148138
rm hex_trace/test.desc
149-
rm if2/test.desc
150139
rm integer-assignments1/test.desc
151140
rm little-endian-array1/test.desc
152141
rm memory_allocation1/test.desc

src/solvers/smt2/smt2_solver.cpp

Lines changed: 73 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ Author: Daniel Kroening, [email protected]
66
77
\*******************************************************************/
88

9+
#include "smt2_parser.h"
10+
11+
#include "smt2_format.h"
12+
913
#include <fstream>
1014
#include <iostream>
1115

12-
#include "smt2_parser.h"
13-
1416
#include <util/message.h>
1517
#include <util/namespace.h>
1618
#include <util/replace_symbol.h>
@@ -23,11 +25,8 @@ Author: Daniel Kroening, [email protected]
2325
class smt2_solvert:public smt2_parsert
2426
{
2527
public:
26-
smt2_solvert(
27-
std::istream &_in,
28-
decision_proceduret &_solver):
29-
smt2_parsert(_in),
30-
solver(_solver)
28+
smt2_solvert(std::istream &_in, decision_proceduret &_solver)
29+
: smt2_parsert(_in), solver(_solver), status(NOT_SOLVED)
3130
{
3231
}
3332

@@ -39,6 +38,13 @@ class smt2_solvert:public smt2_parsert
3938
void expand_function_applications(exprt &);
4039

4140
std::set<irep_idt> constants_done;
41+
42+
enum
43+
{
44+
NOT_SOLVED,
45+
SAT,
46+
UNSAT
47+
} status;
4248
};
4349

4450
void smt2_solvert::define_constants(const exprt &expr)
@@ -139,14 +145,17 @@ void smt2_solvert::command(const std::string &c)
139145
{
140146
case decision_proceduret::resultt::D_SATISFIABLE:
141147
std::cout << "sat\n";
148+
status = SAT;
142149
break;
143150

144151
case decision_proceduret::resultt::D_UNSATISFIABLE:
145152
std::cout << "unsat\n";
153+
status = UNSAT;
146154
break;
147155

148156
case decision_proceduret::resultt::D_ERROR:
149157
std::cout << "error\n";
158+
status = NOT_SOLVED;
150159
}
151160
}
152161
else if(c=="check-sat-assuming")
@@ -162,6 +171,63 @@ void smt2_solvert::command(const std::string &c)
162171
std::cout << e.pretty() << '\n'; // need to do an 'smt2_format'
163172
}
164173
}
174+
else if(c == "get-value")
175+
{
176+
std::vector<exprt> ops;
177+
178+
if(next_token() != OPEN)
179+
throw "get-value expects list as argument";
180+
181+
while(peek() != CLOSE && peek() != END_OF_FILE)
182+
ops.push_back(expression()); // any term
183+
184+
if(next_token() != CLOSE)
185+
throw "get-value expects ')' at end of list";
186+
187+
if(status != SAT)
188+
throw "model is not available";
189+
190+
std::vector<exprt> values;
191+
values.reserve(ops.size());
192+
193+
for(const auto &op : ops)
194+
{
195+
if(op.id() != ID_symbol)
196+
throw "get-value expects symbol";
197+
198+
const auto &identifier = to_symbol_expr(op).get_identifier();
199+
200+
const auto id_map_it = id_map.find(identifier);
201+
202+
if(id_map_it == id_map.end())
203+
throw "unexpected symbol " + id2string(identifier);
204+
205+
exprt value;
206+
207+
if(id_map_it->second.definition.is_nil())
208+
value = solver.get(op);
209+
else
210+
value = solver.get(id_map_it->second.definition);
211+
212+
if(value.is_nil())
213+
throw "no value for " + id2string(identifier);
214+
215+
values.push_back(value);
216+
}
217+
218+
std::cout << '(';
219+
220+
for(std::size_t op_nr = 0; op_nr < ops.size(); op_nr++)
221+
{
222+
if(op_nr != 0)
223+
std::cout << "\n ";
224+
225+
std::cout << '(' << smt2_format(ops[op_nr]) << ' '
226+
<< smt2_format(values[op_nr]) << ')';
227+
}
228+
229+
std::cout << ")\n";
230+
}
165231
else if(c=="simplify")
166232
{
167233
// this is a command that Z3 appears to implement
@@ -195,7 +261,6 @@ void smt2_solvert::command(const std::string &c)
195261
| ( get-proof )
196262
| ( get-unsat-assumptions )
197263
| ( get-unsat-core )
198-
| ( get-value ( htermi + ) )
199264
| ( pop hnumerali )
200265
| ( push hnumerali )
201266
| ( reset )

0 commit comments

Comments
 (0)