src/HOL/Real/RealInt.ML
author paulson
Thu, 19 Aug 1999 18:36:41 +0200
changeset 7292 dff3470c5c62
child 8856 435187ffc64e
permissions -rw-r--r--
real literals using binary arithmetic
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7292
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     1
(*  Title:       RealInt.ML
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     2
    ID:         $Id$
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     3
    Author:      Jacques D. Fleuriot
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     4
    Copyright:   1999 University of Edinburgh
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     5
    Description: Embedding the integers in the reals
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     6
*)
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     7
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     8
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
     9
Goalw [congruent_def]
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    10
  "congruent intrel (%p. split (%i j. realrel ^^ \
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    11
\  {(preal_of_prat (prat_of_pnat (pnat_of_nat i)), \
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    12
\    preal_of_prat (prat_of_pnat (pnat_of_nat j)))}) p)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    13
by (auto_tac (claset(),simpset() addsimps [pnat_of_nat_add,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    14
    prat_of_pnat_add RS sym,preal_of_prat_add RS sym]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    15
qed "real_of_int_congruent";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    16
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    17
val real_of_int_ize = RSLIST [equiv_intrel, real_of_int_congruent];
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    18
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    19
Goalw [real_of_int_def]
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    20
   "real_of_int (Abs_Integ (intrel ^^ {(i, j)})) = \
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    21
\     Abs_real(realrel ^^ \
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    22
\       {(preal_of_prat (prat_of_pnat (pnat_of_nat i)), \
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    23
\         preal_of_prat (prat_of_pnat (pnat_of_nat j)))})";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    24
by (res_inst_tac [("f","Abs_real")] arg_cong 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    25
by (simp_tac (simpset() addsimps 
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    26
   [realrel_in_real RS Abs_real_inverse,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    27
    real_of_int_ize UN_equiv_class]) 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    28
qed "real_of_int";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    29
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    30
Goal "inj(real_of_int)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    31
by (rtac injI 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    32
by (res_inst_tac [("z","x")] eq_Abs_Integ 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    33
by (res_inst_tac [("z","y")] eq_Abs_Integ 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    34
by (auto_tac (claset() addSDs [inj_preal_of_prat RS injD,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    35
    inj_prat_of_pnat RS injD,inj_pnat_of_nat RS injD],
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    36
    simpset() addsimps [real_of_int,preal_of_prat_add RS sym,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    37
     prat_of_pnat_add RS sym,pnat_of_nat_add]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    38
qed "inj_real_of_int";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    39
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    40
Goalw [int_def,real_zero_def] "real_of_int (int 0) = 0r";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    41
by (simp_tac (simpset() addsimps [real_of_int, preal_add_commute]) 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    42
qed "real_of_int_zero";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    43
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    44
Goalw [int_def,real_one_def] "real_of_int (int 1) = 1r";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    45
by (auto_tac (claset(),
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    46
	      simpset() addsimps [real_of_int,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    47
				  preal_of_prat_add RS sym,pnat_two_eq,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    48
			       prat_of_pnat_add RS sym,pnat_one_iff RS sym]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    49
qed "real_of_int_one";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    50
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    51
Goal "real_of_int x + real_of_int y = real_of_int (x + y)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    52
by (res_inst_tac [("z","x")] eq_Abs_Integ 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    53
by (res_inst_tac [("z","y")] eq_Abs_Integ 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    54
by (auto_tac (claset(),simpset() addsimps [real_of_int,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    55
    preal_of_prat_add RS sym,prat_of_pnat_add RS sym,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    56
    zadd,real_add,pnat_of_nat_add] @ pnat_add_ac));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    57
qed "real_of_int_add";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    58
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    59
Goal "-real_of_int x = real_of_int (-x)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    60
by (res_inst_tac [("z","x")] eq_Abs_Integ 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    61
by (auto_tac (claset(),simpset() addsimps [real_of_int,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    62
    real_minus,zminus]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    63
qed "real_of_int_minus";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    64
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    65
Goalw [zdiff_def,real_diff_def]
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    66
  "real_of_int x - real_of_int y = real_of_int (x - y)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    67
by (simp_tac (simpset() addsimps [real_of_int_add,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    68
    real_of_int_minus]) 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    69
qed "real_of_int_diff";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    70
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    71
Goal "real_of_int x * real_of_int y = real_of_int (x * y)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    72
by (res_inst_tac [("z","x")] eq_Abs_Integ 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    73
by (res_inst_tac [("z","y")] eq_Abs_Integ 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    74
by (auto_tac (claset(),simpset() addsimps [real_of_int,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    75
    real_mult,zmult,preal_of_prat_mult RS sym,pnat_of_nat_mult,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    76
    prat_of_pnat_mult RS sym,preal_of_prat_add RS sym,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    77
    prat_of_pnat_add RS sym,pnat_of_nat_add] @ mult_ac @add_ac 
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    78
    @ pnat_add_ac));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    79
qed "real_of_int_mult";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    80
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    81
Goal "real_of_int (int (Suc n)) = real_of_int (int n) + 1r";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    82
by (simp_tac (simpset() addsimps [real_of_int_one RS sym,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    83
				  real_of_int_add,zadd_int]) 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    84
qed "real_of_int_Suc";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    85
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    86
(* relating two of the embeddings *)
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    87
Goal "real_of_int (int n) = real_of_nat n";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    88
by (induct_tac "n" 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    89
by (auto_tac (claset(),simpset() addsimps [real_of_int_zero,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    90
    real_of_nat_zero,real_of_int_Suc,real_of_nat_Suc]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    91
qed "real_of_int_real_of_nat";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    92
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    93
Goal "~neg z ==> real_of_nat (nat z) = real_of_int z";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    94
by (asm_simp_tac (simpset() addsimps [not_neg_nat,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    95
    real_of_int_real_of_nat RS sym]) 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    96
qed "real_of_nat_real_of_int";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    97
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    98
(* put with other properties of real_of_nat? *)
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
    99
Goal "neg z ==> real_of_nat (nat z) = 0r";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   100
by (asm_simp_tac (simpset() addsimps [neg_nat,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   101
    real_of_nat_zero]) 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   102
qed "real_of_nat_neg_int";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   103
Addsimps [real_of_nat_neg_int];
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   104
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   105
Goal "(real_of_int x = 0r) = (x = int 0)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   106
by (auto_tac (claset() addIs [inj_real_of_int RS injD],
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   107
    simpset() addsimps [real_of_int_zero]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   108
qed "real_of_int_zero_cancel";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   109
Addsimps [real_of_int_zero_cancel];
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   110
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   111
Goal "real_of_int x < real_of_int y ==> x < y";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   112
by (rtac ccontr 1 THEN dtac (linorder_not_less RS iffD1) 1);
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   113
by (auto_tac (claset(),
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   114
	      simpset() addsimps [zle_iff_zadd, real_of_int_add RS sym,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   115
				  real_of_int_real_of_nat,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   116
				  real_of_nat_zero RS sym]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   117
qed "real_of_int_less_cancel";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   118
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   119
Goal "x < y ==> (real_of_int x < real_of_int y)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   120
by (auto_tac (claset(),
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   121
	      simpset() addsimps [zless_iff_Suc_zadd, real_of_int_add RS sym,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   122
				  real_of_int_real_of_nat,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   123
				  real_of_nat_Suc]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   124
by (simp_tac (simpset() addsimps [real_of_nat_one RS
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   125
    sym,real_of_nat_zero RS sym,real_of_nat_add]) 1); 
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   126
qed "real_of_int_less_mono";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   127
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   128
Goal "(real_of_int x < real_of_int y) = (x < y)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   129
by (auto_tac (claset() addIs [real_of_int_less_cancel,
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   130
			      real_of_int_less_mono],
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   131
	      simpset()));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   132
qed "real_of_int_less_iff";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   133
Addsimps [real_of_int_less_iff];
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   134
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   135
Goal "(real_of_int x <= real_of_int y) = (x <= y)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   136
by (auto_tac (claset(),
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   137
	      simpset() addsimps [real_le_def, zle_def]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   138
qed "real_of_int_le_iff";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   139
Addsimps [real_of_int_le_iff];
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   140
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   141
Goal "(real_of_int x = real_of_int y) = (x = y)";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   142
by (auto_tac (claset() addSIs [order_antisym],
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   143
	      simpset() addsimps [real_of_int_le_iff RS iffD1]));
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   144
qed "real_of_int_eq_iff";
dff3470c5c62 real literals using binary arithmetic
paulson
parents:
diff changeset
   145
Addsimps [real_of_int_eq_iff];