(* All useful predicates are extensional in the following sense *)
Definition extensional (P: infseq T -> Prop) :=
  forall s1 s2, exteq s1 s2 -> P s1 -> P s2.

(* Specifications: *)
Lemma extensional_True_tl : extensional True_tl.
Lemma extensional_False_tl : extensional False_tl.
Lemma extensional_and_tl : forall (P Q: infseq T -> Prop), extensional P -> extensional Q -> extensional (P /\_ Q).
Lemma extensional_or_tl : forall (P Q: infseq T -> Prop), extensional P -> extensional Q -> extensional (P \/_ Q).
Lemma extensional_impl_tl : forall (P Q: infseq T -> Prop), extensional P -> extensional Q -> extensional (P ->_ Q).
Lemma extensional_not_tl : forall (P: infseq T -> Prop), extensional P -> extensional (~_ P).
Lemma extensional_now : forall (P: T -> Prop), extensional (now P).
Lemma extensional_next : forall (P: infseq T -> Prop), extensional P -> extensional (next P).
Lemma extensional_consecutive : forall (P: T -> T -> Prop), extensional (consecutive P).
Lemma extensional_always : forall (P: infseq T -> Prop), extensional P -> extensional (always P).
Lemma extensional_weak_until : forall (P Q: infseq T -> Prop), extensional P -> extensional Q -> extensional (weak_until P Q).
Lemma extensional_until : forall (P Q: infseq T -> Prop), extensional P -> extensional Q -> extensional (until P Q).
Lemma extensional_release : forall (P Q: infseq T -> Prop), extensional P -> extensional Q -> extensional (release P Q).
Lemma extensional_eventually : forall (P: infseq T -> Prop), extensional P -> extensional (eventually P).
Lemma extensional_inf_often : forall (P: infseq T -> Prop), extensional P -> extensional (inf_often P).
Lemma extensional_continuously : forall (P: infseq T -> Prop), extensional P -> extensional (continuously P).