(* The left contraction (Dorst inner product) *)
Notation "x ''L[' l ]  y " := (l_contra _ l x y) (at level 40).
Notation hom := (hom p _).

(* Specifications: *)
Lemma l_contra_addl n l x y z :
(x + y) 'L[l] z = x 'L[l] z +  y 'L[l] z :> vect n.
Lemma l_contra_addr n l x y z :
x 'L[l] (y + z) = x 'L[l] y + x 'L[l] z :> vect n.
Lemma l_contra_scall n l k x y :
(k .* x) 'L[l] y = k .* (x 'L[l] y) :> vect n.
Lemma l_contra_scalr n l k x y :
x 'L[l] (k .* y) = k .* (x 'L[l] y) :> vect n.
Lemma l_contra_0l n l y : 0 'L[l] y = 0 :> vect n.
Lemma l_contra_0r n l x : x 'L[l] 0 = 0 :> vect n.
Lemma l_contra_kl n l k y : [k] 'L[l] y =  k .* y :> vect n.
Lemma l_contra_kr n l k x : x 'L[l] [k] =  ['C[x] * k] :> vect n.
Lemma l_contra_joinl n l x y z :
(x ∧ y) 'L[l] z = x 'L[l] (y 'L[l] z) :> vect n.
Lemma l_contra_ei n l i :
i < n -> 'e_i 'L[l] 'e_i = [projk i l] :> vect n.
Lemma l_contra_eij n l i j :
i < n -> j < n -> i <> j -> 'e_i 'L[l] 'e_j =  0 :> vect n.
Lemma l_contra_conj n l x y :
(x 'L[l] y)^_'f = (x^_'f) 'L[l] (y^_'f) :> vect n.
(* Retrieve the Hodge dual from geometric product *)
(* when the quadratic form is nul *)
(* Thanks to Lounesto: Clifford Algebra and Spinors *)
Lemma dualE n x : '@x = 'R[x] [* [1%f]%Kn] E :> vect n.
induction n as [|n IH]; simpl; try Vfold n.