@@ -62,13 +62,16 @@ get_problem_messages(const smt_responset &response)
62
62
// / `convert_expr_to_smt`. This is because any sub expressions which
63
63
// / `convert_expr_to_smt` translates into function applications, must also be
64
64
// / returned by this`gather_dependent_expressions` function.
65
+ // / \details `symbol_exprt`, `array_exprt` and `nondet_symbol_exprt` add
66
+ // / dependant expressions.
65
67
static std::vector<exprt> gather_dependent_expressions (const exprt &expr)
66
68
{
67
69
std::vector<exprt> dependent_expressions;
68
70
expr.visit_pre ([&](const exprt &expr_node) {
69
71
if (
70
72
can_cast_expr<symbol_exprt>(expr_node) ||
71
- can_cast_expr<array_exprt>(expr_node))
73
+ can_cast_expr<array_exprt>(expr_node) ||
74
+ can_cast_expr<nondet_symbol_exprt>(expr_node))
72
75
{
73
76
dependent_expressions.push_back (expr_node);
74
77
}
@@ -100,6 +103,21 @@ void smt2_incremental_decision_proceduret::define_array_function(
100
103
expression_identifiers.emplace (array, array_identifier);
101
104
}
102
105
106
+ void send_function_definition (
107
+ const exprt &expr,
108
+ const irep_idt &symbol_identifier,
109
+ const std::unique_ptr<smt_base_solver_processt> &solver_process,
110
+ std::unordered_map<exprt, smt_identifier_termt, irep_hash>
111
+ &expression_identifiers)
112
+ {
113
+ const smt_declare_function_commandt function{
114
+ smt_identifier_termt (
115
+ symbol_identifier, convert_type_to_smt_sort (expr.type ())),
116
+ {}};
117
+ expression_identifiers.emplace (expr, function.identifier ());
118
+ solver_process->send (function);
119
+ }
120
+
103
121
// / \brief Defines any functions which \p expr depends on, which have not yet
104
122
// / been defined, along with their dependencies in turn.
105
123
void smt2_incremental_decision_proceduret::define_dependent_functions (
@@ -134,12 +152,11 @@ void smt2_incremental_decision_proceduret::define_dependent_functions(
134
152
const symbolt *symbol = nullptr ;
135
153
if (ns.lookup (identifier, symbol) || symbol->value .is_nil ())
136
154
{
137
- const smt_declare_function_commandt function{
138
- smt_identifier_termt (
139
- identifier, convert_type_to_smt_sort (symbol_expr->type ())),
140
- {}};
141
- expression_identifiers.emplace (*symbol_expr, function.identifier ());
142
- solver_process->send (function);
155
+ send_function_definition (
156
+ *symbol_expr,
157
+ symbol_expr->get_identifier (),
158
+ solver_process,
159
+ expression_identifiers);
143
160
}
144
161
else
145
162
{
@@ -153,6 +170,16 @@ void smt2_incremental_decision_proceduret::define_dependent_functions(
153
170
}
154
171
if (const auto array_expr = expr_try_dynamic_cast<array_exprt>(current))
155
172
define_array_function (*array_expr);
173
+ if (
174
+ const auto nondet_symbol =
175
+ expr_try_dynamic_cast<nondet_symbol_exprt>(current))
176
+ {
177
+ send_function_definition (
178
+ *nondet_symbol,
179
+ nondet_symbol->get_identifier (),
180
+ solver_process,
181
+ expression_identifiers);
182
+ }
156
183
to_be_defined.pop ();
157
184
}
158
185
}
0 commit comments