fix(kernel/abstract): propagate tags when abstracting

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2014-06-16 13:00:13 -07:00
parent f70b1b028a
commit 2312f43443
3 changed files with 5 additions and 3 deletions

View file

@ -19,7 +19,7 @@ expr abstract(expr const & e, unsigned s, unsigned n, expr const * subst) {
while (i > 0) { while (i > 0) {
--i; --i;
if (subst[i] == e) if (subst[i] == e)
return some_expr(mk_var(offset + s + n - i - 1)); return some_expr(copy_tag(e, mk_var(offset + s + n - i - 1)));
} }
} }
return none_expr(); return none_expr();
@ -36,7 +36,7 @@ expr abstract_p(expr const & e, unsigned n, expr const * s) {
while (i > 0) { while (i > 0) {
--i; --i;
if (is_eqp(s[i], e)) if (is_eqp(s[i], e))
return some_expr(mk_var(offset + n - i - 1)); return some_expr(copy_tag(e, mk_var(offset + n - i - 1)));
} }
} }
return none_expr(); return none_expr();

View file

@ -463,7 +463,7 @@ unsigned get_free_var_range(expr const & e) {
bool operator==(expr const & a, expr const & b) { return expr_eq_fn()(a, b); } bool operator==(expr const & a, expr const & b) { return expr_eq_fn()(a, b); }
bool is_bi_equal(expr const & a, expr const & b) { return expr_eq_fn(true)(a, b); } bool is_bi_equal(expr const & a, expr const & b) { return expr_eq_fn(true)(a, b); }
static expr copy_tag(expr const & e, expr && new_e) { expr copy_tag(expr const & e, expr && new_e) {
tag t = e.get_tag(); tag t = e.get_tag();
if (t != nulltag) if (t != nulltag)
new_e.set_tag(t); new_e.set_tag(t);

View file

@ -149,6 +149,8 @@ public:
expr const & a7, expr const & a8) const; expr const & a7, expr const & a8) const;
}; };
expr copy_tag(expr const & e, expr && new_e);
// ======================================= // =======================================
// Structural equality // Structural equality
/** \brief Binder information is ignored in the following predicate */ /** \brief Binder information is ignored in the following predicate */