Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Coq中的参数化HOA-是否可以在类型声明体中重复类型名称?_Coq - Fatal编程技术网

Coq中的参数化HOA-是否可以在类型声明体中重复类型名称?

Coq中的参数化HOA-是否可以在类型声明体中重复类型名称?,coq,Coq,我正在阅读并试图理解有关参数化HOA(高阶抽象语法)的Coq代码: 我对此有几个问题: 如何在构造函数的主体中重复类型名Closed?这是某种递归声明(没有结束条件的开始?)?或者,归纳的定义有两种风格:1)通常的类型定义;2) 关于类型的某种陈述?这段代码是关于类型的语句,而不是定义 这种类型的含义是什么?通常我可以想象,参数化HOA是关于增强初始类型的。所以,我希望,Closed是一种增强型,我可以定义常量John:Closed。但实际上它是从Exp t->Prop派生出来的,因此,在我看

我正在阅读并试图理解有关参数化HOA(高阶抽象语法)的Coq代码:

我对此有几个问题:

  • 如何在构造函数的主体中重复类型名
    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.