类型:输入Coq

类型:输入Coq,coq,Coq,我偶然发现,在Coq中可以做出以下定义: Definition x := Type : Type. Type:Type是什么意思?这种定义有哪些用例?这个答案有两个部分 定义x:=y:A是什么意思? 这意味着x被定义为y,并且有一个断言认为y属于A类型。通常,这种断言是多余的,因为Coq能够自行确定y的类型。但是,有时一个术语有太多的隐式部分,因此需要断言来确定所有这些隐式部分 Type:Type是什么意思? 具有隐式部分的示例是类型。Coq中没有一个类型,这可能会让您感到惊讶。相反,有一个无

我偶然发现,在Coq中可以做出以下定义:

Definition x := Type : Type.

Type:Type
是什么意思?这种定义有哪些用例?

这个答案有两个部分

定义x:=y:A
是什么意思? 这意味着
x
被定义为
y
,并且有一个断言认为
y
属于
A
类型。通常,这种断言是多余的,因为Coq能够自行确定
y
的类型。但是,有时一个术语有太多的隐式部分,因此需要断言来确定所有这些隐式部分

Type:Type
是什么意思? 具有隐式部分的示例是
类型
。Coq中没有一个
类型
,这可能会让您感到惊讶。相反,有一个无限的类型层次结构,
Type{0}
Type{1}
Type{2}
…带有
Type{i}:Type{j}
if
i
。这意味着每一个宇宙(
Type@{j}
)都包含每一个以较小级别作为元素的宇宙

然而,默认情况下,Coq不会显式显示这些“宇宙级别”。Coq通常足够聪明,它可以计算出宇宙的级别(或使其通用),而根本不会打扰你。您可以告诉Coq使用本地命令
Set Printing universe.
或通过在IDE菜单中设置选项(如果您正在使用该选项)来显示它们。然后,在像您那样定义
x
之后,使用命令
Print x.
将显示

x = 
Type@{Top.2}
     : Type@{Top.1}
(* {Top.2 Top.1} |= Top.2 < Top.1
                     *)
x=
键入@{Top.2}
:键入@{Top.1}
(*{Top.2 Top.1}|=Top.2
因此
x
被定义为
Type@{Top.2}
,并具有Type
Type@{Top.1}
Top.1
Top.2
只是通用宇宙级别的名称。底部的消息部分只是说明
Top.2
必须小于
Top.1
。这是因为我们需要
Type@{Top.2}
来获得类型
Type@{Top.1}
。记住,宇宙包含它们下面的宇宙,但不包含它们上面的宇宙

附带问题:为什么有多个级别的
类型
? 简言之,如果我们只有一个
类型
类型:类型
,就有可能表明系统不一致。这被称为吉拉德悖论(或更简单的变体,称为赫斯肯斯悖论)。请参阅以了解一些好的细节


如果你想了解Coq宇宙的另一种解释,请参阅。

那么这个定义是否等同于
定义x:Type=Type.
?我已经对宇宙有了一些了解,但我认为我的主要困惑是因为
:Type
在末尾。我原以为这是
类型
类型的一些特殊语法,但现在我尝试了其他常规类型,似乎“冒号类型”部分可以放在
:=
的末尾或前面,例如
定义x:=1:nat。定义y:nat:=1。
@yewang可能存在一些边缘情况,两者不同(我不知道Coq unifier的技术细节)。但是,是的,总的来说,两者应该是相同的。