aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/ZArith/Zdigits_def.v
diff options
context:
space:
mode:
Diffstat (limited to 'theories/ZArith/Zdigits_def.v')
-rw-r--r--theories/ZArith/Zdigits_def.v170
1 files changed, 86 insertions, 84 deletions
diff --git a/theories/ZArith/Zdigits_def.v b/theories/ZArith/Zdigits_def.v
index 4e8e9fd93..a04719e52 100644
--- a/theories/ZArith/Zdigits_def.v
+++ b/theories/ZArith/Zdigits_def.v
@@ -8,7 +8,7 @@
(** Bitwise operations for ZArith *)
-Require Import Bool BinPos BinNat BinInt Ndigits Znat Zeven Zpow_def
+Require Import Bool BinPos BinNat BinInt Znat Zeven Zpow_def
Zorder Zcompare.
Local Open Scope Z_scope.
@@ -28,8 +28,8 @@ Definition Ztestbit a n :=
| 0 => Zodd_bool a
| Zpos p => match a with
| 0 => false
- | Zpos a => Ptestbit a (Npos p)
- | Zneg a => negb (Ntestbit (Ppred_N a) (Npos p))
+ | Zpos a => Pos.testbit a (Npos p)
+ | Zneg a => negb (N.testbit (Pos.pred_N a) (Npos p))
end
| Zneg _ => false
end.
@@ -60,72 +60,72 @@ Definition Zor a b :=
match a, b with
| 0, _ => b
| _, 0 => a
- | Zpos a, Zpos b => Zpos (Por a b)
- | Zneg a, Zpos b => Zneg (Nsucc_pos (Ndiff (Ppred_N a) (Npos b)))
- | Zpos a, Zneg b => Zneg (Nsucc_pos (Ndiff (Ppred_N b) (Npos a)))
- | Zneg a, Zneg b => Zneg (Nsucc_pos (Nand (Ppred_N a) (Ppred_N b)))
+ | Zpos a, Zpos b => Zpos (Pos.lor a b)
+ | Zneg a, Zpos b => Zneg (N.succ_pos (N.ldiff (Pos.pred_N a) (Npos b)))
+ | Zpos a, Zneg b => Zneg (N.succ_pos (N.ldiff (Pos.pred_N b) (Npos a)))
+ | Zneg a, Zneg b => Zneg (N.succ_pos (N.land (Pos.pred_N a) (Pos.pred_N b)))
end.
Definition Zand a b :=
match a, b with
| 0, _ => 0
| _, 0 => 0
- | Zpos a, Zpos b => Z_of_N (Pand a b)
- | Zneg a, Zpos b => Z_of_N (Ndiff (Npos b) (Ppred_N a))
- | Zpos a, Zneg b => Z_of_N (Ndiff (Npos a) (Ppred_N b))
- | Zneg a, Zneg b => Zneg (Nsucc_pos (Nor (Ppred_N a) (Ppred_N b)))
+ | Zpos a, Zpos b => Z_of_N (Pos.land a b)
+ | Zneg a, Zpos b => Z_of_N (N.ldiff (Npos b) (Pos.pred_N a))
+ | Zpos a, Zneg b => Z_of_N (N.ldiff (Npos a) (Pos.pred_N b))
+ | Zneg a, Zneg b => Zneg (N.succ_pos (N.lor (Pos.pred_N a) (Pos.pred_N b)))
end.
Definition Zdiff a b :=
match a, b with
| 0, _ => 0
| _, 0 => a
- | Zpos a, Zpos b => Z_of_N (Pdiff a b)
- | Zneg a, Zpos b => Zneg (Nsucc_pos (Nor (Ppred_N a) (Npos b)))
- | Zpos a, Zneg b => Z_of_N (Nand (Npos a) (Ppred_N b))
- | Zneg a, Zneg b => Z_of_N (Ndiff (Ppred_N b) (Ppred_N a))
+ | Zpos a, Zpos b => Z_of_N (Pos.ldiff a b)
+ | Zneg a, Zpos b => Zneg (N.succ_pos (N.lor (Pos.pred_N a) (Npos b)))
+ | Zpos a, Zneg b => Z_of_N (N.land (Npos a) (Pos.pred_N b))
+ | Zneg a, Zneg b => Z_of_N (N.ldiff (Pos.pred_N b) (Pos.pred_N a))
end.
Definition Zxor a b :=
match a, b with
| 0, _ => b
| _, 0 => a
- | Zpos a, Zpos b => Z_of_N (Pxor a b)
- | Zneg a, Zpos b => Zneg (Nsucc_pos (Nxor (Ppred_N a) (Npos b)))
- | Zpos a, Zneg b => Zneg (Nsucc_pos (Nxor (Npos a) (Ppred_N b)))
- | Zneg a, Zneg b => Z_of_N (Nxor (Ppred_N a) (Ppred_N b))
+ | Zpos a, Zpos b => Z_of_N (Pos.lxor a b)
+ | Zneg a, Zpos b => Zneg (N.succ_pos (N.lxor (Pos.pred_N a) (Npos b)))
+ | Zpos a, Zneg b => Zneg (N.succ_pos (N.lxor (Npos a) (Pos.pred_N b)))
+ | Zneg a, Zneg b => Z_of_N (N.lxor (Pos.pred_N a) (Pos.pred_N b))
end.
(** Conversions between [Ztestbit] and [Ntestbit] *)
Lemma Ztestbit_of_N : forall a n,
- Ztestbit (Z_of_N a) (Z_of_N n) = Ntestbit a n.
+ Ztestbit (Z_of_N a) (Z_of_N n) = N.testbit a n.
Proof.
intros [ |a] [ |n]; simpl; trivial. now destruct a.
Qed.
Lemma Ztestbit_of_N' : forall a n, 0<=n ->
- Ztestbit (Z_of_N a) n = Ntestbit a (Zabs_N n).
+ Ztestbit (Z_of_N a) n = N.testbit a (Zabs_N n).
Proof.
intros. now rewrite <- Ztestbit_of_N, Z_of_N_abs, Zabs_eq.
Qed.
Lemma Ztestbit_Zpos : forall a n, 0<=n ->
- Ztestbit (Zpos a) n = Ntestbit (Npos a) (Zabs_N n).
+ Ztestbit (Zpos a) n = N.testbit (Npos a) (Zabs_N n).
Proof.
intros. now rewrite <- Ztestbit_of_N'.
Qed.
Lemma Ztestbit_Zneg : forall a n, 0<=n ->
- Ztestbit (Zneg a) n = negb (Ntestbit (Ppred_N a) (Zabs_N n)).
+ Ztestbit (Zneg a) n = negb (N.testbit (Pos.pred_N a) (Zabs_N n)).
Proof.
intros a n Hn.
rewrite <- Ztestbit_of_N' by trivial.
destruct n as [ |n|n];
[ | simpl; now destruct (Ppred_N a) | now destruct Hn].
unfold Ztestbit.
- replace (Z_of_N (Ppred_N a)) with (Zpred (Zpos a))
+ replace (Z_of_N (Pos.pred_N a)) with (Zpred (Zpos a))
by (destruct a; trivial).
now rewrite Zodd_bool_pred, <- Zodd_even_bool.
Qed.
@@ -164,7 +164,7 @@ Proof.
destruct a as [|[a|a|]|[a|a|]]; simpl; trivial. now destruct a.
unfold Ztestbit. rewrite <- Zpos_succ_morphism.
destruct a as [|a|[a|a|]]; simpl; trivial;
- rewrite ?Ppred_succ; now destruct n.
+ rewrite ?Pos.pred_N_succ; now destruct n.
Qed.
Lemma Ztestbit_even_succ a n : 0<=n ->
@@ -174,57 +174,64 @@ Proof.
destruct a as [|[a|a|]|[a|a|]]; simpl; trivial. now destruct a.
unfold Ztestbit. rewrite <- Zpos_succ_morphism.
destruct a as [|a|[a|a|]]; simpl; trivial;
- rewrite ?Ppred_succ; now destruct n.
+ rewrite ?Pos.pred_N_succ; now destruct n.
Qed.
Lemma Ppred_div2_up : forall p,
- Ppred_N (Pdiv2_up p) = Ndiv2 (Ppred_N p).
+ Pos.pred_N (Pos.div2_up p) = N.div2 (Pos.pred_N p).
Proof.
intros [p|p| ]; trivial.
- simpl. rewrite Ppred_N_spec. apply (Npred_succ (Npos p)).
+ simpl. apply Pos.pred_N_succ.
destruct p; simpl; trivial.
Qed.
-Lemma Z_of_N_div2 : forall n, Z_of_N (Ndiv2 n) = Zdiv2 (Z_of_N n).
+Lemma Z_of_N_div2 : forall n, Z_of_N (N.div2 n) = Zdiv2 (Z_of_N n).
Proof.
intros [|p]; trivial. now destruct p.
Qed.
-Lemma Z_of_N_quot2 : forall n, Z_of_N (Ndiv2 n) = Zquot2 (Z_of_N n).
+Lemma Z_of_N_quot2 : forall n, Z_of_N (N.div2 n) = Zquot2 (Z_of_N n).
Proof.
intros [|p]; trivial. now destruct p.
Qed.
(** Auxiliary results about right shift on positive numbers *)
-Lemma Ppred_Pshiftl_low : forall p n m, (m<n)%nat ->
- Nbit (Ppred_N (iter_nat n _ xO p)) m = true.
+Lemma Ppred_Pshiftl_low : forall p n m, (m<n)%N ->
+ N.testbit (Pos.pred_N (Pos.shiftl p n)) m = true.
Proof.
- induction n.
- inversion 1.
- intros m H. simpl.
- destruct m.
- now destruct (iter_nat n _ xO p).
- apply lt_S_n in H.
- specialize (IHn m H).
- now destruct (iter_nat n _ xO p).
+ induction n using N.peano_ind.
+ now destruct m.
+ intros m H. unfold Pos.shiftl.
+ destruct n as [|n]; simpl in *.
+ destruct m. now destruct p. elim (Pos.nlt_1_r _ H).
+ rewrite Pos.iter_succ. simpl.
+ set (u:=Pos.iter n xO p) in *; clearbody u.
+ destruct m as [|m]. now destruct u.
+ rewrite <- (IHn (Pos.pred_N m)).
+ rewrite <- (N.testbit_odd_succ _ (Pos.pred_N m)).
+ rewrite N.succ_pos_pred. now destruct u.
+ apply N.le_0_l.
+ apply N.succ_lt_mono. now rewrite N.succ_pos_pred.
Qed.
-Lemma Ppred_Pshiftl_high : forall p n m, (n<=m)%nat ->
- Nbit (Ppred_N (iter_nat n _ xO p)) m =
- Nbit (Nshiftl_nat (Ppred_N p) n) m.
+Lemma Ppred_Pshiftl_high : forall p n m, (n<=m)%N ->
+ N.testbit (Pos.pred_N (Pos.shiftl p n)) m =
+ N.testbit (N.shiftl (Pos.pred_N p) n) m.
Proof.
- induction n.
- now unfold Nshiftl_nat.
- intros m H.
- destruct m.
- inversion H.
- apply le_S_n in H.
- rewrite Nshiftl_nat_S.
- specialize (IHn m H).
- simpl in *.
- unfold Nbit.
- now destruct (Nshiftl_nat (Ppred_N p) n), (iter_nat n positive xO p).
+ induction n using N.peano_ind; intros m H.
+ unfold N.shiftl. simpl. now destruct (Pos.pred_N p).
+ rewrite N.shiftl_succ_r.
+ destruct n as [|n].
+ destruct m as [|m]. now destruct H. now destruct p.
+ destruct m as [|m]. now destruct H.
+ rewrite <- (N.succ_pos_pred m).
+ rewrite N.double_spec, N.testbit_even_succ by apply N.le_0_l.
+ rewrite <- IHn.
+ rewrite N.testbit_succ_r_div2 by apply N.le_0_l.
+ f_equal. simpl. rewrite Pos.iter_succ.
+ now destruct (Pos.iter n xO p).
+ apply N.succ_le_mono. now rewrite N.succ_pos_pred.
Qed.
(** Correctness proofs about [Zshiftr] and [Zshiftl] *)
@@ -245,14 +252,14 @@ Proof.
rewrite <- (iter_pos_swap_gen _ _ _ Ndiv2) by exact Z_of_N_div2.
rewrite Ztestbit_Zpos, Ztestbit_of_N'; trivial.
rewrite Zabs_N_plus; try easy. simpl Zabs_N.
- exact (Nshiftr_spec (Npos a) (Npos n) (Zabs_N m)).
+ exact (N.shiftr_spec' (Npos a) (Npos n) (Zabs_N m)).
now apply Zplus_le_0_compat.
(* a < 0 *)
rewrite <- (iter_pos_swap_gen _ _ _ Pdiv2_up) by trivial.
rewrite 2 Ztestbit_Zneg; trivial. f_equal.
rewrite Zabs_N_plus; try easy. simpl Zabs_N.
rewrite (iter_pos_swap_gen _ _ _ _ Ndiv2) by exact Ppred_div2_up.
- exact (Nshiftr_spec (Ppred_N a) (Npos n) (Zabs_N m)).
+ exact (N.shiftr_spec' (Ppred_N a) (Npos n) (Zabs_N m)).
now apply Zplus_le_0_compat.
Qed.
@@ -271,14 +278,11 @@ Proof.
(* a > 0 *)
rewrite <- (iter_pos_swap_gen _ _ _ xO) by trivial.
rewrite Ztestbit_Zpos by easy.
- exact (Nshiftl_spec_low (Npos a) (Npos n) (Npos m) H).
+ exact (N.shiftl_spec_low (Npos a) (Npos n) (Npos m) H).
(* a < 0 *)
rewrite <- (iter_pos_swap_gen _ _ _ xO) by trivial.
rewrite Ztestbit_Zneg by easy.
- simpl Zabs_N.
- rewrite <- Nbit_Ntestbit, iter_nat_of_P. simpl nat_of_N.
- rewrite Ppred_Pshiftl_low; trivial.
- now apply Plt_lt.
+ now rewrite (Ppred_Pshiftl_low a (Npos n)).
Qed.
Lemma Zshiftl_spec_high : forall a n m, 0<=m -> n<=m ->
@@ -300,16 +304,13 @@ Proof.
(* ... a > 0 *)
rewrite <- (iter_pos_swap_gen _ _ _ xO) by trivial.
rewrite 2 Ztestbit_Zpos, EQ by easy.
- exact (Nshiftl_spec_high (Npos p) (Npos n) (Npos m) H).
+ exact (N.shiftl_spec_high' (Npos p) (Npos n) (Npos m) H).
(* ... a < 0 *)
rewrite <- (iter_pos_swap_gen _ _ _ xO) by trivial.
rewrite 2 Ztestbit_Zneg, EQ by easy. f_equal.
simpl Zabs_N.
- rewrite <- Nshiftl_spec_high by easy.
- rewrite <- 2 Nbit_Ntestbit, iter_nat_of_P, <- Nshiftl_nat_equiv.
- simpl nat_of_N.
- apply Ppred_Pshiftl_high.
- now apply Ple_le.
+ rewrite <- N.shiftl_spec_high by easy.
+ now apply (Ppred_Pshiftl_high p (Npos n)).
(* n < 0 *)
unfold Zminus. simpl.
now apply (Zshiftr_spec_aux a (Zpos n) m).
@@ -342,10 +343,10 @@ Proof.
rewrite ?Ztestbit_0_l, ?orb_false_r; trivial; unfold Zor;
rewrite ?Ztestbit_Zpos, ?Ztestbit_Zneg, ?Ppred_Nsucc
by trivial.
- now rewrite <- Nor_spec.
- now rewrite Ndiff_spec, negb_andb, negb_involutive, orb_comm.
- now rewrite Ndiff_spec, negb_andb, negb_involutive.
- now rewrite Nand_spec, negb_andb.
+ now rewrite <- N.lor_spec.
+ now rewrite N.ldiff_spec, negb_andb, negb_involutive, orb_comm.
+ now rewrite N.ldiff_spec, negb_andb, negb_involutive.
+ now rewrite N.land_spec, negb_andb.
Qed.
Lemma Zand_spec : forall a b n,
@@ -357,10 +358,10 @@ Proof.
rewrite ?Ztestbit_0_l, ?andb_false_r; trivial; unfold Zand;
rewrite ?Ztestbit_Zpos, ?Ztestbit_Zneg, ?Ztestbit_of_N', ?Ppred_Nsucc
by trivial.
- now rewrite <- Nand_spec.
- now rewrite Ndiff_spec.
- now rewrite Ndiff_spec, andb_comm.
- now rewrite Nor_spec, negb_orb.
+ now rewrite <- N.land_spec.
+ now rewrite N.ldiff_spec.
+ now rewrite N.ldiff_spec, andb_comm.
+ now rewrite N.lor_spec, negb_orb.
Qed.
Lemma Zdiff_spec : forall a b n,
@@ -372,10 +373,10 @@ Proof.
rewrite ?Ztestbit_0_l, ?andb_true_r; trivial; unfold Zdiff;
rewrite ?Ztestbit_Zpos, ?Ztestbit_Zneg, ?Ztestbit_of_N', ?Ppred_Nsucc
by trivial.
- now rewrite <- Ndiff_spec.
- now rewrite Nand_spec, negb_involutive.
- now rewrite Nor_spec, negb_orb.
- now rewrite Ndiff_spec, negb_involutive, andb_comm.
+ now rewrite <- N.ldiff_spec.
+ now rewrite N.land_spec, negb_involutive.
+ now rewrite N.lor_spec, negb_orb.
+ now rewrite N.ldiff_spec, negb_involutive, andb_comm.
Qed.
Lemma Zxor_spec : forall a b n,
@@ -387,16 +388,17 @@ Proof.
rewrite ?Ztestbit_0_l, ?xorb_false_l, ?xorb_false_r; trivial; unfold Zxor;
rewrite ?Ztestbit_Zpos, ?Ztestbit_Zneg, ?Ztestbit_of_N', ?Ppred_Nsucc
by trivial.
- now rewrite <- Nxor_spec.
- now rewrite Nxor_spec, negb_xorb_r.
- now rewrite Nxor_spec, negb_xorb_l.
- now rewrite Nxor_spec, xorb_negb_negb.
+ now rewrite <- N.lxor_spec.
+ now rewrite N.lxor_spec, negb_xorb_r.
+ now rewrite N.lxor_spec, negb_xorb_l.
+ now rewrite N.lxor_spec, xorb_negb_negb.
Qed.
(** An additionnal proof concerning [Pshiftl_nat], used in BigN *)
+
Lemma Pshiftl_nat_Zpower : forall n p,
- Zpos (Pshiftl_nat p n) = Zpos p * 2 ^ Z_of_nat n.
+ Zpos (Pos.shiftl_nat p n) = Zpos p * 2 ^ Z_of_nat n.
Proof.
intros.
rewrite Zmult_comm.