Notation Stream := (Stream A).(** Streams *)

CoInductive Stream (A : Type) :=
  Cons : A -> Stream A -> Stream A.Definition hd (x:Stream) := match x with
                            | Cons a _ => a
                            end.Definition tl (x:Stream) := match x with
                            | Cons _ s => s
                            end.Fixpoint Str_nth_tl (n:nat) (s:Stream) : Stream :=
  match n with
  | O => s
  | S m => Str_nth_tl m (tl s)
  end.Definition Str_nth (n:nat) (s:Stream) : A := hd (Str_nth_tl n s).

Lemma unfold_Stream : forall x:Stream, x = match x with | Cons a s => Cons a s end.