我正在阅读Coq http://www.cs.cmu.edu/~iliano/projects/metaCLF2/inc/dl/papers/lsfa17.pdf和https://github.com/brunofx86/LL中线性逻辑的机械化,我无法理解来自https://github.com/brunofx86/LL/blob/master/FOLL/LL/SyntaxLL.v的归纳类型term
的类型构造函数:< / p>
Inductive term :=
|var (t: T) (* variables *)
|cte (e:A) (* constants from the domain DT.A *)
|fc1 (n:nat) (t: term) (* family of functions of 1 argument *)
|fc2 (n:nat) (t1 t2: term). (* family of functions of 2 argument *)
我对此示例有两个问题(我正在阅读本文中的https://softwarefoundations.cis.upenn.edu/lf-current/Basics.html):
term
的(超级)类型是什么?软件基础始终指定新类型的(超级)类型,如Inductive color : Type
; var (t: T)
?。 Software Foundation在其第一章中仅提供了两种类型的构造函数:常量white : color
和函数primary : rgb → color
。但var (t: T)
是一种非常奇怪的符号 - 它不是有效的函数类型定义,因为它没有显式的返回类型,也没有箭头。 答案 0 :(得分:7)
关于您的主要问题,定义构造函数时的语法var (t : T)
只是var : forall t : T, term
的一些替代(更短)语法,也可以写成var : T -> term
(因为有t
)中没有出现变量term
。
实际上,您可以通过处理定义,然后执行以下命令来检查:
Print term.
(* and Coq displays the inductive type with the default syntax, that is:
Inductive term : Type :=
var : T -> term
| cte : A -> term
| fc1 : nat -> term -> term
| fc2 : nat -> term -> term -> term
*)
接下来(如上面的Coq输出所示),数据类型term
的类型确实是Type
。
我记得在Coq中,所有类型都有一个类型,后者总是Prop
,Set
或Type
。 “类型类型”通常称为排序。 (排序Prop
处理逻辑命题,而排序Set
和Type
处理所谓的“信息”类型。)
最后,可以注意到Type
不是指固定类型,而是指给定Type_i
,其中索引i >=0
由Coq内核自动确定和检查。有关此主题的更多信息,请参阅Universes chapter of CPDT