In the standard library, we should use explicit universe variables for universe polymorphic definitions. Users that want to declare universe polymorphic definitions but do not want to provide universe level parameters should use Type _ or Type*
41 lines
894 B
Text
41 lines
894 B
Text
open nat
|
||
namespace foo
|
||
section
|
||
parameter (X : Type)
|
||
definition A {n : ℕ} : Type := X
|
||
definition B : Type := X
|
||
variable {n : ℕ}
|
||
check @A n
|
||
check foo.A nat
|
||
check foo.A (X × B)
|
||
check @foo.A (X × B) 10
|
||
check @foo.A (@foo.B (@A n)) n
|
||
check @foo.A (@foo.B (@foo.A X n)) n
|
||
check @foo.A (@foo.B (@foo.A nat n)) n
|
||
|
||
set_option pp.full_names true
|
||
check A
|
||
check foo.A nat
|
||
check @foo.A (X × B) 10
|
||
check @foo.A (@foo.B (@foo.A X n)) n
|
||
check @foo.A (@foo.B (@foo.A nat n)) n
|
||
|
||
set_option pp.full_names false
|
||
|
||
set_option pp.implicit true
|
||
check @A n
|
||
check @foo.A nat 10
|
||
check @foo.A X n
|
||
set_option pp.full_names true
|
||
check @foo.A X n
|
||
check @A n
|
||
|
||
set_option pp.full_names false
|
||
check @foo.A X n
|
||
check @foo.A B n
|
||
check @foo.A (@foo.B (@A n)) n
|
||
check @foo.A (@foo.B (@foo.A X n)) n
|
||
check @foo.A (@foo.B (@foo.A nat n)) n
|
||
check @A n
|
||
end
|
||
end foo
|