在Coq的归纳类型中,不带“match”的“with”关键字做什么?
带有关键字但不带有匹配项的在Coq中的归纳类型中起什么作用?例如:在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
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
在匹配
表达式中的关键字完全不同。事实上,它们属于两种不同的语言:前者是的一部分,而后者是的一部分