在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相同...
答案 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
可以同时定义它们。
请注意,该with
与with
表达式中的match
完全不同。实际上,它们属于两种不同的语言:前一种是Vernacular的一部分,而后者是Gallina的一部分。