Remove duplicate code

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2013-07-29 21:28:22 -07:00
parent 4efa9a92df
commit 10def5cabe
3 changed files with 42 additions and 57 deletions

View file

@ -12,6 +12,7 @@ Author: Leonardo de Moura
#include "mpz.h" #include "mpz.h"
#include "level.h" #include "level.h"
#include "hash.h" #include "hash.h"
#include "buffer.h"
namespace lean { namespace lean {
/* ======================================= /* =======================================
@ -334,4 +335,33 @@ struct args {
*/ */
expr copy(expr const & e); expr copy(expr const & e);
// ======================================= // =======================================
// =======================================
// Update
template<typename F> expr update_app(expr const & e, F f) {
buffer<expr> new_args;
bool modified = false;
for (expr const & a : args(e)) {
new_args.push_back(f(a));
if (!eqp(a, new_args.back()))
modified = true;
}
if (modified)
return app(new_args.size(), new_args.data());
else
return e;
}
template<typename F> expr update_abst(expr const & e, F f) {
expr const & old_t = abst_type(e);
expr const & old_b = abst_body(e);
std::pair<expr, expr> p = f(old_t, old_b);
if (!eqp(p.first, old_t) || !eqp(p.second, old_b)) {
name const & n = abst_name(e);
return is_pi(e) ? pi(n, p.first, p.second) : lambda(n, p.first, p.second);
}
else {
return e;
}
}
// =======================================
} }

View file

@ -36,39 +36,15 @@ struct max_sharing_fn::imp {
cache(a); cache(a);
return a; return a;
case expr_kind::App: { case expr_kind::App: {
buffer<expr> new_args; expr r = update_app(a, [=](expr const & c){ return apply(c); });
bool modified = false; cache(r);
for (expr const & old_arg : args(a)) { return r;
new_args.push_back(apply(old_arg));
if (!eqp(old_arg, new_args.back()))
modified = true;
}
if (!modified) {
cache(a);
return a;
}
else {
expr r = app(new_args.size(), new_args.data());
cache(r);
return r;
}
} }
case expr_kind::Lambda: case expr_kind::Lambda:
case expr_kind::Pi: { case expr_kind::Pi: {
expr const & old_t = abst_type(a); expr r = update_abst(a, [=](expr const & t, expr const & b) { return std::make_pair(apply(t), apply(b)); });
expr const & old_b = abst_body(a); cache(r);
expr t = apply(old_t); return r;
expr b = apply(old_b);
if (!eqp(t, old_t) || !eqp(b, old_b)) {
name const & n = abst_name(a);
expr r = is_pi(a) ? pi(n, t, b) : lambda(n, t, b);
cache(r);
return r;
}
else {
cache(a);
return a;
}
}} }}
lean_unreachable(); lean_unreachable();
return a; return a;

View file

@ -39,35 +39,14 @@ class replace_fn {
switch (e.kind()) { switch (e.kind()) {
case expr_kind::Type: case expr_kind::Numeral: case expr_kind::Constant: case expr_kind::Var: case expr_kind::Type: case expr_kind::Numeral: case expr_kind::Constant: case expr_kind::Var:
break; break;
case expr_kind::App: { case expr_kind::App:
buffer<expr> new_args; r = update_app(e, [=](expr const & c) { return apply(c, offset); });
bool modified = false; break;
for (expr const & a : args(e)) { case expr_kind::Lambda:
new_args.push_back(apply(a, offset)); case expr_kind::Pi:
if (!eqp(a, new_args.back())) r = update_abst(e, [=](expr const & t, expr const & b) { return std::make_pair(apply(t, offset), apply(b, offset+1)); });
modified = true;
}
if (modified)
r = app(new_args.size(), new_args.data());
else
r = e;
break; break;
} }
case expr_kind::Lambda:
case expr_kind::Pi: {
expr const & old_t = abst_type(e);
expr const & old_b = abst_body(e);
expr t = apply(old_t, offset);
expr b = apply(old_b, offset+1);
if (!eqp(t, old_t) || !eqp(b, old_b)) {
name const & n = abst_name(e);
r = is_pi(e) ? pi(n, t, b) : lambda(n, t, b);
}
else {
r = e;
}
break;
}}
} }
if (sh) if (sh)