fix(frontends/lean/parser): bug in 'using' construct

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2014-01-24 17:08:47 -08:00
parent 8e0888828d
commit 7f3e2b3ef4
5 changed files with 26 additions and 4 deletions

View file

@ -803,12 +803,12 @@ void parser_imp::parse_using() {
new_prefix = curr_name();
next();
}
buffer<std::pair<name, expr>> to_add;
buffer<std::pair<name, name>> to_add;
for (auto it = m_env->begin_objects(); it != m_env->end_objects(); ++it) {
if (it->has_type() && it->has_name() && !is_hidden_object(*it) && is_prefix_of(prefix, it->get_name())) {
auto n = replace_prefix(it->get_name(), prefix, new_prefix);
if (!n.is_anonymous())
to_add.emplace_back(n, mk_constant(it->get_name()));
to_add.emplace_back(n, it->get_name());
}
}
for (auto p : to_add) {

View file

@ -247,7 +247,7 @@ expr parser_imp::parse_mixfixc(operator_info const & op) {
expr parser_imp::get_name_ref(name const & id, pos_info const & p, bool implicit_args) {
auto it = m_using_decls.find(id);
if (it != m_using_decls.end()) {
return it->second;
return get_name_ref(it->second, p, implicit_args);
} else {
lean_assert(!m_namespace_prefixes.empty());
auto it = m_namespace_prefixes.end();

View file

@ -56,7 +56,7 @@ class parser_imp {
typedef name_map<expr> builtins;
typedef expr_map<pos_info> expr_pos_info;
typedef expr_map<tactic> tactic_hints; // a mapping from placeholder to tactic
typedef scoped_map<name, expr, name_hash, name_eq> using_decls;
typedef scoped_map<name, name, name_hash, name_eq> using_decls;
enum class scope_kind { Scope, Namespace };
std::weak_ptr<parser_imp> m_this;

View file

@ -0,0 +1,12 @@
variables a b c d : Nat
axiom H : a + (b + c) = a + (b + d)
using Nat
check add_succr a
theorem mul_zerol2 (a : Nat) : 0 * a = 0
:= induction_on a
(have 0 * 0 = 0 : trivial)
(λ (n : Nat) (iH : 0 * n = 0),
calc 0 * (n + 1) = (0 * n) + 0 : mul_succr 0 n
... = 0 + 0 : { iH }
... = 0 : trivial)

View file

@ -0,0 +1,10 @@
Set: pp::colors
Set: pp::unicode
Assumed: a
Assumed: b
Assumed: c
Assumed: d
Assumed: H
Using: Nat
Nat::add_succr a : ∀ b : , a + (b + 1) = a + b + 1
Proved: mul_zerol2