fix(library/tactic/induction_tactic): fixes #893

This commit is contained in:
Leonardo de Moura 2015-12-10 09:19:58 -08:00
parent 1f8de7b50b
commit c9ff175cf4
3 changed files with 26 additions and 0 deletions

View file

@ -243,6 +243,11 @@ class induction_tac {
<< pos+1 << " of major premise '" << h << "' type is an index, " << pos+1 << " of major premise '" << h << "' type is an index, "
<< "but it occurs more than once"); << "but it occurs more than once");
} }
if (i < pos && depends_on(h_type_args[i], idx)) {
throw tactic_exception(sstream() << "invalid 'induction' tactic, argument #"
<< pos+1 << " of major premise '" << h << "' type is an index, "
<< "but it occurs in previous arguments");
}
if (i > pos && // occurs after idx if (i > pos && // occurs after idx
std::find(idx_pos.begin(), idx_pos.end(), i) != idx_pos.end() && // it is also an index std::find(idx_pos.begin(), idx_pos.end(), i) != idx_pos.end() && // it is also an index
is_local(h_type_args[i]) && // if it is not an index, it will fail anyway. is_local(h_type_args[i]) && // if it is not an index, it will fail anyway.

5
tests/lean/893.hlean Normal file
View file

@ -0,0 +1,5 @@
example {A : Type} (f : A → A) (a : A) (H : f a = a) : unit :=
begin
induction H, -- this should raise an error
exact unit.star
end

View file

@ -0,0 +1,16 @@
893.hlean:3:2: error:invalid 'induction' tactic, invalid 'induction' tactic, argument #3 of major premise 'H' type is an index, but it occurs in previous arguments
proof state:
A : Type,
f : A → A,
a : A,
H : f a = a
⊢ unit
893.hlean:5:0: error: don't know how to synthesize placeholder
A : Type,
f : A → A,
a : A,
H : f a = a
⊢ unit
893.hlean:5:0: error: failed to add declaration 'example' to environment, value has metavariables
remark: set 'formatter.hide_full_terms' to false to see the complete term
?M_1