aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYishuai Li2018-07-26 13:03:15 -0400
committerYishuai Li2018-07-26 13:09:08 -0400
commit3caed4eeae1e6a561e707911aeadce739aa83da6 (patch)
tree4f935b84aa622773abf555677d6b13094a27aaf9
parent535f8ce6edea2e2692f5c9c094d3c6fd07411897 (diff)
NArith: add sized N2Bv
-rw-r--r--CHANGES2
-rw-r--r--theories/NArith/Ndigits.v35
2 files changed, 37 insertions, 0 deletions
diff --git a/CHANGES b/CHANGES
index 2d4b82d01a..ba713e61e0 100644
--- a/CHANGES
+++ b/CHANGES
@@ -52,6 +52,8 @@ Standard Library
Solution: wrap `_ =? _` in `(_ =? _)%Z` (or whichever scope you
want).
+- Added `Ndigits.N2Bv_sized`, and proved some lemmas about it.
+
Tools
- Coq_makefile lets one override or extend the following variables from
diff --git a/theories/NArith/Ndigits.v b/theories/NArith/Ndigits.v
index 3ccaa7211a..68a98e4292 100644
--- a/theories/NArith/Ndigits.v
+++ b/theories/NArith/Ndigits.v
@@ -517,6 +517,23 @@ Definition N2Bv (n:N) : Bvector (N.size_nat n) :=
| Npos p => P2Bv p
end.
+Fixpoint P2Bv_sized (m : nat) (p : positive) : Bvector m :=
+ match m with
+ | O => []
+ | S m =>
+ match p with
+ | xI p => true :: P2Bv_sized m p
+ | xO p => false :: P2Bv_sized m p
+ | xH => true :: Bvect_false m
+ end
+ end.
+
+Definition N2Bv_sized (m : nat) (n : N) : Bvector m :=
+ match n with
+ | N0 => Bvect_false m
+ | Npos p => P2Bv_sized m p
+ end.
+
Fixpoint Bv2N (n:nat)(bv:Bvector n) : N :=
match bv with
| Vector.nil _ => N0
@@ -670,3 +687,21 @@ rewrite H.
destruct a, b, (Bv2N n v1), (Bv2N n v2);
simpl; auto.
Qed.
+
+Lemma N2Bv_sized_Nsize (n : N) :
+ N2Bv_sized (N.size_nat n) n = N2Bv n.
+Proof with simpl; auto.
+ destruct n...
+ induction p...
+ all: rewrite IHp...
+Qed.
+
+Lemma N2Bv_sized_Bv2N (n : nat) (v : Bvector n) :
+ N2Bv_sized n (Bv2N n v) = v.
+Proof with simpl; auto.
+ induction v...
+ destruct h;
+ unfold N2Bv_sized;
+ destruct (Bv2N n v) as [|[]];
+ rewrite <- IHv...
+Qed.