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 289 290 291 292 293 294 295
|
(************************************************************************)
(* * The Rocq Prover / The Rocq 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) *)
(************************************************************************)
(* Evgeny Makarov, INRIA, 2007 *)
(************************************************************************)
From Stdlib Require Export ZBase.
Module ZAddProp (Import Z : ZAxiomsMiniSig').
Include ZBaseProp Z.
(** Theorems that are either not valid on N or have different proofs
on N and Z *)
Global Hint Rewrite opp_0 : nz.
Theorem add_pred_l n m : P n + m == P (n + m).
Proof.
rewrite <- (succ_pred n) at 2.
now rewrite add_succ_l, pred_succ.
Qed.
Theorem add_pred_r n m : n + P m == P (n + m).
Proof.
rewrite 2 (add_comm n); apply add_pred_l.
Qed.
Theorem add_opp_r n m : n + (- m) == n - m.
Proof.
nzinduct m.
- now nzsimpl.
- intro m. rewrite opp_succ, sub_succ_r, add_pred_r. now rewrite pred_inj_wd.
Qed.
Theorem sub_0_l n : 0 - n == - n.
Proof.
rewrite <- add_opp_r; now rewrite add_0_l.
Qed.
Theorem sub_succ_l n m : S n - m == S (n - m).
Proof.
rewrite <- 2 add_opp_r; now rewrite add_succ_l.
Qed.
Theorem sub_pred_l n m : P n - m == P (n - m).
Proof.
rewrite <- (succ_pred n) at 2.
rewrite sub_succ_l; now rewrite pred_succ.
Qed.
Theorem sub_pred_r n m : n - (P m) == S (n - m).
Proof.
rewrite <- (succ_pred m) at 2.
rewrite sub_succ_r; now rewrite succ_pred.
Qed.
Theorem opp_pred n : - (P n) == S (- n).
Proof.
rewrite <- (succ_pred n) at 2.
rewrite opp_succ. now rewrite succ_pred.
Qed.
Theorem sub_diag n : n - n == 0.
Proof.
nzinduct n.
- now nzsimpl.
- intro n. rewrite sub_succ_r, sub_succ_l; now rewrite pred_succ.
Qed.
Theorem add_opp_diag_l n : - n + n == 0.
Proof.
now rewrite add_comm, add_opp_r, sub_diag.
Qed.
Theorem add_opp_diag_r n : n + (- n) == 0.
Proof.
rewrite add_comm; apply add_opp_diag_l.
Qed.
Theorem add_opp_l n m : - m + n == n - m.
Proof.
rewrite <- add_opp_r; now rewrite add_comm.
Qed.
Theorem add_sub_assoc n m p : n + (m - p) == (n + m) - p.
Proof.
rewrite <- 2 add_opp_r; now rewrite add_assoc.
Qed.
Theorem opp_involutive n : - (- n) == n.
Proof.
nzinduct n.
- now nzsimpl.
- intro n. rewrite opp_succ, opp_pred. now rewrite succ_inj_wd.
Qed.
Theorem opp_add_distr n m : - (n + m) == - n + (- m).
Proof.
nzinduct n.
- now nzsimpl.
- intro n. rewrite add_succ_l; do 2 rewrite opp_succ; rewrite add_pred_l.
now rewrite pred_inj_wd.
Qed.
Theorem opp_sub_distr n m : - (n - m) == - n + m.
Proof.
rewrite <- add_opp_r, opp_add_distr.
now rewrite opp_involutive.
Qed.
Theorem opp_inj n m : - n == - m -> n == m.
Proof.
intros H. apply opp_wd in H. now rewrite 2 opp_involutive in H.
Qed.
Theorem opp_inj_wd n m : - n == - m <-> n == m.
Proof.
split; [apply opp_inj | intros; now f_equiv].
Qed.
Theorem eq_opp_l n m : - n == m <-> n == - m.
Proof.
now rewrite <- (opp_inj_wd (- n) m), opp_involutive.
Qed.
Theorem eq_opp_r n m : n == - m <-> - n == m.
Proof.
symmetry; apply eq_opp_l.
Qed.
Theorem sub_add_distr n m p : n - (m + p) == (n - m) - p.
Proof.
rewrite <- add_opp_r, opp_add_distr, add_assoc.
now rewrite 2 add_opp_r.
Qed.
Theorem sub_sub_distr n m p : n - (m - p) == (n - m) + p.
Proof.
rewrite <- add_opp_r, opp_sub_distr, add_assoc.
now rewrite add_opp_r.
Qed.
Theorem sub_opp_l n m : - n - m == - m - n.
Proof.
rewrite <- 2 add_opp_r. now rewrite add_comm.
Qed.
Theorem sub_opp_r n m : n - (- m) == n + m.
Proof.
rewrite <- add_opp_r; now rewrite opp_involutive.
Qed.
Theorem add_sub_swap n m p : n + m - p == n - p + m.
Proof.
rewrite <- add_sub_assoc, <- (add_opp_r n p), <- add_assoc.
now rewrite add_opp_l.
Qed.
Theorem sub_cancel_l n m p : n - m == n - p <-> m == p.
Proof.
rewrite <- (add_cancel_l (n - m) (n - p) (- n)).
rewrite 2 add_sub_assoc. rewrite add_opp_diag_l; rewrite 2 sub_0_l.
apply opp_inj_wd.
Qed.
Theorem sub_cancel_r n m p : n - p == m - p <-> n == m.
Proof.
stepl (n - p + p == m - p + p) by apply add_cancel_r.
now do 2 rewrite <- sub_sub_distr, sub_diag, sub_0_r.
Qed.
(** The next several theorems are devoted to moving terms from one
side of an equation to the other. The name contains the operation
in the original equation ([add] or [sub]) and the indication
whether the left or right term is moved. *)
Theorem add_move_l n m p : n + m == p <-> m == p - n.
Proof.
stepl (n + m - n == p - n) by apply sub_cancel_r.
now rewrite add_comm, <- add_sub_assoc, sub_diag, add_0_r.
Qed.
Theorem add_move_r n m p : n + m == p <-> n == p - m.
Proof.
rewrite add_comm; now apply add_move_l.
Qed.
(** The two theorems above do not allow rewriting subformulas of the
form [n - m == p] to [n == p + m] since subtraction is in the
right-hand side of the equation. Hence the following two
theorems. *)
Theorem sub_move_l n m p : n - m == p <-> - m == p - n.
Proof.
rewrite <- (add_opp_r n m); apply add_move_l.
Qed.
Theorem sub_move_r n m p : n - m == p <-> n == p + m.
Proof.
rewrite <- (add_opp_r n m). now rewrite add_move_r, sub_opp_r.
Qed.
Theorem add_move_0_l n m : n + m == 0 <-> m == - n.
Proof.
now rewrite add_move_l, sub_0_l.
Qed.
Theorem add_move_0_r n m : n + m == 0 <-> n == - m.
Proof.
now rewrite add_move_r, sub_0_l.
Qed.
Theorem sub_move_0_l n m : n - m == 0 <-> - m == - n.
Proof.
now rewrite sub_move_l, sub_0_l.
Qed.
Theorem sub_move_0_r n m : n - m == 0 <-> n == m.
Proof.
now rewrite sub_move_r, add_0_l.
Qed.
(** The following section is devoted to cancellation of like
terms. The name includes the first operator and the position of
the term being canceled. *)
Theorem add_simpl_l n m : n + m - n == m.
Proof.
now rewrite add_sub_swap, sub_diag, add_0_l.
Qed.
Theorem add_simpl_r n m : n + m - m == n.
Proof.
now rewrite <- add_sub_assoc, sub_diag, add_0_r.
Qed.
Theorem sub_simpl_l n m : - n - m + n == - m.
Proof.
now rewrite <- add_sub_swap, add_opp_diag_l, sub_0_l.
Qed.
Theorem sub_simpl_r n m : n - m + m == n.
Proof.
now rewrite <- sub_sub_distr, sub_diag, sub_0_r.
Qed.
Theorem sub_add n m : m - n + n == m.
Proof.
now rewrite <- add_sub_swap, add_simpl_r.
Qed.
(** Now we have two sums or differences; the name includes the two
operators and the position of the terms being canceled *)
Theorem add_add_simpl_l_l n m p : (n + m) - (n + p) == m - p.
Proof.
now rewrite (add_comm n m), <- add_sub_assoc,
sub_add_distr, sub_diag, sub_0_l, add_opp_r.
Qed.
Theorem add_add_simpl_l_r n m p : (n + m) - (p + n) == m - p.
Proof.
rewrite (add_comm p n); apply add_add_simpl_l_l.
Qed.
Theorem add_add_simpl_r_l n m p : (n + m) - (m + p) == n - p.
Proof.
rewrite (add_comm n m); apply add_add_simpl_l_l.
Qed.
Theorem add_add_simpl_r_r n m p : (n + m) - (p + m) == n - p.
Proof.
rewrite (add_comm p m); apply add_add_simpl_r_l.
Qed.
Theorem sub_add_simpl_r_l n m p : (n - m) + (m + p) == n + p.
Proof.
now rewrite <- sub_sub_distr, sub_add_distr, sub_diag,
sub_0_l, sub_opp_r.
Qed.
Theorem sub_add_simpl_r_r n m p : (n - m) + (p + m) == n + p.
Proof.
rewrite (add_comm p m); apply sub_add_simpl_r_l.
Qed.
(** Of course, there are many other variants *)
End ZAddProp.
|