Skip to content

Commit 5b6255e

Browse files
small updates
1 parent 397bf2d commit 5b6255e

File tree

2 files changed

+23
-34
lines changed

2 files changed

+23
-34
lines changed

src/smt/smt_induction.cpp

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,13 @@ enode_vector create_induction_lemmas::induction_positions(enode* n) {
160160
return result;
161161
}
162162

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+
}
163170

164171
/**
165172
* 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
172179
std::cout << "abs: " << result.size() << ": " << mk_pp(n->get_owner(), m) << "\n";
173180
if (n->get_root() == t->get_root()) {
174181
result.push_back(abstraction(m, x, n->get_owner(), t->get_owner()));
182+
return;
175183
}
176-
#if 0
184+
func_decl* f = n->get_owner()->get_decl();
177185
// 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));
181189
}
182-
#endif
183190

184191
abstraction_args r1, r2;
185192
r1.push_back(abstraction_arg(m));
@@ -330,32 +337,19 @@ literal create_induction_lemmas::mk_literal(expr* e) {
330337
return ctx.get_literal(e);
331338
}
332339

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-
346340
bool create_induction_lemmas::operator()(literal lit) {
347341
unsigned num = m_num_lemmas;
348342
enode* r = ctx.bool_var2enode(lit.var());
349343
unsigned position = 0;
350344
for (enode* n : induction_positions(r)) {
351345
expr* t = n->get_owner();
352346
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);
354348
std::cout << "abstract " << mk_pp(t, m) << " " << sk << "\n";
355349
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);
359353
for (abstraction& a : abs) {
360354
create_lemmas(t, sk, a, lit);
361355
}
@@ -371,7 +365,6 @@ create_induction_lemmas::create_induction_lemmas(context& ctx, ast_manager& m, v
371365
vs(vs),
372366
m_dt(m),
373367
m_a(m),
374-
m_pinned(m),
375368
m_num_lemmas(0)
376369
{}
377370

src/smt/smt_induction.h

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -49,30 +49,25 @@ namespace smt {
4949
* Synthesize induction lemmas from induction candidates
5050
*/
5151
class create_induction_lemmas {
52-
context& ctx;
53-
ast_manager& m;
54-
value_sweep& vs;
52+
context& ctx;
53+
ast_manager& m;
54+
value_sweep& vs;
5555
datatype::util m_dt;
5656
arith_util m_a;
57-
obj_map<sort, func_decl*> m_sort2skolem;
58-
ast_ref_vector m_pinned;
59-
unsigned m_num_lemmas;
57+
unsigned m_num_lemmas;
6058

6159
typedef svector<std::pair<expr*,expr*>> expr_pair_vector;
6260

63-
func_decl* mk_skolem(sort* s);
64-
6561
struct abstraction {
66-
expr_ref m_term;
62+
expr_ref m_term;
6763
expr_pair_vector m_eqs;
6864
abstraction(expr_ref& e): m_term(e) {}
6965
abstraction(ast_manager& m, expr* e, expr* n1, expr* n2): m_term(e, m) {
7066
if (n1 != n2) m_eqs.push_back(std::make_pair(n1, n2));
7167
}
7268
abstraction(ast_manager& m, expr* e, expr_pair_vector const& eqs):
7369
m_term(e, m), m_eqs(eqs) {
74-
}
75-
70+
}
7671
};
7772
typedef vector<abstraction> abstractions;
7873

@@ -90,6 +85,7 @@ namespace smt {
9085
bool is_induction_candidate(enode* n);
9186
enode_vector induction_positions(enode* n);
9287
void abstract(enode* n, enode* t, expr* x, abstractions& result);
88+
void abstract1(enode* n, enode* t, expr* x, abstractions& result);
9389
void filter_abstractions(bool sign, abstractions& abs);
9490
void create_lemmas(expr* t, expr* sk, abstraction& a, literal lit);
9591
literal mk_literal(expr* e);

0 commit comments

Comments
 (0)