Fixpoint pscal (n: nat): (kn n) -> (kn n) -> K :=
match n return kn n -> kn n -> K with
| O => fun a b => 0%f
| S n1 => fun l1 l2 => let (a,l3) := l1 in let (b,l4) := l2 in
(a * b + pscal n1 l3 l4)%f
end.
Notation "a  [.]  b" := (pscal _ a b) (at level 40): kn_scope.

(* Specifications: *)
Lemma pscal0l n (x: kn n) : 0 [.] x = 0%f.
Lemma pscal0r n (x: kn n) : x [.] 0 = 0%f.
Lemma pscal_com n (x y: kn n) : x [.] y = y [.] x.
Lemma pscal_e n (i j: nat) : i < n -> j < n ->
('e_i: kn n) [.] ('e_j) = if (i ?= j)%nat then 1%f else 0%f.
Lemma pscal_scall n k (x y: kn n) :
(k .* x) [.] y = (k * (x [.] y))%f.
Lemma pscal_scalr n k (x y: kn n) :
x [.] (k .* y) = (k * (x [.] y))%f.
Lemma pscal_addl n (x y z: kn n) :
(x + y) [.] z = (x [.] z + (y [.] z))%f.
Lemma pscal_addr n (x y z: kn n) :
z [.] (x + y) = (z [.] x + (z [.] y))%f.