Search code examples
coqagdadependent-typetype-theorycoinduction

Can I prove "coinductive principles" about coinductive type?


Can I prove "coinductive principles" about coinductive type? For example, the pseudo code of the coinductive principle for the stream type would look like this:

Π 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)

My feeling is that this is correct, but I can't think of a way to prove it in Coq or Agda.


Solution

  • How did you obtain this type? While co-recursion (the non-dependent version of the co-induction principle you are trying to express) can be stated and proven using co-fixpoints (see below), a co-inductive counterpart of the usual induction principle cannot be even stated, because you would need a form of "co-dependent type" for your predicate. Some more infos are on nLab.

    Here is co-recursion for (negative) streams in 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) |}.