如何定义与函数相互递归的归纳类型?

时间:2020-04-27 14:02:53

标签: coq induction mutual-recursion

我想定义一个归纳类型Foo,构造函数接受一些属性作为参数。我希望这些属性取决于我当前定义的类型的归纳参数。我希望能够使用某些bar类型的递归函数Foo从这些属性中收集它们的一些数据。但是,我不知道一种声明这两个方法的方式,以便Coq接受它们的定义。我希望能够编写如下内容:

Inductive Foo : Set (* or Type *) :=
| Foo1 : forall f : Foo, bar f = 1 -> Foo
| Foo2 : forall f : Foo,  bar f = 2 -> Foo
| Foon : nat -> Foo
with bar (f : Foo) : nat := 
  match f with
  | Foo1 _ _ => 1
  | Foo2 _ _ => 2
  | Foon n => S n
  end.

通常,with是处理相互递归的方法,但是,我所见过的所有将两个定义同时使用的示例都以Inductive或同时以Fixpoint开头。这样的相互递归甚至有可能吗?

1 个答案:

答案 0 :(得分:3)

这种定义被称为“归纳递归”。不幸的是,Coq不支持该功能,但如果我没有记错的话,Agda定理证明器也支持该功能。