summaryrefslogtreecommitdiff
path: root/theories/Numbers/Integer/Abstract/ZBase.v
blob: 0f71f2cc505cf3bf5f1067e1c1e40969f3f6825d (plain)
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
(************************************************************************)
(*  v      *   The Coq Proof Assistant  /  The Coq Development Team     *)
(* <O___,, * CNRS-Ecole Polytechnique-INRIA Futurs-Universite Paris Sud *)
(*   \VV/  **************************************************************)
(*    //   *      This file is distributed under the terms of the       *)
(*         *       GNU Lesser General Public License Version 2.1        *)
(************************************************************************)
(*                      Evgeny Makarov, INRIA, 2007                     *)
(************************************************************************)

(*i $Id: ZBase.v 11674 2008-12-12 19:48:40Z letouzey $ i*)

Require Export Decidable.
Require Export ZAxioms.
Require Import NZMulOrder.

Module ZBasePropFunct (Import ZAxiomsMod : ZAxiomsSig).

(* Note: writing "Export" instead of "Import" on the previous line leads to
some warnings about hiding repeated declarations and results in the loss of
notations in Zadd and later *)

Open Local Scope IntScope.

Module Export NZMulOrderMod := NZMulOrderPropFunct NZOrdAxiomsMod.

Theorem Zsucc_wd : forall n1 n2 : Z, n1 == n2 -> S n1 == S n2.
Proof NZsucc_wd.

Theorem Zpred_wd : forall n1 n2 : Z, n1 == n2 -> P n1 == P n2.
Proof NZpred_wd.

Theorem Zpred_succ : forall n : Z, P (S n) == n.
Proof NZpred_succ.

Theorem Zeq_refl : forall n : Z, n == n.
Proof (proj1 NZeq_equiv).

Theorem Zeq_sym : forall n m : Z, n == m -> m == n.
Proof (proj2 (proj2 NZeq_equiv)).

Theorem Zeq_trans : forall n m p : Z, n == m -> m == p -> n == p.
Proof (proj1 (proj2 NZeq_equiv)).

Theorem Zneq_sym : forall n m : Z, n ~= m -> m ~= n.
Proof NZneq_sym.

Theorem Zsucc_inj : forall n1 n2 : Z, S n1 == S n2 -> n1 == n2.
Proof NZsucc_inj.

Theorem Zsucc_inj_wd : forall n1 n2 : Z, S n1 == S n2 <-> n1 == n2.
Proof NZsucc_inj_wd.

Theorem Zsucc_inj_wd_neg : forall n m : Z, S n ~= S m <-> n ~= m.
Proof NZsucc_inj_wd_neg.

(* Decidability and stability of equality was proved only in NZOrder, but
since it does not mention order, we'll put it here *)

Theorem Zeq_dec : forall n m : Z, decidable (n == m).
Proof NZeq_dec.

Theorem Zeq_dne : forall n m : Z, ~ ~ n == m <-> n == m.
Proof NZeq_dne.

Theorem Zcentral_induction :
forall A : Z -> Prop, predicate_wd Zeq A ->
  forall z : Z, A z ->
    (forall n : Z, A n <-> A (S n)) ->
      forall n : Z, A n.
Proof NZcentral_induction.

(* Theorems that are true for integers but not for natural numbers *)

Theorem Zpred_inj : forall n m : Z, P n == P m -> n == m.
Proof.
intros n m H. apply NZsucc_wd in H. now do 2 rewrite Zsucc_pred in H.
Qed.

Theorem Zpred_inj_wd : forall n1 n2 : Z, P n1 == P n2 <-> n1 == n2.
Proof.
intros n1 n2; split; [apply Zpred_inj | apply NZpred_wd].
Qed.

End ZBasePropFunct.