我们可以在Coq中定义递归定义吗?

我们可以在Coq中定义递归定义吗?,coq,theorem-proving,coqide,Coq,Theorem Proving,Coqide,我知道Coq允许定义相互递归的归纳类型。但是有没有办法用Coq编写递归定义呢 例如,我想写一个定义如下: 定义myDefinition A:=对于所有B C,myDefinition B\/A=C 上述定义中的重要部分是myDefinition B,它递归地对另一个参数调用相同的定义。是否可以在Coq中执行此操作?您可以使用固定点而不是定义。如果你想更多地了解他们,我鼓励你看一下 Fixpoint myDefinition A := forall B C, (myDefinition B)

我知道Coq允许定义相互递归的归纳类型。但是有没有办法用Coq编写递归定义呢

例如,我想写一个定义如下:

定义myDefinition A:=对于所有B C,myDefinition B\/A=C

上述定义中的重要部分是myDefinition B,它递归地对另一个参数调用相同的定义。是否可以在Coq中执行此操作?

您可以使用固定点而不是定义。如果你想更多地了解他们,我鼓励你看一下

Fixpoint myDefinition A := 
  forall B C, (myDefinition B) \/ (A = C).
请注意,类似上述内容不会被接受为Coq终止,因此也不会被接受为有效的定义。再一次,作者应该解释你能做什么和不能做什么

编辑

如果您的定义应该是一个类型,那么您也可以将其定义为归纳类型

Inductive myDefinition (A : Prop) : Prop :=
| myDef : forall B C, (myDefinition B) \/ (A = C) -> myDefinition A.
这里我们说,要建立myDefinition a的证明,就足以证明所有B C,myDefinition B\/a=C。这就是您想要的。 然而,您可能很难证明这一点,但您的具体情况可能有所不同。

您可以使用固定点而不是定义。如果你想更多地了解他们,我鼓励你看一下

Fixpoint myDefinition A := 
  forall B C, (myDefinition B) \/ (A = C).
请注意,类似上述内容不会被接受为Coq终止,因此也不会被接受为有效的定义。再一次,作者应该解释你能做什么和不能做什么

编辑

如果您的定义应该是一个类型,那么您也可以将其定义为归纳类型

Inductive myDefinition (A : Prop) : Prop :=
| myDef : forall B C, (myDefinition B) \/ (A = C) -> myDefinition A.
这里我们说,要建立myDefinition a的证明,就足以证明所有B C,myDefinition B\/a=C。这就是您想要的。
然而,您可能很难证明这一点,但您的具体情况可能有所不同。

您是否希望a是一段类似于数字或字符串的数据,如果是这样,则递归严格受数据类型归纳结构的限制。您是否希望a是一段类似于数字或字符串的数据,如果是这样的话,那么递归就受到数据类型归纳结构的严格限制。我认为一种方法是将定义一分为二,继续使用相互依赖的归纳类型。我在回答中添加了另一种使用归纳类型的方法。在我的用例中,定义取决于它本身。我认为一种方法是将定义一分为二,继续使用相互依赖的归纳类型。我在我的答案中添加了另一种使用归纳类型的方法。