(* given a list of vectors produce the list of all products *)
Fixpoint all_prods (n: nat) (vs: list (vect n)) {struct vs} : list (vect n) :=
match vs with
nil => 1 :: nil
| v::vs1 => let vs1 := all_prods n vs1 in
(map (join n v) vs1 ++ vs1)%list
end.

Lemma all_prods_hom n vs :
(forall i, In i vs -> exists k, hom n k i) ->
(forall i, In i (all_prods n vs) -> exists k, hom n k i).