aboutsummaryrefslogtreecommitdiffhomepage
path: root/theories/Numbers/DecimalZ.v
blob: 92d66ecfb8b92c67feae997b4b81a954747a4586 (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
(************************************************************************)
(*  v      *   The Coq Proof Assistant  /  The Coq Development Team     *)
(* <O___,, *   INRIA - CNRS - LIX - LRI - PPS - Copyright 1999-2016     *)
(*   \VV/  **************************************************************)
(*    //   *      This file is distributed under the terms of the       *)
(*         *       GNU Lesser General Public License Version 2.1        *)
(************************************************************************)

(** * DecimalZ

    Proofs that conversions between decimal numbers and [Z]
    are bijections. *)

Require Import Decimal DecimalFacts DecimalPos DecimalN ZArith.

Lemma of_to (z:Z) : Z.of_int (Z.to_int z) = z.
Proof.
 destruct z; simpl.
 - trivial.
 - unfold Z.of_uint. rewrite DecimalPos.Unsigned.of_to. now destruct p.
 - unfold Z.of_uint. rewrite DecimalPos.Unsigned.of_to. destruct p; auto.
Qed.

Lemma to_of (d:int) : Z.to_int (Z.of_int d) = norm d.
Proof.
 destruct d; simpl; unfold Z.to_int, Z.of_uint.
 - rewrite <- (DecimalN.Unsigned.to_of d). unfold N.of_uint.
   now destruct (Pos.of_uint d).
 - destruct (Pos.of_uint d) eqn:Hd; simpl; f_equal.
   + generalize (DecimalPos.Unsigned.to_of d). rewrite Hd. simpl.
     intros H. symmetry in H. apply unorm_0 in H. now rewrite H.
   + assert (Hp := DecimalPos.Unsigned.to_of d). rewrite Hd in Hp. simpl in *.
     rewrite Hp. unfold unorm in *.
     destruct (nzhead d); trivial.
     generalize (DecimalPos.Unsigned.of_to p). now rewrite Hp.
Qed.

(** Some consequences *)

Lemma to_int_inj n n' : Z.to_int n = Z.to_int n' -> n = n'.
Proof.
 intro EQ.
 now rewrite <- (of_to n), <- (of_to n'), EQ.
Qed.

Lemma to_int_surj d : exists n, Z.to_int n = norm d.
Proof.
 exists (Z.of_int d). apply to_of.
Qed.

Lemma of_int_norm d : Z.of_int (norm d) = Z.of_int d.
Proof.
 unfold Z.of_int, Z.of_uint.
 destruct d.
 - simpl. now rewrite DecimalPos.Unsigned.of_uint_norm.
 - simpl. destruct (nzhead d) eqn:H;
   [ induction d; simpl; auto; discriminate |
     destruct (nzhead_nonzero _ _ H) | .. ];
   f_equal; f_equal; apply DecimalPos.Unsigned.of_iff;
   unfold unorm; now rewrite H.
Qed.

Lemma of_inj d d' :
 Z.of_int d = Z.of_int d' -> norm d = norm d'.
Proof.
 intros. rewrite <- !to_of. now f_equal.
Qed.

Lemma of_iff d d' : Z.of_int d = Z.of_int d' <-> norm d = norm d'.
Proof.
 split. apply of_inj. intros E. rewrite <- of_int_norm, E.
 apply of_int_norm.
Qed.