1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288
|
(************************************************************************)
(* * The Coq Proof Assistant / The Coq Development Team *)
(* v * Copyright INRIA, CNRS and contributors *)
(* <O___,, * (see version control and CREDITS file for authors & dates) *)
(* \VV/ **************************************************************)
(* // * This file is distributed under the terms of the *)
(* * GNU Lesser General Public License Version 2.1 *)
(* * (see LICENSE file for the text of the license) *)
(************************************************************************)
(** Binary Integers : Parity and Division by Two *)
(** Initial author : Pierre Crégut (CNET, Lannion, France) *)
(** THIS FILE IS DEPRECATED.
It is now almost entirely made of compatibility formulations
for results already present in BinInt.Z. *)
Require Import BinInt.
Local Open Scope Z_scope.
(** Historical formulation of even and odd predicates, based on
case analysis. We now rather recommend using [Z.Even] and
[Z.Odd], which are based on the exist predicate. *)
Definition Zeven (z:Z) :=
match z with
| Z0 => True
| Zpos (xO _) => True
| Zneg (xO _) => True
| _ => False
end.
Definition Zodd (z:Z) :=
match z with
| Zpos xH => True
| Zneg xH => True
| Zpos (xI _) => True
| Zneg (xI _) => True
| _ => False
end.
Lemma Zeven_equiv z : Zeven z <-> Z.Even z.
Proof.
rewrite <- Z.even_spec.
destruct z as [|p|p]; try destruct p; simpl; intuition.
Qed.
Lemma Zodd_equiv z : Zodd z <-> Z.Odd z.
Proof.
rewrite <- Z.odd_spec.
destruct z as [|p|p]; try destruct p; simpl; intuition.
Qed.
Theorem Zeven_ex_iff n : Zeven n <-> exists m, n = 2*m.
Proof (Zeven_equiv n).
Theorem Zodd_ex_iff n : Zodd n <-> exists m, n = 2*m + 1.
Proof (Zodd_equiv n).
(** Boolean tests of parity (now in BinInt.Z) *)
Notation Zeven_bool := Z.even (only parsing).
Notation Zodd_bool := Z.odd (only parsing).
Lemma Zeven_bool_iff n : Z.even n = true <-> Zeven n.
Proof.
now rewrite Z.even_spec, Zeven_equiv.
Qed.
Lemma Zodd_bool_iff n : Z.odd n = true <-> Zodd n.
Proof.
now rewrite Z.odd_spec, Zodd_equiv.
Qed.
Ltac boolify_even_odd := rewrite <- ?Zeven_bool_iff, <- ?Zodd_bool_iff.
Lemma Zodd_even_bool n : Z.odd n = negb (Z.even n).
Proof.
symmetry. apply Z.negb_even.
Qed.
Lemma Zeven_odd_bool n : Z.even n = negb (Z.odd n).
Proof.
symmetry. apply Z.negb_odd.
Qed.
Definition Zeven_odd_dec n : {Zeven n} + {Zodd n}.
Proof.
destruct n as [|p|p]; try destruct p; simpl; (now left) || (now right).
Defined.
Definition Zeven_dec n : {Zeven n} + {~ Zeven n}.
Proof.
destruct n as [|p|p]; try destruct p; simpl; (now left) || (now right).
Defined.
Definition Zodd_dec n : {Zodd n} + {~ Zodd n}.
Proof.
destruct n as [|p|p]; try destruct p; simpl; (now left) || (now right).
Defined.
Lemma Zeven_not_Zodd n : Zeven n -> ~ Zodd n.
Proof.
boolify_even_odd. rewrite <- Z.negb_odd. destruct Z.odd; intuition.
Qed.
Lemma Zodd_not_Zeven n : Zodd n -> ~ Zeven n.
Proof.
boolify_even_odd. rewrite <- Z.negb_odd. destruct Z.odd; intuition.
Qed.
Lemma Zeven_Sn n : Zodd n -> Zeven (Z.succ n).
Proof.
boolify_even_odd. now rewrite Z.even_succ.
Qed.
Lemma Zodd_Sn n : Zeven n -> Zodd (Z.succ n).
Proof.
boolify_even_odd. now rewrite Z.odd_succ.
Qed.
Lemma Zeven_pred n : Zodd n -> Zeven (Z.pred n).
Proof.
boolify_even_odd. now rewrite Z.even_pred.
Qed.
Lemma Zodd_pred n : Zeven n -> Zodd (Z.pred n).
Proof.
boolify_even_odd. now rewrite Z.odd_pred.
Qed.
#[global]
Hint Unfold Zeven Zodd: zarith.
Notation Zeven_bool_succ := Z.even_succ (only parsing).
Notation Zeven_bool_pred := Z.even_pred (only parsing).
Notation Zodd_bool_succ := Z.odd_succ (only parsing).
Notation Zodd_bool_pred := Z.odd_pred (only parsing).
(******************************************************************)
(** * Definition of [Z.quot2], [Z.div2] and properties wrt [Zeven]
and [Zodd] *)
(** Properties of [Z.div2] *)
Lemma Zdiv2_odd_eqn n : n = 2*(Z.div2 n) + if Z.odd n then 1 else 0.
Proof (Z.div2_odd n).
Lemma Zeven_div2 n : Zeven n -> n = 2 * Z.div2 n.
Proof.
boolify_even_odd. rewrite <- Z.negb_odd, Bool.negb_true_iff.
intros Hn. rewrite (Zdiv2_odd_eqn n) at 1. now rewrite Hn, Z.add_0_r.
Qed.
Lemma Zodd_div2 n : Zodd n -> n = 2 * Z.div2 n + 1.
Proof.
boolify_even_odd.
intros Hn. rewrite (Zdiv2_odd_eqn n) at 1. now rewrite Hn.
Qed.
(** Properties of [Z.quot2] *)
(** TODO: move to Numbers someday *)
Lemma Zquot2_odd_eqn n : n = 2*(Z.quot2 n) + if Z.odd n then Z.sgn n else 0.
Proof.
now destruct n as [ |[p|p| ]|[p|p| ]].
Qed.
Lemma Zeven_quot2 n : Zeven n -> n = 2 * Z.quot2 n.
Proof.
intros Hn. apply Zeven_bool_iff in Hn.
rewrite (Zquot2_odd_eqn n) at 1.
now rewrite Zodd_even_bool, Hn, Z.add_0_r.
Qed.
Lemma Zodd_quot2 n : n >= 0 -> Zodd n -> n = 2 * Z.quot2 n + 1.
Proof.
intros Hn Hn'. apply Zodd_bool_iff in Hn'.
rewrite (Zquot2_odd_eqn n) at 1. rewrite Hn'. f_equal.
destruct n; (now destruct Hn) || easy.
Qed.
Lemma Zodd_quot2_neg n : n <= 0 -> Zodd n -> n = 2 * Z.quot2 n - 1.
Proof.
intros Hn Hn'. apply Zodd_bool_iff in Hn'.
rewrite (Zquot2_odd_eqn n) at 1; rewrite Hn'. unfold Z.sub. f_equal.
destruct n; (now destruct Hn) || easy.
Qed.
Lemma Zquot2_opp n : Z.quot2 (-n) = - Z.quot2 n.
Proof.
now destruct n as [ |[p|p| ]|[p|p| ]].
Qed.
Lemma Zquot2_quot n : Z.quot2 n = n ÷ 2.
Proof.
assert (AUX : forall m, 0 < m -> Z.quot2 m = m ÷ 2).
{
intros m Hm.
apply Z.quot_unique with (if Z.odd m then Z.sgn m else 0).
now apply Z.lt_le_incl.
rewrite Z.sgn_pos by trivial.
destruct (Z.odd m); now split.
apply Zquot2_odd_eqn.
}
destruct (Z.lt_trichotomy 0 n) as [POS|[NUL|NEG]].
- now apply AUX.
- now subst.
- apply Z.opp_inj. rewrite <- Z.quot_opp_l, <- Zquot2_opp.
apply AUX. now destruct n. easy.
Qed.
(** More properties of parity *)
Lemma Z_modulo_2 n : {y | n = 2 * y} + {y | n = 2 * y + 1}.
Proof.
destruct (Zeven_odd_dec n) as [Hn|Hn].
- left. exists (Z.div2 n). exact (Zeven_div2 n Hn).
- right. exists (Z.div2 n). exact (Zodd_div2 n Hn).
Qed.
Lemma Zsplit2 n :
{p : Z * Z | let (x1, x2) := p in n = x1 + x2 /\ (x1 = x2 \/ x2 = x1 + 1)}.
Proof.
destruct (Z_modulo_2 n) as [(y,Hy)|(y,Hy)];
rewrite <- Z.add_diag in Hy.
- exists (y, y). split. assumption. now left.
- exists (y, y + 1). split. now rewrite Z.add_assoc. now right.
Qed.
Theorem Zeven_ex n : Zeven n -> exists m, n = 2 * m.
Proof.
exists (Z.div2 n); apply Zeven_div2; auto.
Qed.
Theorem Zodd_ex n : Zodd n -> exists m, n = 2 * m + 1.
Proof.
exists (Z.div2 n); apply Zodd_div2; auto.
Qed.
Theorem Zeven_2p p : Zeven (2 * p).
Proof.
now destruct p.
Qed.
Theorem Zodd_2p_plus_1 p : Zodd (2 * p + 1).
Proof.
destruct p as [|p|p]; now try destruct p.
Qed.
Theorem Zeven_plus_Zodd a b : Zeven a -> Zodd b -> Zodd (a + b).
Proof.
boolify_even_odd. rewrite <- Z.negb_odd, Bool.negb_true_iff.
intros Ha Hb. now rewrite Z.odd_add, Ha, Hb.
Qed.
Theorem Zeven_plus_Zeven a b : Zeven a -> Zeven b -> Zeven (a + b).
Proof.
boolify_even_odd. intros Ha Hb. now rewrite Z.even_add, Ha, Hb.
Qed.
Theorem Zodd_plus_Zeven a b : Zodd a -> Zeven b -> Zodd (a + b).
Proof.
intros. rewrite Z.add_comm. now apply Zeven_plus_Zodd.
Qed.
Theorem Zodd_plus_Zodd a b : Zodd a -> Zodd b -> Zeven (a + b).
Proof.
boolify_even_odd. rewrite <- 2 Z.negb_even, 2 Bool.negb_true_iff.
intros Ha Hb. now rewrite Z.even_add, Ha, Hb.
Qed.
Theorem Zeven_mult_Zeven_l a b : Zeven a -> Zeven (a * b).
Proof.
boolify_even_odd. intros Ha. now rewrite Z.even_mul, Ha.
Qed.
Theorem Zeven_mult_Zeven_r a b : Zeven b -> Zeven (a * b).
Proof.
intros. rewrite Z.mul_comm. now apply Zeven_mult_Zeven_l.
Qed.
Theorem Zodd_mult_Zodd a b : Zodd a -> Zodd b -> Zodd (a * b).
Proof.
boolify_even_odd. intros Ha Hb. now rewrite Z.odd_mul, Ha, Hb.
Qed.
|