@Kha, we now support variable/constant shadowing in patterns.
A constant may occur in a pattern if it is a constructor or tagged with
the new [pattern] attribute. In the standard library, I have tagged
'add', 'zero', 'one', 'bit0', 'bit1' and 'rfl' with this new attribute.
BTW, arbitrary constants and variables may occur nested in type ascriptions and
inaccessible terms.
Here is an example:
meta_definition tactic_result_to_string {A : Type} : tactic_result A → string
| (success a s) := to_string a
| (exception ⌞A⌟ e s) := "Exception: " ++ to_string (e ())
I had to use the inaccessible ⌞A⌟ in the example above, otherwise, we would be shadowing the parameter
{A : Type}, and we would get a type error.
The new validation is performed at to_pattern_fn (parser.cpp).
8 lines
188 B
Text
8 lines
188 B
Text
error_loc_bug.lean:73:17: error: type mismatch at application
|
||
weakening2 (OrI₁ Γ A B H)
|
||
term
|
||
OrI₁ Γ A B H
|
||
has type
|
||
Γ ⊢ A ∨ B
|
||
but is expected to have type
|
||
Γ ⊢ A ∧ B
|