Fixpoint zip {X} (f1 f2 : nat -> X) n :=
  match n with
  | O => f1 O
  | S O => f2 0
  | S (S n) => zip (fun n => f1 (S n)) (fun n => f2 (S n)) n
  end.

Lemma zip_ext {X} f1 f2 g1 g2 : (forall x, f1 x = g1 x) -> (forall x, f2 x = g2 x) -> forall k, @zip X f1 f2 k = @zip X g1 g2 k.