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

时间:2018-12-22 01:49:52

标签: coq

在Coq的归纳类型中,没有with的{​​{1}}关键字有什么作用,例如:

match

我尝试检查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. 的类型,似乎它不是类型块或其他什么东西...那么在另一种归纳类型而不是其内部定义它的意义何在?至少检查Statement的类型后,Set的设置与Block相同...

1 个答案:

答案 0 :(得分:3)

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

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.

在这里,您不能首先定义even,因为它需要定义odd。您不能先定义odd,因为它需要even。您需要能够同时定义两个 -并使用with关键字来实现。

您的示例与之类似,但定义了归纳数据类型而不是递归函数-Statement在定义中使用Block,而Block使用Statement。因此,with可以同时定义它们。

请注意,该withwith表达式中的match完全不同。实际上,它们属于两种不同的语言:前一种是Vernacular的一部分,而后者是Gallina的一部分。