(* Defining the meet *)
(* unicode 2227 *)
Notation "x '∧' y" := (meet _ x y) (at level 45, left associativity).

(* Specifications: *)
Lemma meet0l n (x: vect n) : 0 ∧ x = 0.
Hint Rewrite meet0l: GRm0.
Lemma meet0r n (x: vect n) : x ∧ 0 = 0.
Hint Rewrite meet0r: GRm0.
Lemma meet1l n (x: vect n) : 1 ∧ x = ['C['@x]].
Lemma meet1r n (x: vect n) : x ∧ 1 = ['C['@x]].
(* (k.x) ∧ y = k. (x ∧ y) *)
Lemma meet_scall n k (x y : vect n) : k .* x ∧ y = k .* (x ∧ y).
(* x ∧ (k . y) = k. (x ∧ y) *)
Lemma meet_scalr n k (x y : vect n) : x ∧ k .* y = k .* (x ∧ y).
Lemma meet0 (v1 v2 : vect 0) : v1 ∧ v2 = (v1 * v2)%f.
Lemma conjf_meetl n (x y : vect n) : (x ∧ y) ^_'f = x ^_'f ∧ y ^d_'f.
Lemma conjf_meetr n (x y : vect n) : (x ∧ y) ^_'f = x ^d_'f ∧ y ^_'f.
Lemma dconjf_meet n (x y : vect n) : (x ∧ y) ^d_'f = x ^d_'f ∧ y ^d_'f.
Lemma dconjf_meetd n (x y : vect n) : (x ∧ y) ^d_'f = x ^_'f ∧ y ^_'f.
Lemma dconst_meet n (x y: vect n) : 'dC[x ∧ y] = ('dC[x] * 'dC[y])%f.
(* (x + y) ∧ z = (x ∧ z) + (y ∧ z) *)
Lemma meet_addl n (x y z : vect n) : (x + y) ∧ z = x ∧ z + y ∧ z.
(* z ∧ (x + y) = (z ∧ x) + (z ∧ y) *)
Lemma meet_addr n (x y z : vect n) : z ∧ (x + y) = z ∧ x + z ∧ y.
Lemma meet_assoc n (x y z : vect n) : x ∧ y ∧ z = x ∧ (y ∧ z).
Lemma meet_alll n (x: vect n) : all n ∧ x = x.
Lemma meet_allr n (x: vect n) : x ∧ all n = x.
(* By duality *)
Lemma meet_small n k1 k2 (x y : vect n) :
hom n k1 x -> hom n k2 y -> k1 + k2 < n -> x ∧ y = 0.
(* By duality *)
Lemma meet_hom n k1 k2 (x y : vect n) :
hom n k1 x -> hom n k2 y -> hom n (k1 + k2 - n) (x ∧ y).