diff --git a/src/kernel/expr.cpp b/src/kernel/expr.cpp index beee50f7d..281d6dd55 100644 --- a/src/kernel/expr.cpp +++ b/src/kernel/expr.cpp @@ -43,34 +43,34 @@ expr_app::~expr_app() { for (unsigned i = 0; i < m_num_args; i++) (m_args+i)->~expr(); } -expr app(unsigned num_args, expr const * args) { - lean_assert(num_args > 1); - unsigned _num_args; - unsigned _num_args0 = 0; - expr const & arg0 = args[0]; +expr app(unsigned n, expr const * as) { + lean_assert(n > 1); + unsigned new_n; + unsigned n0 = 0; + expr const & arg0 = as[0]; // Remark: we represet ((app a b) c) as (app a b c) if (is_app(arg0)) { - _num_args0 = get_num_args(arg0); - _num_args = num_args + _num_args0 - 1; + n0 = num_args(arg0); + new_n = n + n0 - 1; } else { - _num_args = num_args; + new_n = n; } - char * mem = new char[sizeof(expr_app) + _num_args*sizeof(expr)]; - expr r(new (mem) expr_app(_num_args)); + char * mem = new char[sizeof(expr_app) + new_n*sizeof(expr)]; + expr r(new (mem) expr_app(new_n)); expr * m_args = to_app(r)->m_args; unsigned i = 0; unsigned j = 0; - if (_num_args != num_args) { - for (; i < _num_args0; i++) - new (m_args+i) expr(get_arg(arg0, i)); + if (new_n != n) { + for (; i < n0; i++) + new (m_args+i) expr(arg(arg0, i)); j++; } - for (; i < _num_args; ++i, ++j) { - lean_assert(j < num_args); - new (m_args+i) expr(args[j]); + for (; i < new_n; ++i, ++j) { + lean_assert(j < n); + new (m_args+i) expr(as[j]); } - to_app(r)->m_hash = hash_args(_num_args, m_args); + to_app(r)->m_hash = hash_args(new_n, m_args); return r; } @@ -125,7 +125,7 @@ public: if (eqp(a, b)) return true; if (a.hash() != b.hash()) return false; if (a.kind() != b.kind()) return false; - if (is_var(a)) return get_var_idx(a) == get_var_idx(b); + if (is_var(a)) return var_idx(a) == var_idx(b); if (is_prop(a)) return true; if (is_shared(a) && is_shared(b)) { auto p = std::make_pair(a.raw(), b.raw()); @@ -135,31 +135,31 @@ public: } switch (a.kind()) { case expr_kind::Var: lean_unreachable(); return true; - case expr_kind::Constant: return get_const_name(a) == get_const_name(b); + case expr_kind::Constant: return const_name(a) == const_name(b); case expr_kind::App: - if (get_num_args(a) != get_num_args(b)) + if (num_args(a) != num_args(b)) return false; - for (unsigned i = 0; i < get_num_args(a); i++) - if (!apply(get_arg(a, i), get_arg(b, i))) + for (unsigned i = 0; i < num_args(a); i++) + if (!apply(arg(a, i), arg(b, i))) return false; return true; case expr_kind::Lambda: case expr_kind::Pi: // Lambda and Pi // Remark: we ignore get_abs_name because we want alpha-equivalence - return apply(get_abs_type(a), get_abs_type(b)) && apply(get_abs_expr(a), get_abs_expr(b)); + return apply(abst_type(a), abst_type(b)) && apply(abst_expr(a), abst_expr(b)); case expr_kind::Prop: lean_unreachable(); return true; case expr_kind::Type: - if (get_ty_num_vars(a) != get_ty_num_vars(b)) + if (ty_num_vars(a) != ty_num_vars(b)) return false; - for (unsigned i = 0; i < get_ty_num_vars(a); i++) { - uvar v1 = get_ty_var(a, i); - uvar v2 = get_ty_var(b, i); + for (unsigned i = 0; i < ty_num_vars(a); i++) { + uvar v1 = ty_var(a, i); + uvar v2 = ty_var(b, i); if (v1.first != v2.first || v1.second != v2.second) return false; } return true; - case expr_kind::Numeral: return get_numeral(a) == get_numeral(b); + case expr_kind::Numeral: return num_value(a) == num_value(b); } lean_unreachable(); return false; @@ -174,21 +174,21 @@ bool operator==(expr const & a, expr const & b) { // Low-level pretty printer std::ostream & operator<<(std::ostream & out, expr const & a) { switch (a.kind()) { - case expr_kind::Var: out << "#" << get_var_idx(a); break; - case expr_kind::Constant: out << get_const_name(a); break; + case expr_kind::Var: out << "#" << var_idx(a); break; + case expr_kind::Constant: out << const_name(a); break; case expr_kind::App: out << "("; - for (unsigned i = 0; i < get_num_args(a); i++) { + for (unsigned i = 0; i < num_args(a); i++) { if (i > 0) out << " "; - out << get_arg(a, i); + out << arg(a, i); } out << ")"; break; - case expr_kind::Lambda: out << "(fun (" << get_abs_name(a) << " : " << get_abs_type(a) << ") " << get_abs_expr(a) << ")"; break; - case expr_kind::Pi: out << "(pi (" << get_abs_name(a) << " : " << get_abs_type(a) << ") " << get_abs_expr(a) << ")"; break; + case expr_kind::Lambda: out << "(fun (" << abst_name(a) << " : " << abst_type(a) << ") " << abst_expr(a) << ")"; break; + case expr_kind::Pi: out << "(pi (" << abst_name(a) << " : " << abst_type(a) << ") " << abst_expr(a) << ")"; break; case expr_kind::Prop: out << "Prop"; break; case expr_kind::Type: out << "Type"; break; - case expr_kind::Numeral: out << get_numeral(a); break; + case expr_kind::Numeral: out << num_value(a); break; } return out; } diff --git a/src/kernel/expr.h b/src/kernel/expr.h index a0400eb58..b9229514c 100644 --- a/src/kernel/expr.h +++ b/src/kernel/expr.h @@ -279,35 +279,35 @@ inline expr_numeral * to_numeral(expr const & e) { return to_numeral(e.r // ======================================= // Accessors -inline unsigned get_rc(expr_cell * e) { return e->get_rc(); } -inline bool is_shared(expr_cell * e) { return get_rc(e) > 1; } -inline unsigned get_var_idx(expr_cell * e) { return to_var(e)->get_vidx(); } -inline name const & get_const_name(expr_cell * e) { return to_constant(e)->get_name(); } -inline unsigned get_const_pos(expr_cell * e) { return to_constant(e)->get_pos(); } -inline unsigned get_num_args(expr_cell * e) { return to_app(e)->get_num_args(); } -inline expr const & get_arg(expr_cell * e, unsigned idx) { return to_app(e)->get_arg(idx); } -inline name const & get_abs_name(expr_cell * e) { return to_abstraction(e)->get_name(); } -inline expr const & get_abs_type(expr_cell * e) { return to_abstraction(e)->get_type(); } -inline expr const & get_abs_expr(expr_cell * e) { return to_abstraction(e)->get_expr(); } -inline unsigned get_ty_num_vars(expr_cell * e) { return to_type(e)->size(); } -inline uvar const & get_ty_var(expr_cell * e, unsigned idx) { return to_type(e)->get_var(idx); } -inline mpz const & get_numeral(expr_cell * e) { return to_numeral(e)->get_num(); } +inline unsigned get_rc(expr_cell * e) { return e->get_rc(); } +inline bool is_shared(expr_cell * e) { return get_rc(e) > 1; } +inline unsigned var_idx(expr_cell * e) { return to_var(e)->get_vidx(); } +inline name const & const_name(expr_cell * e) { return to_constant(e)->get_name(); } +inline unsigned const_pos(expr_cell * e) { return to_constant(e)->get_pos(); } +inline unsigned num_args(expr_cell * e) { return to_app(e)->get_num_args(); } +inline expr const & arg(expr_cell * e, unsigned idx) { return to_app(e)->get_arg(idx); } +inline name const & abst_name(expr_cell * e) { return to_abstraction(e)->get_name(); } +inline expr const & abst_type(expr_cell * e) { return to_abstraction(e)->get_type(); } +inline expr const & abst_expr(expr_cell * e) { return to_abstraction(e)->get_expr(); } +inline unsigned ty_num_vars(expr_cell * e) { return to_type(e)->size(); } +inline uvar const & ty_var(expr_cell * e, unsigned idx) { return to_type(e)->get_var(idx); } +inline mpz const & num_value(expr_cell * e) { return to_numeral(e)->get_num(); } -inline unsigned get_rc(expr const & e) { return e.raw()->get_rc(); } -inline bool is_shared(expr const & e) { return get_rc(e) > 1; } -inline unsigned get_var_idx(expr const & e) { return to_var(e)->get_vidx(); } -inline name const & get_const_name(expr const & e) { return to_constant(e)->get_name(); } -inline unsigned get_const_pos(expr const & e) { return to_constant(e)->get_pos(); } -inline unsigned get_num_args(expr const & e) { return to_app(e)->get_num_args(); } -inline expr const & get_arg(expr const & e, unsigned idx) { return to_app(e)->get_arg(idx); } -inline expr const * begin_args(expr const & e) { return to_app(e)->begin_args(); } -inline expr const * end_args(expr const & e) { return to_app(e)->end_args(); } -inline name const & get_abs_name(expr const & e) { return to_abstraction(e)->get_name(); } -inline expr const & get_abs_type(expr const & e) { return to_abstraction(e)->get_type(); } -inline expr const & get_abs_expr(expr const & e) { return to_abstraction(e)->get_expr(); } -inline unsigned get_ty_num_vars(expr const & e) { return to_type(e)->size(); } -inline uvar const & get_ty_var(expr const & e, unsigned idx) { return to_type(e)->get_var(idx); } -inline mpz const & get_numeral(expr const & e) { return to_numeral(e)->get_num(); } +inline unsigned get_rc(expr const & e) { return e.raw()->get_rc(); } +inline bool is_shared(expr const & e) { return get_rc(e) > 1; } +inline unsigned var_idx(expr const & e) { return to_var(e)->get_vidx(); } +inline name const & const_name(expr const & e) { return to_constant(e)->get_name(); } +inline unsigned const_pos(expr const & e) { return to_constant(e)->get_pos(); } +inline unsigned num_args(expr const & e) { return to_app(e)->get_num_args(); } +inline expr const & arg(expr const & e, unsigned idx) { return to_app(e)->get_arg(idx); } +inline expr const * begin_args(expr const & e) { return to_app(e)->begin_args(); } +inline expr const * end_args(expr const & e) { return to_app(e)->end_args(); } +inline name const & abst_name(expr const & e) { return to_abstraction(e)->get_name(); } +inline expr const & abst_type(expr const & e) { return to_abstraction(e)->get_type(); } +inline expr const & abst_expr(expr const & e) { return to_abstraction(e)->get_expr(); } +inline unsigned ty_num_vars(expr const & e) { return to_type(e)->size(); } +inline uvar const & ty_var(expr const & e, unsigned idx) { return to_type(e)->get_var(idx); } +inline mpz const & num_value(expr const & e) { return to_numeral(e)->get_num(); } // ======================================= // ======================================= @@ -344,11 +344,11 @@ std::ostream & operator<<(std::ostream & out, expr const & a); ... do something with argument } */ -struct app_args { +struct args { expr const & m_app; - app_args(expr const & a):m_app(a) { lean_assert(is_app(a)); } - expr const * begin() const { return &get_arg(m_app, 0); } - expr const * end() const { return begin() + get_num_args(m_app); } + args(expr const & a):m_app(a) { lean_assert(is_app(a)); } + expr const * begin() const { return &arg(m_app, 0); } + expr const * end() const { return begin() + num_args(m_app); } }; // ======================================= diff --git a/src/kernel/free_vars.cpp b/src/kernel/free_vars.cpp index c497c22ff..f191ef3dc 100644 --- a/src/kernel/free_vars.cpp +++ b/src/kernel/free_vars.cpp @@ -19,7 +19,7 @@ public: case expr_kind::Constant: case expr_kind::Prop: case expr_kind::Type: case expr_kind::Numeral: return false; case expr_kind::Var: - return get_var_idx(e) >= offset; + return var_idx(e) >= offset; case expr_kind::App: case expr_kind::Lambda: case expr_kind::Pi: break; } @@ -45,7 +45,7 @@ public: break; case expr_kind::Lambda: case expr_kind::Pi: - result = apply(get_abs_type(e), offset) || apply(get_abs_expr(e), offset + 1); + result = apply(abst_type(e), offset) || apply(abst_expr(e), offset + 1); break; } diff --git a/src/kernel/max_sharing.cpp b/src/kernel/max_sharing.cpp index 32ca88cd3..6aee9179b 100644 --- a/src/kernel/max_sharing.cpp +++ b/src/kernel/max_sharing.cpp @@ -40,7 +40,7 @@ public: case expr_kind::App: { std::vector<expr> new_args; bool modified = false; - for (expr const & old_arg : app_args(a)) { + for (expr const & old_arg : args(a)) { new_args.push_back(apply(old_arg)); if (!eqp(old_arg, new_args.back())) modified = true; @@ -57,12 +57,12 @@ public: } case expr_kind::Lambda: case expr_kind::Pi: { - expr const & old_t = get_abs_type(a); - expr const & old_e = get_abs_expr(a); + expr const & old_t = abst_type(a); + expr const & old_e = abst_expr(a); expr t = apply(old_t); expr e = apply(old_e); if (!eqp(t, old_t) || !eqp(e, old_e)) { - name const & n = get_abs_name(a); + name const & n = abst_name(a); expr r = is_pi(a) ? pi(n, t, e) : lambda(n, t, e); cache(r); return r; diff --git a/src/tests/kernel/expr.cpp b/src/tests/kernel/expr.cpp index 635bd9c03..d7e3cdd96 100644 --- a/src/tests/kernel/expr.cpp +++ b/src/tests/kernel/expr.cpp @@ -20,8 +20,8 @@ void tst1() { expr fa = app(f, a); std::cout << fa << "\n"; std::cout << app(fa, a) << "\n"; - lean_assert(eqp(get_arg(fa, 0), f)); - lean_assert(eqp(get_arg(fa, 1), a)); + lean_assert(eqp(arg(fa, 0), f)); + lean_assert(eqp(arg(fa, 1), a)); lean_assert(!eqp(fa, app(f, a))); lean_assert(app(fa, a) == app(f, a, a)); std::cout << app(fa, fa, fa) << "\n"; @@ -46,12 +46,12 @@ unsigned depth1(expr const & e) { return 1; case expr_kind::App: { unsigned m = 0; - for (expr const & a : app_args(e)) + for (expr const & a : args(e)) m = std::max(m, depth1(a)); return m + 1; } case expr_kind::Lambda: case expr_kind::Pi: - return std::max(depth1(get_abs_type(e)), depth1(get_abs_expr(e))) + 1; + return std::max(depth1(abst_type(e)), depth1(abst_expr(e))) + 1; } return 0; } @@ -67,7 +67,7 @@ unsigned depth2(expr const & e) { [](unsigned m, expr const & arg){ return std::max(depth2(arg), m); }) + 1; case expr_kind::Lambda: case expr_kind::Pi: - return std::max(depth2(get_abs_type(e)), depth2(get_abs_expr(e))) + 1; + return std::max(depth2(abst_type(e)), depth2(abst_expr(e))) + 1; } return 0; } @@ -87,14 +87,14 @@ unsigned depth3(expr const & e) { m = std::max(c, m); break; case expr_kind::App: { - unsigned num = get_num_args(e); + unsigned num = num_args(e); for (unsigned i = 0; i < num; i++) - todo.push_back(std::make_pair(&get_arg(e, i), c)); + todo.push_back(std::make_pair(&arg(e, i), c)); break; } case expr_kind::Lambda: case expr_kind::Pi: - todo.push_back(std::make_pair(&get_abs_type(e), c)); - todo.push_back(std::make_pair(&get_abs_expr(e), c)); + todo.push_back(std::make_pair(&abst_type(e), c)); + todo.push_back(std::make_pair(&abst_expr(e), c)); break; } } @@ -150,7 +150,7 @@ unsigned count_core(expr const & a, expr_set & s) { return std::accumulate(begin_args(a), end_args(a), 1, [&](unsigned sum, expr const & arg){ return sum + count_core(arg, s); }); case expr_kind::Lambda: case expr_kind::Pi: - return count_core(get_abs_type(a), s) + count_core(get_abs_expr(a), s) + 1; + return count_core(abst_type(a), s) + count_core(abst_expr(a), s) + 1; } return 0; } @@ -195,7 +195,7 @@ void tst7() { expr a2 = max_sharing(app(f, v, v)); lean_assert(!eqp(a1, a2)); expr b = max_sharing(app(f, a1, a2)); - lean_assert(eqp(get_arg(b, 1), get_arg(b, 2))); + lean_assert(eqp(arg(b, 1), arg(b, 2))); } void tst8() { @@ -249,10 +249,6 @@ int main() { continue_on_violation(true); std::cout << "sizeof(expr): " << sizeof(expr) << "\n"; std::cout << "sizeof(expr_app): " << sizeof(expr_app) << "\n"; - tst8(); - tst9(); - tst10(); - return 0; tst1(); tst2(); tst3(); @@ -260,6 +256,9 @@ int main() { tst5(); tst6(); tst7(); + tst8(); + tst9(); + tst10(); std::cout << "done" << "\n"; return has_violations() ? 1 : 0; }