intros; rewrite multK1r; auto.
destruct x; rewrite !gprod0r; Vrm0.
rewrite !IH, rev_conj, conj_invo, scalE1; Vrm0.
Qed.
(* Scalar product, version deduced from prod_scal observing that prod_scal *)
(* computes the sum of the coordinate products and *)
(* that the A*(reverse A) equals to the squared norm *)
Fixpoint prod_scal (n : nat) : kn n -> vect n -> vect n -> K :=
match n return (kn n -> vect n -> vect n -> K) with
| 0%nat => fun _ x y => (x * y)%f
| S n1 =>
fun l x y =>
let (k, l1) := l in
let (x1, x2) := x in
let (y1, y2) := y in
(prod_scal n1 l1 x2 y2 + k * prod_scal n1 l1 x1 (y1 ^_'f))%f
end.
Notation "a '[.'  l ]  b " := (prod_scal _ l a b)
(at level 40).

(* Specifications: *)
Lemma prod_scal0r n l (x : vect n) : x [.l] 0 = 0%f.
Lemma prod_scal0l n l (x : vect n) : 0 [.l] x = 0%f.
Lemma prod_scal_scall n l k (x y : vect n) :
(k .* x) [.l] y = (k * (x [.l] y))%f.
Lemma prod_scal_scalr n l k (x y : vect n) :
x [.l] (k .* y) = (k * (x [.l] y))%f.
Lemma prod_scal_addl n l (x y z : vect n) :
(x + y) [.l] z = (x [.l] z + y [.l] z)%f.
Lemma prod_scal_addr n l (x y z : vect n) :
x [.l] (y + z) =  (x [.l] y + x [.l] z)%f.
Lemma conjf_prod_scal n l (x y: vect n) :
(x^_'f) [.l] y = x [.l] (y^_'f).
Lemma prod_scal_sym n l (x y: vect n) :
x [.l] y = y [.l] x.