7292
|
1 |
(* Title: HOL/RealBin.ML
|
|
2 |
ID: $Id$
|
|
3 |
Author: Lawrence C Paulson, Cambridge University Computer Laboratory
|
|
4 |
Copyright 1999 University of Cambridge
|
|
5 |
|
|
6 |
Binary arithmetic for the reals (integer literals only)
|
|
7 |
*)
|
|
8 |
|
|
9 |
(** real_of_int (coercion from int to real) **)
|
|
10 |
|
|
11 |
Goal "real_of_int (number_of w) = number_of w";
|
|
12 |
by (simp_tac (simpset() addsimps [real_number_of_def]) 1);
|
|
13 |
qed "real_number_of";
|
|
14 |
Addsimps [real_number_of];
|
|
15 |
|
|
16 |
Goalw [real_number_of_def] "0r = #0";
|
|
17 |
by (simp_tac (simpset() addsimps [real_of_int_zero RS sym]) 1);
|
|
18 |
qed "zero_eq_numeral_0";
|
|
19 |
|
|
20 |
Goalw [real_number_of_def] "1r = #1";
|
|
21 |
by (simp_tac (simpset() addsimps [real_of_int_one RS sym]) 1);
|
|
22 |
qed "one_eq_numeral_1";
|
|
23 |
|
|
24 |
(** Addition **)
|
|
25 |
|
|
26 |
Goal "(number_of v :: real) + number_of v' = number_of (bin_add v v')";
|
|
27 |
by (simp_tac
|
|
28 |
(simpset_of Int.thy addsimps [real_number_of_def,
|
|
29 |
real_of_int_add, number_of_add]) 1);
|
|
30 |
qed "add_real_number_of";
|
|
31 |
|
|
32 |
Addsimps [add_real_number_of];
|
|
33 |
|
|
34 |
|
|
35 |
(** Subtraction **)
|
|
36 |
|
|
37 |
Goalw [real_number_of_def] "- (number_of w :: real) = number_of (bin_minus w)";
|
|
38 |
by (simp_tac
|
|
39 |
(simpset_of Int.thy addsimps [number_of_minus, real_of_int_minus]) 1);
|
|
40 |
qed "minus_real_number_of";
|
|
41 |
|
|
42 |
Goalw [real_number_of_def]
|
|
43 |
"(number_of v :: real) - number_of w = number_of (bin_add v (bin_minus w))";
|
|
44 |
by (simp_tac
|
|
45 |
(simpset_of Int.thy addsimps [diff_number_of_eq, real_of_int_diff]) 1);
|
|
46 |
qed "diff_real_number_of";
|
|
47 |
|
|
48 |
Addsimps [minus_real_number_of, diff_real_number_of];
|
|
49 |
|
|
50 |
|
|
51 |
(** Multiplication **)
|
|
52 |
|
|
53 |
Goal "(number_of v :: real) * number_of v' = number_of (bin_mult v v')";
|
|
54 |
by (simp_tac
|
|
55 |
(simpset_of Int.thy addsimps [real_number_of_def,
|
|
56 |
real_of_int_mult, number_of_mult]) 1);
|
|
57 |
qed "mult_real_number_of";
|
|
58 |
|
|
59 |
Addsimps [mult_real_number_of];
|
|
60 |
|
|
61 |
|
|
62 |
(*** Comparisons ***)
|
|
63 |
|
|
64 |
(** Equals (=) **)
|
|
65 |
|
|
66 |
Goal "((number_of v :: real) = number_of v') = \
|
|
67 |
\ iszero (number_of (bin_add v (bin_minus v')))";
|
|
68 |
by (simp_tac
|
|
69 |
(simpset_of Int.thy addsimps [real_number_of_def,
|
|
70 |
real_of_int_eq_iff, eq_number_of_eq]) 1);
|
|
71 |
qed "eq_real_number_of";
|
|
72 |
|
|
73 |
Addsimps [eq_real_number_of];
|
|
74 |
|
|
75 |
(** Less-than (<) **)
|
|
76 |
|
|
77 |
(*"neg" is used in rewrite rules for binary comparisons*)
|
|
78 |
Goal "((number_of v :: real) < number_of v') = \
|
|
79 |
\ neg (number_of (bin_add v (bin_minus v')))";
|
|
80 |
by (simp_tac
|
|
81 |
(simpset_of Int.thy addsimps [real_number_of_def, real_of_int_less_iff,
|
|
82 |
less_number_of_eq_neg]) 1);
|
|
83 |
qed "less_real_number_of";
|
|
84 |
|
|
85 |
Addsimps [less_real_number_of];
|
|
86 |
|
|
87 |
|
|
88 |
(** Less-than-or-equals (<=) **)
|
|
89 |
|
|
90 |
Goal "(number_of x <= (number_of y::real)) = \
|
|
91 |
\ (~ number_of y < (number_of x::real))";
|
|
92 |
by (rtac (linorder_not_less RS sym) 1);
|
|
93 |
qed "le_real_number_of_eq_not_less";
|
|
94 |
|
|
95 |
Addsimps [le_real_number_of_eq_not_less];
|
|
96 |
|
|
97 |
|
|
98 |
(** rabs (absolute value) **)
|
|
99 |
|
|
100 |
Goalw [rabs_def]
|
|
101 |
"rabs (number_of v :: real) = \
|
|
102 |
\ (if neg (number_of v) then number_of (bin_minus v) \
|
|
103 |
\ else number_of v)";
|
|
104 |
by (simp_tac
|
|
105 |
(simpset_of Int.thy addsimps
|
|
106 |
bin_arith_simps@
|
|
107 |
[minus_real_number_of, zero_eq_numeral_0, le_real_number_of_eq_not_less,
|
|
108 |
less_real_number_of, real_of_int_le_iff]) 1);
|
|
109 |
qed "rabs_nat_number_of";
|
|
110 |
|
|
111 |
Addsimps [rabs_nat_number_of];
|
|
112 |
|
|
113 |
|
|
114 |
(*** New versions of existing theorems involving 0r, 1r ***)
|
|
115 |
|
|
116 |
Goal "- #1 = (#-1::real)";
|
|
117 |
by (Simp_tac 1);
|
|
118 |
qed "minus_numeral_one";
|
|
119 |
|
|
120 |
|
|
121 |
(*Maps 0r to #0 and 1r to #1 and -1r to #-1*)
|
|
122 |
val real_numeral_ss =
|
|
123 |
HOL_ss addsimps [zero_eq_numeral_0, one_eq_numeral_1,
|
|
124 |
minus_numeral_one];
|
|
125 |
|
|
126 |
fun rename_numerals thy th = simplify real_numeral_ss (change_theory thy th);
|
|
127 |
|
|
128 |
|
|
129 |
fun inst x t = read_instantiate_sg (sign_of RealBin.thy) [(x,t)];
|
|
130 |
|
|
131 |
|
|
132 |
(*Now insert some identities previously stated for 0r and 1r*)
|
|
133 |
|
|
134 |
(** RealDef & Real **)
|
|
135 |
|
|
136 |
Addsimps (map (rename_numerals thy)
|
|
137 |
[real_minus_zero, real_minus_zero_iff,
|
|
138 |
real_add_zero_left, real_add_zero_right,
|
|
139 |
real_diff_0, real_diff_0_right,
|
|
140 |
real_mult_0_right, real_mult_0, real_mult_1_right, real_mult_1,
|
|
141 |
real_mult_minus_1_right, real_mult_minus_1, real_rinv_1,
|
|
142 |
real_minus_zero_less_iff]);
|
|
143 |
|
|
144 |
(** RealPow **)
|
|
145 |
|
|
146 |
Addsimps (map (rename_numerals thy)
|
|
147 |
[realpow_zero, realpow_two_le, realpow_zero_le,
|
|
148 |
realpow_eq_one, rabs_minus_realpow_one, rabs_realpow_minus_one,
|
|
149 |
realpow_minus_one, realpow_minus_one2, realpow_minus_one_odd]);
|
|
150 |
|
|
151 |
(*Perhaps add some theorems that aren't in the default simpset, as
|
|
152 |
done in Integ/NatBin.ML*)
|
|
153 |
|