coq - 我可以证明 "coinductive principles"关于共感类型吗?

标签 coq agda dependent-type type-theory coinduction

我可以证明关于共归纳类型的“共归纳原理”吗?例如,流类型的共归纳原理的伪代码如下所示:

Π P : Stream A -> Type.
Π destruct_head : Π x : Stream A. P x -> Σ y : A. Path A (head x) y.
Π destruct_tail : Π x : Stream A. P x -> P (tail x).
(Σ y : Stream A. P y)

我的感觉是这是正确的,但我想不出在 Coq 或 Agda 中证明它的方法。

最佳答案

你是如何获得这个类型的?虽然可以使用共不动点(见下文)来陈述和证明共递归(您试图表达的共归纳原理的非依赖版本),但甚至无法陈述通常归纳原理的共归纳对应物,因为您的谓词需要一种“相互依赖类型”的形式。更多信息请参见 nLab .

这是 Coq 中(负)流的共同递归:

CoInductive Stream (A : Type) : Type := { hd : A ; tl : Stream A }.

Definition scoind' (A X : Type) (hdX : X -> A) (tlX : X -> X) :
  X -> Stream A :=

  cofix sc x : Stream A :=
    {| hd := hdX x ; tl := sc (tlX x) |}.

关于coq - 我可以证明 "coinductive principles"关于共感类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68933352/

相关文章:

ocaml - 从 OCaml 检查感应类型的元素

equality - refl 在 agda : explaining congruence property

agda - Agda 的平等测试分支? (基本的)

coq - 依赖类型 : Vector of vectors

dependent-type - 在 Idris 中,如何从 So 类型中提取证明?

haskell - 依赖类型的 ghc-7.6 类实例

coq - 为什么策略 'exact' 对于 Coq 证明是完整的?

haskell - 使用依赖类型语言进行编程时,我们如何克服编译时间和运行时差距?

coq - 复杂函数的等式

types - 如何避免(不必要的?)在 Agda 中重复使用公理?