smt2_solver: implement get-value

This commit is contained in:
Daniel Kroening 2018-11-24 16:44:29 +00:00
parent d5db868770
commit d6f7c5a3eb
2 changed files with 73 additions and 19 deletions

View File

@ -39,7 +39,6 @@ rm Float4/test.desc
rm Float5/test.desc
rm Float6/test.desc
rm Float8/test.desc
rm Free2/test.desc
rm Function1/test.desc
rm Initialization6/test.desc
rm Linking4/test.desc
@ -51,14 +50,12 @@ rm Malloc19/test.desc
rm Malloc21/test.desc
rm Malloc23/test.desc
rm Malloc24/test.desc
rm Memory_leak1/test.desc
rm Memory_leak2/test.desc
rm Multi_Dimensional_Array1/test.desc
rm Multi_Dimensional_Array2/test.desc
rm Multi_Dimensional_Array3/test.desc
rm Multi_Dimensional_Array4/test.desc
rm Multi_Dimensional_Array6/test.desc
rm Multiple_Properties1/test.desc
rm Overflow_Leftshift1/test.desc
rm Overflow_Multiplication1/test.desc
rm Overflow_Subtraction1/test.desc
@ -92,14 +89,12 @@ rm Quantifiers-not-exists/test.desc
rm Quantifiers-two-dimension-array/test.desc
rm Quantifiers-type/test.desc
rm Quantifiers1/test.desc
rm Recursion5/test.desc
rm String2/test.desc
rm Struct_Bytewise1/test.desc
rm Struct_Bytewise2/test.desc
rm Struct_Initialization2/test.desc
rm Struct_Padding1/test.desc
rm Typecast1/test.desc
rm Undefined_Shift1/test.desc
rm Union_Initialization1/test.desc
rm Unwinding_Locality1/test.desc
rm address_space_size_limit1/test.desc
@ -117,7 +112,6 @@ rm byte_update6/test.desc
rm byte_update7/test.desc
rm byte_update8/test.desc
rm byte_update9/test.desc
rm compact-trace/test.desc
rm dynamic_size1/stack_object.desc
rm equality_through_array1/test.desc
rm equality_through_array2/test.desc
@ -134,19 +128,14 @@ rm equality_through_struct_containing_arrays2/test.desc
rm equality_through_union1/test.desc
rm equality_through_union2/test.desc
rm equality_through_union3/test.desc
rm full_slice1/test.desc
rm full_slice2/test.desc
rm gcc_bswap1/test.desc
rm gcc_c99-bool-1/test.desc
rm gcc_statement_expression4/test.desc
rm gcc_switch_case_range1/test.desc
rm gcc_switch_case_range2/test.desc
rm gcc_vector1/test.desc
rm gcc_vector2/test.desc
rm graphml_witness1/test.desc
rm havoc_object1/test.desc
rm hex_trace/test.desc
rm if2/test.desc
rm integer-assignments1/test.desc
rm little-endian-array1/test.desc
rm memory_allocation1/test.desc

View File

@ -6,11 +6,13 @@ Author: Daniel Kroening, kroening@kroening.com
\*******************************************************************/
#include "smt2_parser.h"
#include "smt2_format.h"
#include <fstream>
#include <iostream>
#include "smt2_parser.h"
#include <util/message.h>
#include <util/namespace.h>
#include <util/replace_symbol.h>
@ -23,11 +25,8 @@ Author: Daniel Kroening, kroening@kroening.com
class smt2_solvert:public smt2_parsert
{
public:
smt2_solvert(
std::istream &_in,
decision_proceduret &_solver):
smt2_parsert(_in),
solver(_solver)
smt2_solvert(std::istream &_in, decision_proceduret &_solver)
: smt2_parsert(_in), solver(_solver), status(NOT_SOLVED)
{
}
@ -39,6 +38,13 @@ protected:
void expand_function_applications(exprt &);
std::set<irep_idt> constants_done;
enum
{
NOT_SOLVED,
SAT,
UNSAT
} status;
};
void smt2_solvert::define_constants(const exprt &expr)
@ -139,14 +145,17 @@ void smt2_solvert::command(const std::string &c)
{
case decision_proceduret::resultt::D_SATISFIABLE:
std::cout << "sat\n";
status = SAT;
break;
case decision_proceduret::resultt::D_UNSATISFIABLE:
std::cout << "unsat\n";
status = UNSAT;
break;
case decision_proceduret::resultt::D_ERROR:
std::cout << "error\n";
status = NOT_SOLVED;
}
}
else if(c=="check-sat-assuming")
@ -162,6 +171,63 @@ void smt2_solvert::command(const std::string &c)
std::cout << e.pretty() << '\n'; // need to do an 'smt2_format'
}
}
else if(c == "get-value")
{
std::vector<exprt> ops;
if(next_token() != OPEN)
throw "get-value expects list as argument";
while(peek() != CLOSE && peek() != END_OF_FILE)
ops.push_back(expression()); // any term
if(next_token() != CLOSE)
throw "get-value expects ')' at end of list";
if(status != SAT)
throw "model is not available";
std::vector<exprt> values;
values.reserve(ops.size());
for(const auto &op : ops)
{
if(op.id() != ID_symbol)
throw "get-value expects symbol";
const auto &identifier = to_symbol_expr(op).get_identifier();
const auto id_map_it = id_map.find(identifier);
if(id_map_it == id_map.end())
throw "unexpected symbol " + id2string(identifier);
exprt value;
if(id_map_it->second.definition.is_nil())
value = solver.get(op);
else
value = solver.get(id_map_it->second.definition);
if(value.is_nil())
throw "no value for " + id2string(identifier);
values.push_back(value);
}
std::cout << '(';
for(std::size_t op_nr = 0; op_nr < ops.size(); op_nr++)
{
if(op_nr != 0)
std::cout << "\n ";
std::cout << '(' << smt2_format(ops[op_nr]) << ' '
<< smt2_format(values[op_nr]) << ')';
}
std::cout << ")\n";
}
else if(c=="simplify")
{
// this is a command that Z3 appears to implement
@ -195,7 +261,6 @@ void smt2_solvert::command(const std::string &c)
| ( get-proof )
| ( get-unsat-assumptions )
| ( get-unsat-core )
| ( get-value ( htermi + ) )
| ( pop hnumerali )
| ( push hnumerali )
| ( reset )