(* How to generate the multiple product for a constant *)
Fixpoint lgenk (n: nat) (k: K p) {struct n} : list (K p) :=
  match n  with
    O => nil
  | 1 => k :: nil
  | S n1 => k::lgenk n1 k
  end.

(* Specifications: *)
Lemma lgenk_length n k : length (lgenk n k) = n.
Lemma genk0_mprod vs : 0 = lgenk (length vs) 0%f *X* vs.
Lemma cbl_mprod vs v : cbl vs v -> exists ks, length ks = length vs /\ v = ks *X* vs.
Lemma addE_swap x1 x2 x3 : x1 + (x2 + x3) = x2 + (x1 + x3).
Lemma cblnil x : cbl nil x -> x = 0.
Lemma cbl_map l v : cbl _ l v -> cbl _ (map f l) (f v).
Lemma cbl_map_inv l v : cbl _ (map f l) v -> exists v1, cbl _ l v1 /\ v = f v1.