(* suff s s'  means  s is a suffix of s' *)
Inductive suff (s : infseq T) : infseq T -> Prop :=
  | sp_eq : suff s s
  | sp_next : forall x s0, suff s s0 -> suff s (Cons x s0).(* suff s s'  means  s is a suffix of s' *)
Inductive suff (s : infseq T) : infseq T -> Prop :=
  | sp_eq : suff s s
  | sp_next : forall x s0, suff s s0 -> suff s (Cons x s0).(* suff s s'  means  s is a suffix of s' *)
Inductive suff (s : infseq T) : infseq T -> Prop :=
  | sp_eq : suff s s
  | sp_next : forall x s0, suff s s0 -> suff s (Cons x s0).(* simple but not the most useful -- useless indeed *)
CoInductive subseq : infseq T -> infseq T -> Prop :=
  | Subseq : forall s s0 s1,
             suff s1 s0 -> subseq s (tl s1) -> subseq (Cons (hd s1) s) s0.(* simple but not the most useful -- useless indeed *)
CoInductive subseq : infseq T -> infseq T -> Prop :=
  | Subseq : forall s s0 s1,
             suff s1 s0 -> subseq s (tl s1) -> subseq (Cons (hd s1) s) s0.CoInductive subseqs' : infseq (infseq T) -> infseq T -> Prop :=
  | Subseqs' : forall si s0 s1,
             suff s1 s0 -> subseqs' si (tl s1) -> subseqs' (Cons s1 si) s0.CoInductive subseqs' : infseq (infseq T) -> infseq T -> Prop :=
  | Subseqs' : forall si s0 s1,
             suff s1 s0 -> subseqs' si (tl s1) -> subseqs' (Cons s1 si) s0.CoInductive subseqs : infseq (infseq T) -> infseq T -> Prop :=
  | Subseqs : forall si s,
             suff (hd si) s -> subseqs (tl si) (tl (hd si)) -> subseqs si s.CoInductive subseqs : infseq (infseq T) -> infseq T -> Prop :=
  | Subseqs : forall si s,
             suff (hd si) s -> subseqs (tl si) (tl (hd si)) -> subseqs si s.

(* Specifications: *)
Lemma subseqs_subseqs' : forall si s, subseqs si s -> subseqs' si s.
Lemma subseqs'_subseqs : forall si s, subseqs' si s -> subseqs si s.
Lemma subseqs_eventually : forall P si s, subseqs si s -> always1 P si -> eventually P s.
Lemma subseqs_tl : forall si s, subseqs si (tl s) -> subseqs si s.
Theorem subseq_inf_often : forall P si s, subseqs si s -> always1 P si -> inf_often P s.