(* We recover the usual mathematical notation *)
Definition K1 := K.Notation "'K'" := (K1 p) : g_scope.Notation projk := (Kn.proj p _).Notation gvp := (Grassmann.vn_eparams p).Notation "x '∧' y" := (join p _ x y) (at level 40, left associativity).Notation "x + y" := (addE _ x y).Notation "k .* x" := (scalE (gvp _) k x).Notation "k .* x" := (scalE _ k x) : Kn_scope.Notation vect := (vect p).Notation "x ^_'f" := (conj p _ false x)  (at level 30).Notation "'C[ x ]" := (const p _ x).Notation " [ k ] " := (genk p  _ k%f) (at level 9).Notation kn := (kn p).Notation "#< l , x ># " := (contra p _ l x).Notation "'v_ x" := (k2g  p _ x) (at level 9).Notation "''e_' i" := (gen p _ i).Notation "'@ x " := (dual p _ x) (at level 9).Notation E := (all p _).Ltac Vfold n :=
     change (VectorSpace.K p) with (K1 p);
     change (add p n) with (addE (gvp n));
     change (scal p n) with (scalE (gvp n));
     change (genk p n 0%f) with (E0 (gvp n)).Notation "a [*  l ]  b " := (gprod _ l a b) (at level 9).(* reverse of a multivector each basis element is reversed *)
Fixpoint rev n : vect n -> vect n :=
  match n return vect n ->  vect n with
  |    0 => fun a => a
  | S n1 => fun v => let (x,y) := v in (rev n1 x ^_'f, rev n1 y)
  end.Notation "''R[' x ]" := (rev _ x).Notation "''Pi[' l ]" := (pseudo_inv _ l).(* product of all elements in a vector *)
Fixpoint prodk n : (kn n -> K) :=
  match n return kn n -> K with
         0 => fun _ => 1%f 
  | (S n1) => fun x => let (a, x1) := x in (a * prodk n1 x1)%f
  end.Notation "''P[' x ]" := (prodk _ x).(* Actual definition of Clifford dual *)
Definition cliff_star n l := cliff_starb n true l.

(* Specifications: *)
Lemma cdual_cliff n l x : cdual n l x = cliff_star n l x.