@@ -160,6 +160,13 @@ enode_vector create_induction_lemmas::induction_positions(enode* n) {
160
160
return result;
161
161
}
162
162
163
+ void create_induction_lemmas::abstract1 (enode* n, enode* t, expr* x, abstractions& result) {
164
+ expr_safe_replace rep (m);
165
+ rep.insert (t->get_owner (), x);
166
+ expr_ref e (n->get_owner (), m);
167
+ rep (e);
168
+ result.push_back (abstraction (e));
169
+ }
163
170
164
171
/* *
165
172
* abstraction candidates for replacing different occurrence of t in n by x
@@ -172,14 +179,14 @@ void create_induction_lemmas::abstract(enode* n, enode* t, expr* x, abstractions
172
179
std::cout << " abs: " << result.size () << " : " << mk_pp (n->get_owner (), m) << " \n " ;
173
180
if (n->get_root () == t->get_root ()) {
174
181
result.push_back (abstraction (m, x, n->get_owner (), t->get_owner ()));
182
+ return ;
175
183
}
176
- # if 0
184
+ func_decl* f = n-> get_owner ()-> get_decl ();
177
185
// check if n is a s
178
- if (is_skolem(n->get_owner() )) {
179
- result.push_back(abstraction(m, n->get_owner()) );
180
- return ;
186
+ if (f-> is_skolem ( )) {
187
+ expr_ref e ( n->get_owner (), m );
188
+ result. push_back ( abstraction (e)) ;
181
189
}
182
- #endif
183
190
184
191
abstraction_args r1, r2;
185
192
r1.push_back (abstraction_arg (m));
@@ -330,32 +337,19 @@ literal create_induction_lemmas::mk_literal(expr* e) {
330
337
return ctx.get_literal (e);
331
338
}
332
339
333
- func_decl* create_induction_lemmas::mk_skolem (sort* s) {
334
- func_decl* f = nullptr ;
335
- if (!m_sort2skolem.find (s, f)) {
336
- sort* domain[3 ] = { m_a.mk_int (), s, m.mk_bool_sort () };
337
- f = m.mk_fresh_func_decl (" sk" , 3 , domain, s);
338
- m_pinned.push_back (f);
339
- m_pinned.push_back (s);
340
- m_sort2skolem.insert (s, f);
341
- }
342
- return f;
343
- }
344
-
345
-
346
340
bool create_induction_lemmas::operator ()(literal lit) {
347
341
unsigned num = m_num_lemmas;
348
342
enode* r = ctx.bool_var2enode (lit.var ());
349
343
unsigned position = 0 ;
350
344
for (enode* n : induction_positions (r)) {
351
345
expr* t = n->get_owner ();
352
346
sort* s = m.get_sort (t);
353
- expr_ref sk (m.mk_app ( mk_skolem (s), m_a. mk_int (position), t, r-> get_owner () ), m);
347
+ expr_ref sk (m.mk_fresh_const ( " sk " , s ), m);
354
348
std::cout << " abstract " << mk_pp (t, m) << " " << sk << " \n " ;
355
349
abstractions abs ;
356
- abstract (r, n, sk, abs );
357
- abs .pop_back (); // last position has no generalizations
358
- filter_abstractions (lit.sign (), abs );
350
+ abstract1 (r, n, sk, abs );
351
+ // if (ab.size() > 1) abs.pop_back(); // last position has no generalizations
352
+ if ( abs . size () > 1 ) filter_abstractions (lit.sign (), abs );
359
353
for (abstraction& a : abs ) {
360
354
create_lemmas (t, sk, a, lit);
361
355
}
@@ -371,7 +365,6 @@ create_induction_lemmas::create_induction_lemmas(context& ctx, ast_manager& m, v
371
365
vs(vs),
372
366
m_dt(m),
373
367
m_a(m),
374
- m_pinned(m),
375
368
m_num_lemmas(0 )
376
369
{}
377
370
0 commit comments