Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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
什么';s与'of'和'amp;'在Coq归纳定义中?_Coq - Fatal编程技术网

什么';s与'of'和'amp;'在Coq归纳定义中?

什么';s与'of'和'amp;'在Coq归纳定义中?,coq,Coq,我刚刚看到有人用一种不熟悉的语法在Coq中定义了归纳类型,如下所示: Inductive nat_tree : Type := | NatLeaf | NatNode of color & nat_tree & nat & nat_tree. 我使用的语法如下所示: 有人能解释一下新的语法吗 顺便说一句,这是一个SSreflect教程。我想知道这是否是ssr的添加 是的,你是对的:这个语法是由Ssreflect定义的。它们都被定义为声明匿名参数的语法糖:of T和&Tm

我刚刚看到有人用一种不熟悉的语法在Coq中定义了归纳类型,如下所示:

Inductive nat_tree : Type :=
| NatLeaf
| NatNode of color & nat_tree & nat & nat_tree.
我使用的语法如下所示:

有人能解释一下新的语法吗


顺便说一句,这是一个SSreflect教程。我想知道这是否是ssr的添加

是的,你是对的:这个语法是由Ssreflect定义的。它们都被定义为声明匿名参数的语法糖:
of T
&T
mean
(u:T)
;也就是说,类型为
T
的未命名参数。因此,
nat_树
的定义等同于下面的定义

Inductive nat_tree :=
| NatLeaf
| NatNode (_ : color) (_ : nat_tree) (_ : nat) (_ : nat_tree).
您还可以为每个参数指定名称:

Inductive nat_tree :=
| NatLeaf
| NatNode (c : color) (t1 : nat_tree) (n : nat) (t2 : nat_tree).
正如gallais所指出的,这使得Coq中的数据类型声明的语法更类似于OCaml。注意,上面的声明没有给出每个构造函数的返回类型。在标准Coq中,如果所有参数都使用此语法给出,并且定义的类型是统一的,那么指定返回类型是可选的。这意味着我们可以将
列表
类型定义为

Inductive list (T : Type) :=
| nil
| cons (t : T) (l : list T).
但是需要定义长度索引列表的类型,如下所示(因为
nat
索引):


我的猜测是,之所以使用它,是因为它很好地模仿了OCaml变体类型的语法。我从没见过它。不知怎么的,在什么地方有记录吗?我试着去理解PnP,这里的符号只是在一个地方向你们抛出0解释,然后用于练习。在链接到那里的文档中搜索什么也没有得到。
Inductive list (T : Type) :=
| nil
| cons (t : T) (l : list T).
Inductive vector (T : Type) : nat -> Type :=
| vnil : vector T O
| vcons (n : nat) (t : T) (v : vector T n) : vector T (S n).