feat(library/tactic/intros_tactic): use '_' to say that some names are irrelevant in the intro tactic

See #695
This commit is contained in:
Leonardo de Moura 2015-12-13 16:47:31 -08:00
parent d4e49a8434
commit 727a4f5a3a
3 changed files with 26 additions and 6 deletions

View file

@ -1902,16 +1902,29 @@ expr parser::parse_tactic_expr_list() {
expr parser::parse_tactic_id_list() {
auto p = pos();
buffer<expr> args;
if (curr_is_identifier()) {
while (curr_is_identifier()) {
name id = get_name_val();
if (curr_is_identifier() || curr_is_token(get_placeholder_tk())) {
while (curr_is_identifier() || curr_is_token(get_placeholder_tk())) {
name id;
if (curr_is_identifier())
id = get_name_val();
else
id = name("_");
args.push_back(mk_local(id, mk_expr_placeholder()));
next();
}
} else {
check_token_next(get_lbracket_tk(), "invalid tactic, '[' or identifier expected");
check_token_next(get_lbracket_tk(), "invalid tactic, '[', identifier or '_' expected");
while (true) {
args.push_back(mk_local(check_id_next("invalid tactic, identifier expected"), mk_expr_placeholder()));
auto id_pos = pos();
name id;
if (curr_is_identifier())
id = get_name_val();
else if (curr_is_token(get_placeholder_tk()))
id = name("_");
else
throw parser_error("invalid tactic, identifier or '_' expected", id_pos);
next();
args.push_back(mk_local(id, mk_expr_placeholder()));
if (!curr_is_token(get_comma_tk()))
break;
next();
@ -1933,7 +1946,7 @@ expr parser::parse_tactic_opt_expr_list() {
}
expr parser::parse_tactic_opt_id_list() {
if (curr_is_token(get_lbracket_tk()) || curr_is_identifier()) {
if (curr_is_token(get_lbracket_tk()) || curr_is_identifier() || curr_is_token(get_placeholder_tk())) {
return parse_tactic_id_list();
} else if (curr_is_token(get_with_tk())) {
next();

View file

@ -44,6 +44,8 @@ static tactic intro_intros_tactic(list<name> _ns, bool is_intros) {
name new_name;
if (!is_nil(ns)) {
new_name = head(ns);
if (new_name == "_")
new_name = get_unused_name(binding_name(t), m);
ns = tail(ns);
} else {
new_name = get_unused_name(binding_name(t), m);

View file

@ -0,0 +1,5 @@
example (p q r : Prop) : p → q → r → r :=
begin
intro _ _ Hr,
assumption
end