Definition bind {A B} (aopt: option A) (f: A -> option B): option B :=
match aopt with None => None | Some a => f a end.
Section CombineList.
Variable A: Type.
Variable f: A -> A -> A.
Fixpoint combinelist xs ys :=
match xs, ys with
nil, nil => Some nil
| (u::us),(v::vs) => bind (combinelist us vs) (fun l => Some (f u v :: l))
| _, _ => None
end.

Lemma combinelist_SomeInv: forall xs ys l, combinelist xs ys = Some l ->
Zlength xs = Zlength ys.