我想定义一个归纳类型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
开头。这样的相互递归甚至有可能吗?
答案 0 :(得分:3)
这种定义被称为“归纳递归”。不幸的是,Coq不支持该功能,但如果我没有记错的话,Agda定理证明器也支持该功能。