@@ -319,6 +319,59 @@ static optionalt<smt_termt> get_identifier(
319319 return {};
320320}
321321
322+ array_exprt smt2_incremental_decision_proceduret::get_expr (
323+ const smt_termt &array,
324+ const array_typet &type) const
325+ {
326+ INVARIANT (
327+ type.is_complete (), " Array size is required for getting array values." );
328+ const auto size = numeric_cast<std::size_t >(get (type.size ()));
329+ INVARIANT (
330+ size,
331+ " Size of array must be convertible to std::size_t for getting array value" );
332+ std::vector<exprt> elements;
333+ const auto index_type = type.index_type ();
334+ elements.reserve (*size);
335+ for (std::size_t index = 0 ; index < size; ++index)
336+ {
337+ elements.push_back (get_expr (
338+ smt_array_theoryt::select (
339+ array,
340+ ::convert_expr_to_smt (
341+ from_integer (index, index_type),
342+ object_map,
343+ pointer_sizes_map,
344+ object_size_function.make_application)),
345+ type.element_type()));
346+ }
347+ return array_exprt{elements, type};
348+ }
349+
350+ exprt smt2_incremental_decision_proceduret::get_expr (
351+ const smt_termt &descriptor,
352+ const typet &type) const
353+ {
354+ const smt_get_value_commandt get_value_command{descriptor};
355+ const smt_responset response = get_response_to_command (
356+ *solver_process, get_value_command, identifier_table);
357+ const auto get_value_response = response.cast <smt_get_value_responset>();
358+ if (!get_value_response)
359+ {
360+ throw analysis_exceptiont{
361+ " Expected get-value response from solver, but received - " +
362+ response.pretty ()};
363+ }
364+ if (get_value_response->pairs ().size () > 1 )
365+ {
366+ throw analysis_exceptiont{
367+ " Expected single valuation pair in get-value response from solver, but "
368+ " received multiple pairs - " +
369+ response.pretty ()};
370+ }
371+ return construct_value_expr_from_smt (
372+ get_value_response->pairs ()[0 ].get ().value (), type);
373+ }
374+
322375exprt smt2_incremental_decision_proceduret::get (const exprt &expr) const
323376{
324377 log.conditional_output (log.debug (), [&](messaget::mstreamt &debug) {
@@ -359,25 +412,13 @@ exprt smt2_incremental_decision_proceduret::get(const exprt &expr) const
359412 return expr;
360413 }
361414 }
362- const smt_get_value_commandt get_value_command{*descriptor};
363- const smt_responset response = get_response_to_command (
364- *solver_process, get_value_command, identifier_table);
365- const auto get_value_response = response.cast <smt_get_value_responset>();
366- if (!get_value_response)
415+ if (const auto array_type = type_try_dynamic_cast<array_typet>(expr.type ()))
367416 {
368- throw analysis_exceptiont{
369- " Expected get-value response from solver, but received - " +
370- response.pretty ()};
371- }
372- if (get_value_response->pairs ().size () > 1 )
373- {
374- throw analysis_exceptiont{
375- " Expected single valuation pair in get-value response from solver, but "
376- " received multiple pairs - " +
377- response.pretty ()};
417+ if (array_type->is_incomplete ())
418+ return expr;
419+ return get_expr (*descriptor, *array_type);
378420 }
379- return construct_value_expr_from_smt (
380- get_value_response->pairs ()[0 ].get ().value (), expr.type ());
421+ return get_expr (*descriptor, expr.type ());
381422}
382423
383424void smt2_incremental_decision_proceduret::print_assignment (
0 commit comments