为什么我的类型记录排序显示为集合排序?

时间:2019-04-24 18:14:56

标签: coq

当我使用Record宏创建记录类型时,它显示为Set排序而不是Type排序。

我创建了一个显示相同行为的最小测试示例:

Record little_test : Type :=
  {
    bit1 : nat;
    bit2 : nat;
  }.

Check little_test.
little_test
     : Set

1 个答案:

答案 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_test1little_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进行更改这种行为。如果您希望所有RecordInductive类型都是这种多态的,则可以Set Universe Polymorphism。请注意,您仍然必须使用@{i}(或Universe级的其他名称)来指示多态性在哪里。