如何定义与函数相互递归的归纳类型?
How to define an inductive type mutually recursive with a function?
我想定义一个归纳类型 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
开头。这样的相互递归是否可能?
这种类型的定义称为 "inductive-recursive"。不幸的是,它在 Coq 中不受支持,但如果我没记错的话,它在 Agda 定理证明器中受支持。
我想定义一个归纳类型 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
开头。这样的相互递归是否可能?
这种类型的定义称为 "inductive-recursive"。不幸的是,它在 Coq 中不受支持,但如果我没记错的话,它在 Agda 定理证明器中受支持。