Coq中的参数化HOA-是否可以在类型声明体中重复类型名称?
我正在阅读并试图理解有关参数化HOA(高阶抽象语法)的Coq代码: 我对此有几个问题:Coq中的参数化HOA-是否可以在类型声明体中重复类型名称?,coq,Coq,我正在阅读并试图理解有关参数化HOA(高阶抽象语法)的Coq代码: 我对此有几个问题: 如何在构造函数的主体中重复类型名Closed?这是某种递归声明(没有结束条件的开始?)?或者,归纳的定义有两种风格:1)通常的类型定义;2) 关于类型的某种陈述?这段代码是关于类型的语句,而不是定义 这种类型的含义是什么?通常我可以想象,参数化HOA是关于增强初始类型的。所以,我希望,Closed是一种增强型,我可以定义常量John:Closed。但实际上它是从Exp t->Prop派生出来的,因此,在我看
- 如何在构造函数的主体中重复类型名
?这是某种递归声明(没有结束条件的开始?)?或者,Closed
定义有两种风格:1)通常的类型定义;2) 关于类型的某种陈述?这段代码是关于类型的语句,而不是定义归纳的
- 这种类型的含义是什么?通常我可以想象,参数化HOA是关于增强初始类型的。所以,我希望,
是一种增强型,我可以定义常量Closed
。但实际上它是从John:Closed
派生出来的,因此,在我看来,这不是初始类型的增强,而是关于初始类型表达式的语句(谓词)。这个谓词的结构反映了初始类型术语的结构,这就是为什么它可以用于结构归纳Exp t->Prop
我也在阅读“简单注释归纳类型”一章,但我不明白如何在构造函数中使用类型名称。重复类型名称在Coq中是完全正确的;这只是定义一个递归数据类型。考虑标准库中自然数的定义:
Inductive nat : Type :=
| O : nat
| S : nat -> nat.
这表示nat
类型由两个构造函数O
和S
生成。S
类型中的递归出现意味着我们可以使用先前构建的自然数来构建其他自然数;e、 g
Definition zero : nat := O.
Definition one : nat := S zero.
Definition two : nat := S one.
等等。你给出的例子,Closed
,有点不同,因为它定义了命题的归纳族,而不是自然数或列表之类的典型数据类型。对于任何t
,此族都通过类型Exp t
的术语进行索引。除了这些差异之外,递归事件的行为与nat
的情况几乎相同。例如,CPlus
构造函数说,为了显示Closed(加上E1 E2)
保持,我们需要显示Closed E1
和Closed E2
保持
我不明白你所说的“增强类型”或“初始类型”是什么意思,但据我所知,Closed E
是一个命题,表明表达式E:Exp t
没有自由变量
Definition zero : nat := O.
Definition one : nat := S zero.
Definition two : nat := S one.