(* Ad-hoc conjugate function in order to define the product *)
Fixpoint conj (n : nat) (b: bool) {struct n}: vect n -> vect n :=
  match n return (vect n -> vect n) with
  | 0%nat => fun a => if b then (- a)%f else a
  | S n1 =>
      fun l1 =>
      let (l2, l3) := l1 in (conj n1 (negb b) l2, conj n1 b l3)
  end.Notation "x ^_ b" := (conj _ b x)  (at level 30).Notation "x ^_'t" := (conj _ true x)  (at level 30).Notation "x ^_'f" := (conj _ false x)  (at level 30).

(* Specifications: *)
Lemma conj_add n b (x y: vect n) : (x + y) ^_ b = x ^_ b + y ^_ b.
Lemma conj_invo n b (x: vect n) : x ^_ b ^_ b = x.
Lemma conj0 n b : 0 ^_ b = (0 : vect n).
Lemma conj_hom n b k (x: vect n) : hom n k x -> hom n k (x ^_ b).
Lemma conj_swap n b1 b2 (x: vect n) : x ^_ b2 ^_ b1 = x ^_ b1 ^_ b2.