diff --git a/src/frontends/lean/elaborator.cpp b/src/frontends/lean/elaborator.cpp index 4b62b1890..3bf523e9f 100644 --- a/src/frontends/lean/elaborator.cpp +++ b/src/frontends/lean/elaborator.cpp @@ -617,7 +617,12 @@ expr elaborator::visit_app(expr const & e, constraint_seq & cs) { constraint_seq a_cs; expr d_type = binding_domain(f_type); if (d_type == get_tactic_expr_type()) { - expr r = mk_app(f, mk_tactic_expr(app_arg(e)), e.get_tag()); + expr const & a = app_arg(e); + expr r; + if (is_local(a) && (mlocal_type(a) == get_tactic_expr_type() || m_in_equation_lhs)) + r = mk_app(f, a, e.get_tag()); + else + r = mk_app(f, mk_tactic_expr(a), e.get_tag()); cs += f_cs + a_cs; return r; } else { diff --git a/src/library/tactic/expr_to_tactic.cpp b/src/library/tactic/expr_to_tactic.cpp index a55d61dfa..0f8bd0905 100644 --- a/src/library/tactic/expr_to_tactic.cpp +++ b/src/library/tactic/expr_to_tactic.cpp @@ -99,7 +99,10 @@ bool is_tactic_expr(expr const & e) { expr const & get_tactic_expr_expr(expr const & e) { lean_assert(is_tactic_expr(e)); - return macro_arg(e, 0); + expr const * it = &e; + while (is_tactic_expr(*it)) + it = ¯o_arg(*it, 0); + return *it; } void check_tactic_expr(expr const & e, char const * error_msg) { diff --git a/tests/lean/run/def_tac.lean b/tests/lean/run/def_tac.lean new file mode 100644 index 000000000..d160262ea --- /dev/null +++ b/tests/lean/run/def_tac.lean @@ -0,0 +1,26 @@ +context + open tactic + definition cases_refl (e : expr) : tactic := + cases e; apply rfl + + definition cases_lst_refl : expr_list → tactic + | cases_lst_refl expr_list.nil := apply rfl + | cases_lst_refl (expr_list.cons a l) := cases a; cases_lst_refl l + + -- Similar to cases_refl, but make sure the argument is not an arbitrary expression. + definition eq_rec {A : Type} {a b : A} (e : a = b) : tactic := + cases e; apply rfl +end + +notation `cases_lst` l:(foldr `,` (h t, tactic.expr_list.cons h t) tactic.expr_list.nil) := cases_lst_refl l + +open prod +theorem tst₁ (a : nat × nat) : (pr1 a, pr2 a) = a := +by cases_refl a + +theorem tst₂ (a b : nat × nat) (h₁ : pr₁ a = pr₁ b) (h₂ : pr₂ a = pr₂ b) : a = b := +by cases_lst a, b, h₁, h₂ + +open nat +theorem tst₃ (a b : nat) (h : a = b) : a + b = b + a := +by eq_rec h