1
(************************************************************************)
2
(* v * The Coq Proof Assistant / The Coq Development Team *)
3
(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
4
(* \VV/ **************************************************************)
5
(* // * This file is distributed under the terms of the *)
6
(* * GNU Lesser General Public License Version 2.1 *)
7
(************************************************************************)
9
(*i $Id: Bvector.v 11004 2008-05-28 09:09:12Z herbelin $ i*)
11
(** Bit vectors. Contribution by Jean Duprat (ENS Lyon). *)
14
Require Export Sumbool.
17
Open Local Scope nat_scope.
20
On s'inspire de List.v pour fabriquer les vecteurs de bits.
21
La dimension du vecteur est un param�tre trop important pour
22
se contenter de la fonction "length".
23
La premi�re id�e est de faire un record avec la liste et la longueur.
24
Malheureusement, cette verification a posteriori amene a faire
25
de nombreux lemmes pour gerer les longueurs.
26
La seconde id�e est de faire un type d�pendant dans lequel la
27
longueur est un param�tre de construction. Cela complique un
28
peu les inductions structurelles et dans certains cas on
29
utilisera un terme de preuve comme d�finition, car le
30
m�canisme d'inf�rence du type du filtrage n'est pas toujours
31
aussi puissant que celui implant� par les tactiques d'�limination.
37
Un vecteur est une liste de taille n d'�l�ments d'un ensemble A.
38
Si la taille est non nulle, on peut extraire la premi�re composante et
39
le reste du vecteur, la derni�re composante ou rajouter ou enlever
40
une composante (carry) ou repeter la derni�re composante en fin de vecteur.
41
On peut aussi tronquer le vecteur de ses p derni�res composantes ou
42
au contraire l'�tendre (concat�ner) d'un vecteur de longueur p.
43
Une fonction unaire sur A g�n�re une fonction des vecteurs de taille n
44
dans les vecteurs de taille n en appliquant f terme � terme.
45
Une fonction binaire sur A g�n�re une fonction des couples de vecteurs
46
de taille n dans les vecteurs de taille n en appliquant f terme � terme.
51
Inductive vector : nat -> Type :=
53
| Vcons : forall (a:A) (n:nat), vector n -> vector (S n).
55
Definition Vhead (n:nat) (v:vector (S n)) :=
60
Definition Vtail (n:nat) (v:vector (S n)) :=
65
Definition Vlast : forall n:nat, vector (S n) -> A.
67
induction n as [| n f]; intro v.
71
inversion v as [| n0 a H0 H1].
75
Fixpoint Vconst (a:A) (n:nat) :=
76
match n return vector n with
78
| S n => Vcons a _ (Vconst a n)
81
(** Shifting and truncating *)
83
Lemma Vshiftout : forall n:nat, vector (S n) -> vector n.
85
induction n as [| n f]; intro v.
88
inversion v as [| a n0 H0 H1].
89
exact (Vcons a n (f H0)).
92
Lemma Vshiftin : forall n:nat, A -> vector n -> vector (S n).
94
induction n as [| n f]; intros a v.
97
inversion v as [| a0 n0 H0 H1 ].
98
exact (Vcons a (S n) (f a H0)).
101
Lemma Vshiftrepeat : forall n:nat, vector (S n) -> vector (S (S n)).
103
induction n as [| n f]; intro v.
107
inversion v as [| a n0 H0 H1 ].
108
exact (Vcons a (S (S n)) (f H0)).
111
Lemma Vtrunc : forall n p:nat, n > p -> vector n -> vector (n - p).
113
induction p as [| p f]; intros H v.
114
rewrite <- minus_n_O.
117
apply (Vshiftout (n - S p)).
126
(** Concatenation of two vectors *)
128
Fixpoint Vextend n p (v:vector n) (w:vector p) : vector (n+p) :=
131
| Vcons a n' v' => Vcons a (n'+p) (Vextend n' p v' w)
134
(** Uniform application on the arguments of the vector *)
138
Fixpoint Vunary n (v:vector n) : vector n :=
141
| Vcons a n' v' => Vcons (f a) n' (Vunary n' v')
144
Variable g : A -> A -> A.
146
Lemma Vbinary : forall n:nat, vector n -> vector n -> vector n.
148
induction n as [| n h]; intros v v0.
151
inversion v as [| a n0 H0 H1]; inversion v0 as [| a0 n1 H2 H3].
152
exact (Vcons (g a a0) n (h H0 H2)).
155
(** Eta-expansion of a vector *)
157
Definition Vid n : vector n -> vector n :=
160
| _ => fun v => Vcons (Vhead _ v) _ (Vtail _ v)
163
Lemma Vid_eq : forall (n:nat) (v:vector n), v = Vid n v.
169
forall (n : nat) (v : vector (S n)), v = Vcons (Vhead _ v) _ (Vtail _ v).
175
Lemma V0_eq : forall (v : vector 0), v = Vnil.
183
(* suppressed: incompatible with Coq-Art book
184
Implicit Arguments Vnil [A].
185
Implicit Arguments Vcons [A n].
188
Section BOOLEAN_VECTORS.
191
Un vecteur de bits est un vecteur sur l'ensemble des bool�ens de longueur fixe.
192
ATTENTION : le stockage s'effectue poids FAIBLE en t�te.
193
On en extrait le bit de poids faible (head) et la fin du vecteur (tail).
194
On calcule la n�gation d'un vecteur, le et, le ou et le xor bit � bit de 2 vecteurs.
195
On calcule les d�calages d'une position vers la gauche (vers les poids forts, on
196
utilise donc Vshiftout, vers la droite (vers les poids faibles, on utilise Vshiftin) en
197
ins�rant un bit 'carry' (logique) ou en r�p�tant le bit de poids fort (arithm�tique).
198
ATTENTION : Tous les d�calages prennent la taille moins un comme param�tre
199
(ils ne travaillent que sur des vecteurs au moins de longueur un).
202
Definition Bvector := vector bool.
204
Definition Bnil := @Vnil bool.
206
Definition Bcons := @Vcons bool.
208
Definition Bvect_true := Vconst bool true.
210
Definition Bvect_false := Vconst bool false.
212
Definition Blow := Vhead bool.
214
Definition Bhigh := Vtail bool.
216
Definition Bsign := Vlast bool.
218
Definition Bneg := Vunary bool negb.
220
Definition BVand := Vbinary bool andb.
222
Definition BVor := Vbinary bool orb.
224
Definition BVxor := Vbinary bool xorb.
226
Definition BshiftL (n:nat) (bv:Bvector (S n)) (carry:bool) :=
227
Bcons carry n (Vshiftout bool n bv).
229
Definition BshiftRl (n:nat) (bv:Bvector (S n)) (carry:bool) :=
230
Bhigh (S n) (Vshiftin bool (S n) carry bv).
232
Definition BshiftRa (n:nat) (bv:Bvector (S n)) :=
233
Bhigh (S n) (Vshiftrepeat bool n bv).
235
Fixpoint BshiftL_iter (n:nat) (bv:Bvector (S n)) (p:nat) {struct p} :
239
| S p' => BshiftL n (BshiftL_iter n bv p') false
242
Fixpoint BshiftRl_iter (n:nat) (bv:Bvector (S n)) (p:nat) {struct p} :
246
| S p' => BshiftRl n (BshiftRl_iter n bv p') false
249
Fixpoint BshiftRa_iter (n:nat) (bv:Bvector (S n)) (p:nat) {struct p} :
253
| S p' => BshiftRa n (BshiftRa_iter n bv p')