This PR adds support for changing the binder annotations of existing variables to and from strict-implicit and instance-implicit using the `variable` command. This PR requires a stage0 update to fully take effect. Closes #6078
166 lines
3.7 KiB
Text
166 lines
3.7 KiB
Text
/-!
|
||
# Changing variable binder annotations
|
||
|
||
Tests the use of the `variable` command to update the binder annotations of existing variables. -/
|
||
|
||
/-! Test updating between default and implicit annotations. -/
|
||
|
||
namespace Ex1
|
||
|
||
variable {α : Type}
|
||
variable [Add α]
|
||
variable (α)
|
||
def f (a : α) := a + a
|
||
/-- info: f Nat 5 : Nat -/
|
||
#guard_msgs in
|
||
#check f Nat 5
|
||
variable {α}
|
||
def g (b : α) := b
|
||
/-- info: g 5 : Nat -/
|
||
#guard_msgs in
|
||
#check g 5
|
||
/-- info: Ex1.f (α : Type) [Add α] (a : α) : α -/
|
||
#guard_msgs in
|
||
#check f
|
||
/-- info: Ex1.g {α : Type} (b : α) : α -/
|
||
#guard_msgs in
|
||
#check g
|
||
end Ex1
|
||
|
||
namespace Ex2
|
||
|
||
variable {α β : Type}
|
||
variable (α)
|
||
def f (a : α) := a
|
||
def g (b : β) := b
|
||
/-- info: f Nat 5 : Nat -/
|
||
#guard_msgs in
|
||
#check f Nat 5
|
||
/-- info: g 5 : Nat -/
|
||
#guard_msgs in
|
||
#check g 5
|
||
/-- info: Ex2.f (α : Type) (a : α) : α -/
|
||
#guard_msgs in
|
||
#check f
|
||
/-- info: Ex2.g {β : Type} (b : β) : β -/
|
||
#guard_msgs in
|
||
#check g
|
||
/-- error: redundant binder annotation update -/
|
||
#guard_msgs in
|
||
variable (α)
|
||
end Ex2
|
||
|
||
namespace Ex3
|
||
|
||
variable {α : Type}
|
||
variable (f : α → α)
|
||
variable (α)
|
||
def g (a : α) := f a
|
||
/-- info: Ex3.g (α : Type) (f : α → α) (a : α) : α -/
|
||
#guard_msgs in
|
||
#check g
|
||
variable {f}
|
||
def h (a : α) := f a
|
||
/-- info: Ex3.h (α : Type) {f : α → α} (a : α) : α -/
|
||
#guard_msgs in
|
||
#check h
|
||
end Ex3
|
||
|
||
namespace Ex4
|
||
|
||
variable {α β : Type}
|
||
variable (α γ)
|
||
def g (a : α) (b : β) (c : γ) := (a, b, c)
|
||
/-- info: g Nat Bool 10 "hello" true : Nat × String × Bool -/
|
||
#guard_msgs in
|
||
#check g Nat Bool 10 "hello" true
|
||
variable (f : α → α)
|
||
variable {f γ α}
|
||
def h (a : α) (c : γ) := (f a, c)
|
||
/-- info: Ex4.h.{u_1} {α : Type} {γ : Type u_1} {f : α → α} (a : α) (c : γ) : α × γ -/
|
||
#guard_msgs in
|
||
#check h
|
||
end Ex4
|
||
|
||
/-! Test updating from and to instance implicit. -/
|
||
|
||
namespace Ex5
|
||
|
||
variable [i : Add α]
|
||
variable (i)
|
||
def f (x y : α) := x + y
|
||
/-- info: Ex5.f.{u_1} {α : Type u_1} (i : Add α) (x y : α) : α -/
|
||
#guard_msgs in
|
||
#check f
|
||
variable [i]
|
||
def g (x y : α) := x + y
|
||
/-- info: Ex5.g.{u_1} {α : Type u_1} [i : Add α] (x y : α) : α -/
|
||
#guard_msgs in
|
||
#check g
|
||
end Ex5
|
||
|
||
/-! Test that variables with default values/tactics cannot be updated. -/
|
||
|
||
namespace Ex6
|
||
|
||
variable (a : Nat)
|
||
variable (h : a = a := rfl)
|
||
/-- error: cannot update binder annotation of variables with default values/tactics -/
|
||
#guard_msgs in
|
||
variable {h}
|
||
/-- error: cannot update binder annotation of variables with default values/tactics -/
|
||
#guard_msgs in
|
||
variable {a h}
|
||
def f := a
|
||
/-- info: Ex6.f (a : Nat) : Nat -/
|
||
#guard_msgs in
|
||
#check f
|
||
end Ex6
|
||
|
||
/-! Test that variables that cannot be instance implicit fail to be updated thereto. -/
|
||
|
||
namespace Ex7
|
||
|
||
variable (n : Nat)
|
||
/--
|
||
error: cannot update binder annotation of variable 'n' to instance implicit:
|
||
invalid binder annotation, type is not a class instance
|
||
Nat
|
||
use the command `set_option checkBinderAnnotations false` to disable the check
|
||
-/
|
||
#guard_msgs in
|
||
variable [n]
|
||
variable (x)
|
||
/--
|
||
error: cannot update binder annotation of variable 'x' to instance implicit:
|
||
variable was originally declared without an explicit type
|
||
-/
|
||
#guard_msgs in
|
||
variable [x]
|
||
end Ex7
|
||
|
||
/-! Test updating to and from strict implicit annotations. -/
|
||
|
||
namespace Ex8
|
||
|
||
variable {α : Type} (β γ : Type)
|
||
variable ⦃α⦄
|
||
def f (a : α) (_ : β) := a
|
||
/-- info: Ex8.f ⦃α : Type⦄ (β : Type) (a : α) : β → α -/
|
||
#guard_msgs in
|
||
#check f
|
||
variable (α) ⦃β γ⦄
|
||
def g (a : α) (b : β) (c : γ) := (a, b, c)
|
||
/-- info: Ex8.g (α : Type) ⦃β γ : Type⦄ (a : α) (b : β) (c : γ) : α × β × γ -/
|
||
#guard_msgs in
|
||
#check g
|
||
variable {β}
|
||
def h (b : β) := b
|
||
/-- info: Ex8.h {β : Type} (b : β) : β -/
|
||
#guard_msgs in
|
||
#check h
|
||
variable {{β}}
|
||
/-- error: redundant binder annotation update -/
|
||
#guard_msgs in
|
||
variable ⦃β⦄
|
||
end Ex8
|