Definition is_base vs := free vs /\ forall e, cbl vs e.

(* Specifications: *)
Lemma addE0r: forall x, x + 0 = x.
Lemma addE_cancell x y z : z + x = z + y -> x = y.
Lemma addE_cancelr x y z : x + z = y + z -> x = y.
Lemma mprod0l vs : nil *X* vs = 0.
Lemma mprod0r ks : ks *X* nil = 0.
Lemma mprod0 vs1 vs2 : map (fun _ : E p => 0%f) vs1 *X* vs2 = 0.
Lemma mprod_app ks1 ks2 vs1 vs2 : length ks1 = length vs1 -> (ks1 ++ ks2) *X* (vs1 ++ vs2) = ks1 *X* vs1 + ks2 *X* vs2.
Lemma free_nil : free nil.
Lemma free_cons v vs : free (v::vs) -> free vs.
Lemma free_perm vs1 vs2 : perm vs1 vs2 -> free vs2 -> free vs1.
Lemma uniq_free vs : free vs -> uniq vs.
Lemma free_incl vs1 vs2 : incl vs1 vs2 -> uniq vs1 -> free vs2 -> free vs1.
Lemma cbl_incl l1 l2 v : incl l1 l2 -> cbl l1 v -> cbl l2 v.
Lemma cbl0_inv x : cbl nil x -> x = 0.
Lemma mprod_cbl l ks : cbl l (ks *X* l).
Lemma addE_mprod ks1 ks2 vs : length ks1 = length ks2 -> map2 (fun k1 k2 => (k1 + k2)%f) ks1 ks2 *X* vs = ks1 *X* vs + ks2 *X* vs.
Lemma mprod_perm l1 l2 lk1: perm l1 l2 -> length lk1 = length l1 -> exists lk2, perm lk1 lk2 /\ lk1 *X* l1 = lk2 *X* l2.