feat(frontends/lean): automatically open 'tactic' namespace (if it is not already open) in 'by' and 'begin-end' expressions
This commit is contained in:
parent
00f9a10e82
commit
38a9aa2a98
8 changed files with 24 additions and 11 deletions
|
@ -347,10 +347,12 @@ environment open_export_cmd(parser & p, bool open) {
|
||||||
env = add_abbrev(p, env, as+id, ns+id);
|
env = add_abbrev(p, env, as+id, ns+id);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
throw parser_error("invalid 'open/export' command option, identifier, 'hiding' or 'renaming' expected", p.pos());
|
throw parser_error("invalid 'open/export' command option, "
|
||||||
|
"identifier, 'hiding' or 'renaming' expected", p.pos());
|
||||||
}
|
}
|
||||||
if (found_explicit && !exceptions.empty())
|
if (found_explicit && !exceptions.empty())
|
||||||
throw parser_error("invalid 'open/export' command option, mixing explicit and implicit 'open/export' options", p.pos());
|
throw parser_error("invalid 'open/export' command option, "
|
||||||
|
"mixing explicit and implicit 'open/export' options", p.pos());
|
||||||
p.check_token_next(get_rparen_tk(), "invalid 'open/export' command option, ')' expected");
|
p.check_token_next(get_rparen_tk(), "invalid 'open/export' command option, ')' expected");
|
||||||
}
|
}
|
||||||
if (!found_explicit) {
|
if (!found_explicit) {
|
||||||
|
|
|
@ -9,9 +9,12 @@ Author: Leonardo de Moura
|
||||||
#include "library/annotation.h"
|
#include "library/annotation.h"
|
||||||
#include "library/placeholder.h"
|
#include "library/placeholder.h"
|
||||||
#include "library/explicit.h"
|
#include "library/explicit.h"
|
||||||
|
#include "library/aliases.h"
|
||||||
|
#include "library/scoped_ext.h"
|
||||||
#include "library/tactic/tactic.h"
|
#include "library/tactic/tactic.h"
|
||||||
#include "library/tactic/expr_to_tactic.h"
|
#include "library/tactic/expr_to_tactic.h"
|
||||||
#include "library/tactic/exact_tactic.h"
|
#include "library/tactic/exact_tactic.h"
|
||||||
|
#include "library/tactic/util.h"
|
||||||
#include "library/typed_expr.h"
|
#include "library/typed_expr.h"
|
||||||
#include "library/choice.h"
|
#include "library/choice.h"
|
||||||
#include "library/let.h"
|
#include "library/let.h"
|
||||||
|
@ -113,9 +116,20 @@ static expr parse_placeholder(parser & p, unsigned, expr const *, pos_info const
|
||||||
return p.save_pos(mk_explicit_expr_placeholder(), pos);
|
return p.save_pos(mk_explicit_expr_placeholder(), pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static environment open_tactic_namespace(parser & p) {
|
||||||
|
if (!is_tactic_namespace_open(p.env())) {
|
||||||
|
environment env = using_namespace(p.env(), p.ios(), "tactic");
|
||||||
|
env = add_aliases(env, name("tactic"), name());
|
||||||
|
return env;
|
||||||
|
} else {
|
||||||
|
return p.env();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static expr parse_by(parser & p, unsigned, expr const *, pos_info const & pos) {
|
static expr parse_by(parser & p, unsigned, expr const *, pos_info const & pos) {
|
||||||
parser::no_undef_id_error_scope scope(p);
|
parser::no_undef_id_error_scope scope(p);
|
||||||
expr t = p.parse_expr();
|
environment env = open_tactic_namespace(p);
|
||||||
|
expr t = p.parse_scoped_expr(0, nullptr, env);
|
||||||
return p.mk_by(t, pos);
|
return p.mk_by(t, pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,6 +140,7 @@ static expr parse_begin_end_core(parser & p, pos_info const & pos) {
|
||||||
buffer<expr> tacs;
|
buffer<expr> tacs;
|
||||||
bool first = true;
|
bool first = true;
|
||||||
parser::no_undef_id_error_scope scope(p);
|
parser::no_undef_id_error_scope scope(p);
|
||||||
|
environment env = open_tactic_namespace(p);
|
||||||
while (!p.curr_is_token(get_end_tk())) {
|
while (!p.curr_is_token(get_end_tk())) {
|
||||||
if (first)
|
if (first)
|
||||||
first = false;
|
first = false;
|
||||||
|
@ -137,7 +152,7 @@ static expr parse_begin_end_core(parser & p, pos_info const & pos) {
|
||||||
p.curr_is_token(get_assume_tk()) || p.curr_is_token(get_take_tk()) ||
|
p.curr_is_token(get_assume_tk()) || p.curr_is_token(get_take_tk()) ||
|
||||||
p.curr_is_token(get_fun_tk()));
|
p.curr_is_token(get_fun_tk()));
|
||||||
auto pos = p.pos();
|
auto pos = p.pos();
|
||||||
expr tac = p.parse_expr();
|
expr tac = p.parse_scoped_expr(0, nullptr, env);
|
||||||
if (use_exact)
|
if (use_exact)
|
||||||
tac = p.mk_app(get_exact_tac_fn(), tac, pos);
|
tac = p.mk_app(get_exact_tac_fn(), tac, pos);
|
||||||
if (pre_tac)
|
if (pre_tac)
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
add_library(tactic goal.cpp proof_state.cpp tactic.cpp elaborate.cpp
|
add_library(tactic goal.cpp proof_state.cpp tactic.cpp elaborate.cpp
|
||||||
apply_tactic.cpp intros_tactic.cpp rename_tactic.cpp trace_tactic.cpp
|
apply_tactic.cpp intros_tactic.cpp rename_tactic.cpp trace_tactic.cpp
|
||||||
exact_tactic.cpp unfold_tactic.cpp expr_to_tactic.cpp init_module.cpp)
|
exact_tactic.cpp unfold_tactic.cpp expr_to_tactic.cpp util.cpp
|
||||||
|
init_module.cpp)
|
||||||
|
|
||||||
target_link_libraries(tactic ${LEAN_LIBS})
|
target_link_libraries(tactic ${LEAN_LIBS})
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import logic
|
import logic
|
||||||
open tactic
|
|
||||||
|
|
||||||
theorem tst {A B : Prop} (H1 : A) (H2 : B) : A
|
theorem tst {A B : Prop} (H1 : A) (H2 : B) : A
|
||||||
:= by assumption
|
:= by assumption
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import logic
|
import logic
|
||||||
open tactic
|
|
||||||
|
|
||||||
theorem tst (a b : Prop) (H : a ↔ b) : b ↔ a
|
theorem tst (a b : Prop) (H : a ↔ b) : b ↔ a
|
||||||
:= by rapply iff.intro;
|
:= by rapply iff.intro;
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import logic
|
import logic
|
||||||
open tactic
|
|
||||||
|
|
||||||
theorem tst (a b : Prop) (H : a ↔ b) : b ↔ a
|
theorem tst (a b : Prop) (H : a ↔ b) : b ↔ a
|
||||||
:= have H1 [visible] : a → b, -- We need to mark H1 as fact, otherwise it is not visible by tactics
|
:= have H1 [visible] : a → b, -- We need to mark H1 as fact, otherwise it is not visible by tactics
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import logic data.string
|
import logic data.string
|
||||||
open tactic
|
|
||||||
|
|
||||||
constant A : Type.{1}
|
constant A : Type.{1}
|
||||||
constant f : A → A → A
|
constant f : A → A → A
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
import logic
|
import logic
|
||||||
open tactic
|
|
||||||
|
|
||||||
inductive nat : Type :=
|
inductive nat : Type :=
|
||||||
zero : nat,
|
zero : nat,
|
||||||
|
@ -24,7 +23,7 @@ coercion num_to_nat
|
||||||
check 2 + 3
|
check 2 + 3
|
||||||
|
|
||||||
-- Define an assump as an alias for the eassumption tactic
|
-- Define an assump as an alias for the eassumption tactic
|
||||||
definition assump : tactic := eassumption
|
definition assump : tactic := tactic.eassumption
|
||||||
|
|
||||||
theorem T1 {p : nat → Prop} {a : nat } (H : p (a+2)) : ∃ x, p (succ x)
|
theorem T1 {p : nat → Prop} {a : nat } (H : p (a+2)) : ∃ x, p (succ x)
|
||||||
:= by apply exists_intro; assump
|
:= by apply exists_intro; assump
|
||||||
|
|
Loading…
Reference in a new issue