类型:输入Coq
我偶然发现,在Coq中可以做出以下定义:类型:输入Coq,coq,Coq,我偶然发现,在Coq中可以做出以下定义: Definition x := Type : Type. Type:Type是什么意思?这种定义有哪些用例?这个答案有两个部分 定义x:=y:A是什么意思? 这意味着x被定义为y,并且有一个断言认为y属于A类型。通常,这种断言是多余的,因为Coq能够自行确定y的类型。但是,有时一个术语有太多的隐式部分,因此需要断言来确定所有这些隐式部分 Type:Type是什么意思? 具有隐式部分的示例是类型。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}
ifi
。这意味着每一个宇宙(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}
,并具有TypeType@{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的技术细节)。但是,是的,总的来说,两者应该是相同的。