当我使用Record宏创建记录类型时,它显示为Set排序而不是Type排序。
我创建了一个显示相同行为的最小测试示例:
Record little_test : Type :=
{
bit1 : nat;
bit2 : nat;
}.
Check little_test.
little_test
: Set
答案 0 :(得分:4)
Set
只是Type
的无限层次结构中的最低级别。因为Coq的宇宙是累积的,所以这意味着little_test
也居住在每个更高的层次上。通常,您不希望将类型限制为仅处于较高级别,因此Coq只是将Universe级别最小化。如果您确实希望little_test
处于更高的级别,则可以明确要求它。
如果使用的是CoqIDE,请在“视图”菜单中设置“显示Universe级别”,而不要设置Set Printing Universes.
。其他IDE(通用证明等)也可能有自己的方式来显示Universe级别。
Set Printing Universes.
Record little_test@{i} : Type@{i} :=
{
bit1 : nat;
bit2 : nat;
}.
Check little_test.
此方法声明了固定的Universe级别(little_set.i
),并迫使little_set居住在Type@{little_test.i}
中。如果您已经有其他地方的Universe级别,则可以省略该Universe级别的声明。
Set Printing Universes.
Record little_test1@{i} : Type@{i} :=
{
bit1 : nat;
bit2 : nat;
}.
Record little_test2 : Type@{little_test1.i} :=
{
bit3 : nat;
bit4 : nat;
}.
Check little_test1.
Check little_test2.
在这种方法中,little_test1
和little_test2
的最低级别相同(但请记住,宇宙累积性意味着它们都居住在每个更高的级别)。
最后一种方法声明了无限多个little_test
-每个宇宙级别一个。
Set Printing Universes.
Unset Universe Minimization ToSet.
Polymorphic Record little_test@{i} : Type@{i} :=
{
bit1 : nat;
bit2 : nat;
}.
Check little_test.
不过,默认情况下,当您使用不带Universe参数的little_test
时,Coq会最小化Universe级别(如果不存在约束,则为Set
),因此我们必须Unset Universe Minimization ToSet
进行更改这种行为。如果您希望所有Record
和Inductive
类型都是这种多态的,则可以Set Universe Polymorphism
。请注意,您仍然必须使用@{i}
(或Universe级的其他名称)来指示多态性在哪里。