(** [list_prod] has the same signature as [combine], but unlike [combine], it adds every possible pairs, not only those at the same position. *)
Fixpoint list_prod (l:list A) (l':list B) :
list (A * B) :=
match l with
| [] => []
| x :: t => (map (fun y:B => (x, y)) l')++(list_prod t l')
end.

Lemma in_prod_iff :
forall (l:list A)(l':list B)(x:A)(y:B),
In (x,y) (list_prod l l') <-> In x l /\ In y l'.