CoFixpoint zip (sA: infseq A) (sB: infseq B) : infseq (A*B) := 
  match sA, sB with
    | Cons a sA0, Cons b sB0 => Cons (a, b) (zip sA0 sB0)
  end.

(* Specifications: *)
Lemma zip_Cons: forall (a:A) (b:B) sA sB, zip (Cons a sA) (Cons b sB) = Cons (a, b) (zip sA sB).
Lemma and_tl_map : forall (f: A->B) (P P': infseq A->Prop) (Q Q': infseq B->Prop), (forall s, P s -> Q (map f s)) -> (forall s, P' s -> Q' (map f s)) -> forall (s: infseq A), (P /\_ P') s -> (Q /\_ Q') (map f s).
Lemma and_tl_map_conv : forall (f: A->B) (P P': infseq A->Prop) (Q Q': infseq B->Prop), (forall s, Q (map f s) -> P s) -> (forall s, Q' (map f s) -> P' s) -> forall (s: infseq A), (Q /\_ Q') (map f s) -> (P /\_ P') s.
Lemma or_tl_map : forall (f: A->B) (P P': infseq A->Prop) (Q Q': infseq B->Prop), (forall s, P s -> Q (map f s)) -> (forall s, P' s -> Q' (map f s)) -> forall (s: infseq A), (P \/_ P') s -> (Q \/_ Q') (map f s).
Lemma or_tl_map_conv : forall (f: A->B) (P P': infseq A->Prop) (Q Q': infseq B->Prop), (forall s, Q (map f s) -> P s) -> (forall s, Q' (map f s) -> P' s) -> forall (s: infseq A), (Q \/_ Q') (map f s) -> (P \/_ P') s.
Lemma impl_tl_map : forall (f: A->B) (P P': infseq A->Prop) (Q Q': infseq B->Prop), (forall s, Q (map f s) -> P s) -> (forall s, P' s -> Q' (map f s)) -> forall (s: infseq A), (P ->_ P') s -> (Q ->_ Q') (map f s).
Lemma impl_tl_map_conv : forall (f: A->B) (P P': infseq A->Prop) (Q Q': infseq B->Prop), (forall s, P s -> Q (map f s)) -> (forall s, Q' (map f s) -> P' s) -> forall (s: infseq A), (Q ->_ Q') (map f s) -> (P ->_ P') s.
Lemma not_tl_map : forall (f: A->B) (P : infseq A->Prop) (Q: infseq B->Prop), (forall s, Q (map f s) -> P s) -> forall (s: infseq A), (~_ P) s -> (~_ Q) (map f s).
Lemma not_tl_map_conv : forall (f: A->B) (P: infseq A->Prop) (Q: infseq B->Prop), (forall s, P s -> Q (map f s)) -> forall (s: infseq A), (~_ Q) (map f s) -> (~_ P) s.
Lemma now_map : forall (f: A->B) (P: B->Prop) (s: infseq A), now (fun x => P (f x)) s -> now P (map f s).
Lemma now_map_conv : forall (f: A->B) (P: B->Prop) (s: infseq A), now P (map f s) -> now (fun x => P (f x)) s.
Lemma next_map : forall (f: A->B) (P: infseq A->Prop) (Q: infseq B->Prop), (forall s, P s -> Q (map f s)) -> forall (s: infseq A), next P s -> next Q (map f s).
Lemma next_map_conv : forall (f: A->B) (P: infseq A->Prop) (Q: infseq B->Prop), (forall s, Q (map f s) -> P s) -> forall (s: infseq A), next Q (map f s) -> next P s.
Lemma consecutive_map : forall (f: A->B) (P: B->B->Prop) (s: infseq A), consecutive (fun x y => P (f x) (f y)) s -> consecutive P (map f s).
Lemma consecutive_map_conv : forall (f: A->B) (P: B->B->Prop) (s: infseq A), consecutive P (map f s) -> consecutive (fun x y => P (f x) (f y)) s.
Lemma always_map : forall (f: A->B) (P: infseq A->Prop) (Q: infseq B->Prop), (forall s, P s -> Q (map f s)) -> forall (s: infseq A), always P s -> always Q (map f s).
Lemma always_map_conv_ext : forall (f: A->B) (P: infseq A->Prop) (Q: infseq B->Prop) (J : infseq A -> Prop), (forall x s, J (Cons x s) -> J s) -> (forall s, J s -> Q (map f s) -> P s) -> forall s, J s -> always Q (map f s) -> always P s.
Lemma always_map_conv : forall (f: A->B) (P: infseq A->Prop) (Q: infseq B->Prop), (forall s, Q (map f s) -> P s) -> forall (s: infseq A), always Q (map f s) -> always P s.
Lemma weak_until_map : forall (f: A->B) (J P: infseq A->Prop) (K Q: infseq B->Prop), (forall s, J s -> K (map f s)) -> (forall s, P s -> Q (map f s)) -> forall (s: infseq A), weak_until J P s -> weak_until K Q (map f s).
Lemma weak_until_map_conv : forall (f: A->B) (J P: infseq A->Prop) (K Q: infseq B->Prop), (forall s, K (map f s) -> J s) -> (forall s, Q (map f s) -> P s) -> forall (s: infseq A), weak_until K Q (map f s) -> weak_until J P s.
Lemma until_map : forall (f: A->B) (J P: infseq A->Prop) (K Q: infseq B->Prop), (forall s, J s -> K (map f s)) -> (forall s, P s -> Q (map f s)) -> forall (s: infseq A), until J P s -> until K Q (map f s).
Lemma release_map : forall (f: A->B) (J P: infseq A->Prop) (K Q: infseq B->Prop), (forall s, J s -> K (map f s)) -> (forall s, P s -> Q (map f s)) -> forall (s: infseq A), release J P s -> release K Q (map f s).
Lemma release_map_conv : forall (f: A->B) (J P: infseq A->Prop) (K Q: infseq B->Prop), (forall s, K (map f s) -> J s) -> (forall s, Q (map f s) -> P s) -> forall (s: infseq A), release K Q (map f s) -> release J P s.
Lemma eventually_map : forall (f: A->B) (P: infseq A->Prop) (Q: infseq B->Prop), (forall s, P s -> Q (map f s)) -> forall s, eventually P s -> eventually Q (map f s).