我可以证明 "coinductive principles" 关于余归类型吗?
Can I prove "coinductive principles" about coinductive type?
我可以证明关于余归类型的“余归原理”吗?例如,流类型的余归原理的伪代码如下所示:
Π 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) |}.
我可以证明关于余归类型的“余归原理”吗?例如,流类型的余归原理的伪代码如下所示:
Π 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) |}.