Remove duplicate code
Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
parent
4efa9a92df
commit
10def5cabe
3 changed files with 42 additions and 57 deletions
|
@ -12,6 +12,7 @@ Author: Leonardo de Moura
|
|||
#include "mpz.h"
|
||||
#include "level.h"
|
||||
#include "hash.h"
|
||||
#include "buffer.h"
|
||||
|
||||
namespace lean {
|
||||
/* =======================================
|
||||
|
@ -334,4 +335,33 @@ struct args {
|
|||
*/
|
||||
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;
|
||||
}
|
||||
}
|
||||
// =======================================
|
||||
}
|
||||
|
|
|
@ -36,39 +36,15 @@ struct max_sharing_fn::imp {
|
|||
cache(a);
|
||||
return a;
|
||||
case expr_kind::App: {
|
||||
buffer<expr> new_args;
|
||||
bool modified = false;
|
||||
for (expr const & old_arg : args(a)) {
|
||||
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());
|
||||
expr r = update_app(a, [=](expr const & c){ return apply(c); });
|
||||
cache(r);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
case expr_kind::Lambda:
|
||||
case expr_kind::Pi: {
|
||||
expr const & old_t = abst_type(a);
|
||||
expr const & old_b = abst_body(a);
|
||||
expr t = apply(old_t);
|
||||
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);
|
||||
expr r = update_abst(a, [=](expr const & t, expr const & b) { return std::make_pair(apply(t), apply(b)); });
|
||||
cache(r);
|
||||
return r;
|
||||
}
|
||||
else {
|
||||
cache(a);
|
||||
return a;
|
||||
}
|
||||
}}
|
||||
lean_unreachable();
|
||||
return a;
|
||||
|
|
|
@ -39,35 +39,14 @@ class replace_fn {
|
|||
switch (e.kind()) {
|
||||
case expr_kind::Type: case expr_kind::Numeral: case expr_kind::Constant: case expr_kind::Var:
|
||||
break;
|
||||
case expr_kind::App: {
|
||||
buffer<expr> new_args;
|
||||
bool modified = false;
|
||||
for (expr const & a : args(e)) {
|
||||
new_args.push_back(apply(a, offset));
|
||||
if (!eqp(a, new_args.back()))
|
||||
modified = true;
|
||||
}
|
||||
if (modified)
|
||||
r = app(new_args.size(), new_args.data());
|
||||
else
|
||||
r = e;
|
||||
case expr_kind::App:
|
||||
r = update_app(e, [=](expr const & c) { return apply(c, offset); });
|
||||
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;
|
||||
}
|
||||
case expr_kind::Pi:
|
||||
r = update_abst(e, [=](expr const & t, expr const & b) { return std::make_pair(apply(t, offset), apply(b, offset+1)); });
|
||||
break;
|
||||
}}
|
||||
}
|
||||
}
|
||||
|
||||
if (sh)
|
||||
|
|
Loading…
Reference in a new issue