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

标签 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固定点。这样的相互递归甚至可能吗?

最佳答案

这种类型的定义被称为“归纳递归”。不幸的是,它在 Coq 中不受支持,但如果我没记错的话,它在 Agda 定理证明器中受支持。

关于coq - 如何定义与函数相互递归的归纳类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61460677/

相关文章:

python - 棋盘覆盖递归算法背后的直觉是什么?如何更好地制定这种算法?

coq - 在归纳中使用记住而不是命题会在 Coq 中给出 'ill-typed' 错误

Coq 项目 1.2.10 类型转换

coq - ssreflect 是否假定排中间?

coq - Coq 中的矛盾证明

sml - 在标准 ML 中声明相互依赖的值和函数

C++ 相互模板依赖?

ocaml - 在 OCaml 中实现 Coq 策略

algorithm - 证明/反驳 Big O 和 Big Theta

javascript - 堆栈安全的相互递归,不会在调用端泄露实现细节