@@ -61,6 +61,13 @@ bool macro_finder::is_arith_macro(expr * n, proof * pr, bool deps_valid, expr_de
61
61
if (!m_util.is_arith_macro (body, num_decls, head, def, inv))
62
62
return false ;
63
63
app_ref new_body (m);
64
+ func_decl * f = head->get_decl ();
65
+ // functions introduced within macros are Skolem functions
66
+ // To avoid unsound expansion of these as macros (because they
67
+ // appear in model conversions and are therefore not fully
68
+ // replacable) we prevent these from being treated as macro functions.
69
+ if (m_macro_manager.contains (f) || f->is_skolem ())
70
+ return false ;
64
71
65
72
if (!inv || m.is_eq (body))
66
73
new_body = m.mk_app (to_app (body)->get_decl (), head, def);
@@ -82,8 +89,7 @@ bool macro_finder::is_arith_macro(expr * n, proof * pr, bool deps_valid, expr_de
82
89
}
83
90
// is ge or le
84
91
//
85
- TRACE (" macro_finder" , tout << " is_arith_macro: is_ge or is_le\n " ;);
86
- func_decl * f = head->get_decl ();
92
+ TRACE (" macro_finder" , tout << " is_arith_macro: is_ge or is_le " << f->get_name () << " \n " ;);
87
93
func_decl * k = m.mk_fresh_func_decl (f->get_name (), symbol::null, f->get_arity (), f->get_domain (), f->get_range ());
88
94
app * k_app = m.mk_app (k, head->get_num_args (), head->get_args ());
89
95
expr_ref_buffer new_rhs_args (m);
@@ -132,6 +138,9 @@ bool macro_finder::is_arith_macro(expr * n, proof * pr, vector<justified_expr>&
132
138
if (!m_util.is_arith_macro (body, num_decls, head, def, inv))
133
139
return false ;
134
140
app_ref new_body (m);
141
+ func_decl * f = head->get_decl ();
142
+ if (m_macro_manager.contains (f) || f->is_skolem ())
143
+ return false ;
135
144
136
145
if (!inv || m.is_eq (body))
137
146
new_body = m.mk_app (to_app (body)->get_decl (), head, def);
@@ -148,12 +157,11 @@ bool macro_finder::is_arith_macro(expr * n, proof * pr, vector<justified_expr>&
148
157
new_pr = m.mk_modus_ponens (pr, rw);
149
158
}
150
159
if (m.is_eq (body)) {
151
- return m_macro_manager.insert (head-> get_decl () , new_q, new_pr);
160
+ return m_macro_manager.insert (f , new_q, new_pr);
152
161
}
153
162
// is ge or le
154
163
//
155
164
TRACE (" macro_finder" , tout << " is_arith_macro: is_ge or is_le\n " ;);
156
- func_decl * f = head->get_decl ();
157
165
func_decl * k = m.mk_fresh_func_decl (f->get_name (), symbol::null, f->get_arity (), f->get_domain (), f->get_range ());
158
166
app * k_app = m.mk_app (k, head->get_num_args (), head->get_args ());
159
167
expr_ref_buffer new_rhs_args (m);
@@ -289,7 +297,7 @@ bool macro_finder::expand_macros(expr_ref_vector const& exprs, proof_ref_vector
289
297
found_new_macro = true ;
290
298
}
291
299
else if (m_util.is_pseudo_predicate_macro (new_n, head, t, def)) {
292
- TRACE (" macro_finder" , tout << " found new pseudo macro:\n " << head << " \n " << t << " \n " << def << " \n " ;);
300
+ TRACE (" macro_finder" , tout << " found new pseudo macro:\n " << head-> get_decl ()-> get_name () << " \n " << t << " \n " << def << " \n " ;);
293
301
pseudo_predicate_macro2macro (m, head, t, def, to_quantifier (new_n), new_pr, deps_valid, new_dep, new_exprs, new_prs, new_deps);
294
302
found_new_macro = true ;
295
303
}
@@ -300,8 +308,6 @@ bool macro_finder::expand_macros(expr_ref_vector const& exprs, proof_ref_vector
300
308
if (deps_valid)
301
309
new_deps.push_back (new_dep);
302
310
}
303
- TRACE (" macro_finder" , tout << exprs.size () << " " << deps.size () << " : " ;
304
- tout << new_exprs.size () << " " << new_deps.size () << " \n " ;);
305
311
SASSERT (exprs.size () != deps.size () || new_exprs.size () == new_deps.size ());
306
312
// SASSERT(!m.proofs_enabled() || new_exprs.size() == new_prs.size());
307
313
0 commit comments