在Coq的归纳类型中,不带“match”的“with”关键字做什么?

在Coq的归纳类型中,不带“match”的“with”关键字做什么?,coq,Coq,带有关键字但不带有匹配项的在Coq中的归纳类型中起什么作用?例如: Inductive Block : Type := | EmptyBlk : Block | Blk : Statement -> Block with Statement : Type := | Assignment : string -> AExp -> Statement | Seq : Statement -> Statement -> Statement | IfEls

带有关键字但不带有匹配项的在Coq中的归纳类型中起什么作用?例如:

Inductive Block : Type :=
  | EmptyBlk : Block
  | Blk : Statement -> Block
with Statement : Type :=
  | Assignment : string -> AExp -> Statement
  | Seq : Statement -> Statement -> Statement
  | IfElse : BExp -> Block -> Block -> Statement
  | While : BExp -> Block -> Statement.

我试着检查
语句的类型,它似乎不是block类型或其他类型……那么,在另一个归纳类型中定义它,而不是它本身,有什么意义呢。至少检查语句的类型会得到与块相同的集合…

它用于指定相互递归的定义。例如,考虑以下两个函数:

Fixpoint even (n : nat) : bool :=
  match n with
  | O => true
  | S n => odd n
  end
with odd (n : nat) : bool :=
  match n with
  | O => false
  | S n => even n
  end.
在这里,您不能首先定义
偶数
,因为它需要定义
奇数
。您也不能先定义
奇数
,因为它需要
偶数
。您需要能够同时定义这两个属性-您可以通过使用
with
关键字来实现这一点

您的示例类似,但定义了归纳数据类型而不是递归函数-
语句在其定义中使用
,而
使用
语句
。因此,
使用
同时定义它们


请注意,此
with
with
匹配
表达式中的关键字完全不同。事实上,它们属于两种不同的语言:前者是的一部分,而后者是的一部分。

它用于指定相互递归的定义。例如,考虑以下两个函数:

Fixpoint even (n : nat) : bool :=
  match n with
  | O => true
  | S n => odd n
  end
with odd (n : nat) : bool :=
  match n with
  | O => false
  | S n => even n
  end.
在这里,您不能首先定义
偶数
,因为它需要定义
奇数
。您也不能先定义
奇数
,因为它需要
偶数
。您需要能够同时定义这两个属性-您可以通过使用
with
关键字来实现这一点

您的示例类似,但定义了归纳数据类型而不是递归函数-
语句在其定义中使用
,而
使用
语句
。因此,
使用
同时定义它们

请注意,此
with
with
匹配
表达式中的关键字完全不同。事实上,它们属于两种不同的语言:前者是的一部分,而后者是的一部分