如何理解Coq类型构造函数var(t:T)

时间:2018-04-08 14:11:07

标签: functional-programming logic coq

我正在阅读Coq http://www.cs.cmu.edu/~iliano/projects/metaCLF2/inc/dl/papers/lsfa17.pdfhttps://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)是一种非常奇怪的符号 - 它不是有效的函数类型定义,因为它没有显式的返回类型,也没有箭头。

1 个答案:

答案 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中,所有类型都有一个类型,后者总是PropSetType。 “类型类型”通常称为排序。 (排序Prop处理逻辑命题,而排序SetType处理所谓的“信息”类型。)

最后,可以注意到Type不是指固定类型,而是指给定Type_i,其中索引i >=0由Coq内核自动确定和检查。有关此主题的更多信息,请参阅Universes chapter of CPDT

的第一部分