Section sec_subseq.
Variable T: Type.
(* 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.
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.
Proof using.
cofix subsub.
intros si s su. case su; clear su si s.
intros (s1, si) s0. simpl. intros su sb. constructor.
- assumption.
- apply subsub. assumption.
Qed.
cofix subsub.
intros si s su. case su; clear su si s.
intros si s0 s1 su sb. constructor; simpl.
- assumption.
- apply subsub. assumption.
Qed.
(* Relating inf subseq to infinitely often *)

(* In the next lemma, always1 is bit overkill, but is just what is needed below *)
Lemma subseqs_eventually :
forall P si s, subseqs si s -> always1 P si -> eventually P s.