changeset 17652 | b1ef33ebfa17 |
parent 17644 | bd59bfd4bf37 |
child 20485 | 3078fd2eec7b |
17651:a6499b0c5a40 | 17652:b1ef33ebfa17 |
---|---|
6 |
6 |
7 consts |
7 consts |
8 DIV2 :: "nat => nat" |
8 DIV2 :: "nat => nat" |
9 |
9 |
10 defs |
10 defs |
11 DIV2_primdef: "DIV2 == %n::nat. n div (2::nat)" |
11 DIV2_primdef: "DIV2 == %n::nat. n div 2" |
12 |
12 |
13 lemma DIV2_def: "ALL n::nat. DIV2 n = n div (2::nat)" |
13 lemma DIV2_def: "ALL n::nat. DIV2 n = n div 2" |
14 by (import bits DIV2_def) |
14 by (import bits DIV2_def) |
15 |
15 |
16 consts |
16 consts |
17 TIMES_2EXP :: "nat => nat => nat" |
17 TIMES_2EXP :: "nat => nat => nat" |
18 |
18 |
19 defs |
19 defs |
20 TIMES_2EXP_primdef: "TIMES_2EXP == %(x::nat) n::nat. n * (2::nat) ^ x" |
20 TIMES_2EXP_primdef: "TIMES_2EXP == %(x::nat) n::nat. n * 2 ^ x" |
21 |
21 |
22 lemma TIMES_2EXP_def: "ALL (x::nat) n::nat. TIMES_2EXP x n = n * (2::nat) ^ x" |
22 lemma TIMES_2EXP_def: "ALL (x::nat) n::nat. TIMES_2EXP x n = n * 2 ^ x" |
23 by (import bits TIMES_2EXP_def) |
23 by (import bits TIMES_2EXP_def) |
24 |
24 |
25 consts |
25 consts |
26 DIV_2EXP :: "nat => nat => nat" |
26 DIV_2EXP :: "nat => nat => nat" |
27 |
27 |
28 defs |
28 defs |
29 DIV_2EXP_primdef: "DIV_2EXP == %(x::nat) n::nat. n div (2::nat) ^ x" |
29 DIV_2EXP_primdef: "DIV_2EXP == %(x::nat) n::nat. n div 2 ^ x" |
30 |
30 |
31 lemma DIV_2EXP_def: "ALL (x::nat) n::nat. DIV_2EXP x n = n div (2::nat) ^ x" |
31 lemma DIV_2EXP_def: "ALL (x::nat) n::nat. DIV_2EXP x n = n div 2 ^ x" |
32 by (import bits DIV_2EXP_def) |
32 by (import bits DIV_2EXP_def) |
33 |
33 |
34 consts |
34 consts |
35 MOD_2EXP :: "nat => nat => nat" |
35 MOD_2EXP :: "nat => nat => nat" |
36 |
36 |
37 defs |
37 defs |
38 MOD_2EXP_primdef: "MOD_2EXP == %(x::nat) n::nat. n mod (2::nat) ^ x" |
38 MOD_2EXP_primdef: "MOD_2EXP == %(x::nat) n::nat. n mod 2 ^ x" |
39 |
39 |
40 lemma MOD_2EXP_def: "ALL (x::nat) n::nat. MOD_2EXP x n = n mod (2::nat) ^ x" |
40 lemma MOD_2EXP_def: "ALL (x::nat) n::nat. MOD_2EXP x n = n mod 2 ^ x" |
41 by (import bits MOD_2EXP_def) |
41 by (import bits MOD_2EXP_def) |
42 |
42 |
43 consts |
43 consts |
44 DIVMOD_2EXP :: "nat => nat => nat * nat" |
44 DIVMOD_2EXP :: "nat => nat => nat * nat" |
45 |
45 |
46 defs |
46 defs |
47 DIVMOD_2EXP_primdef: "DIVMOD_2EXP == %(x::nat) n::nat. (n div (2::nat) ^ x, n mod (2::nat) ^ x)" |
47 DIVMOD_2EXP_primdef: "DIVMOD_2EXP == %(x::nat) n::nat. (n div 2 ^ x, n mod 2 ^ x)" |
48 |
48 |
49 lemma DIVMOD_2EXP_def: "ALL (x::nat) n::nat. |
49 lemma DIVMOD_2EXP_def: "ALL (x::nat) n::nat. DIVMOD_2EXP x n = (n div 2 ^ x, n mod 2 ^ x)" |
50 DIVMOD_2EXP x n = (n div (2::nat) ^ x, n mod (2::nat) ^ x)" |
|
51 by (import bits DIVMOD_2EXP_def) |
50 by (import bits DIVMOD_2EXP_def) |
52 |
51 |
53 consts |
52 consts |
54 SBIT :: "bool => nat => nat" |
53 SBIT :: "bool => nat => nat" |
55 |
54 |
56 defs |
55 defs |
57 SBIT_primdef: "(op ==::(bool => nat => nat) => (bool => nat => nat) => prop) |
56 SBIT_primdef: "SBIT == %(b::bool) n::nat. if b then 2 ^ n else 0" |
58 (SBIT::bool => nat => nat) |
57 |
59 (%(b::bool) n::nat. |
58 lemma SBIT_def: "ALL (b::bool) n::nat. SBIT b n = (if b then 2 ^ n else 0)" |
60 (If::bool => nat => nat => nat) b |
59 by (import bits SBIT_def) |
60 |
|
61 consts |
|
62 BITS :: "nat => nat => nat => nat" |
|
63 |
|
64 defs |
|
65 BITS_primdef: "BITS == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h - l) (DIV_2EXP l n)" |
|
66 |
|
67 lemma BITS_def: "ALL (h::nat) (l::nat) n::nat. |
|
68 BITS h l n = MOD_2EXP (Suc h - l) (DIV_2EXP l n)" |
|
69 by (import bits BITS_def) |
|
70 |
|
71 constdefs |
|
72 bit :: "nat => nat => bool" |
|
73 "bit == %(b::nat) n::nat. BITS b b n = 1" |
|
74 |
|
75 lemma BIT_def: "ALL (b::nat) n::nat. bit b n = (BITS b b n = 1)" |
|
76 by (import bits BIT_def) |
|
77 |
|
78 consts |
|
79 SLICE :: "nat => nat => nat => nat" |
|
80 |
|
81 defs |
|
82 SLICE_primdef: "SLICE == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h) n - MOD_2EXP l n" |
|
83 |
|
84 lemma SLICE_def: "ALL (h::nat) (l::nat) n::nat. |
|
85 SLICE h l n = MOD_2EXP (Suc h) n - MOD_2EXP l n" |
|
86 by (import bits SLICE_def) |
|
87 |
|
88 consts |
|
89 LSBn :: "nat => bool" |
|
90 |
|
91 defs |
|
92 LSBn_primdef: "LSBn == bit 0" |
|
93 |
|
94 lemma LSBn_def: "LSBn = bit 0" |
|
95 by (import bits LSBn_def) |
|
96 |
|
97 consts |
|
98 BITWISE :: "nat => (bool => bool => bool) => nat => nat => nat" |
|
99 |
|
100 specification (BITWISE_primdef: BITWISE) BITWISE_def: "(ALL (oper::bool => bool => bool) (x::nat) y::nat. BITWISE 0 oper x y = 0) & |
|
101 (ALL (n::nat) (oper::bool => bool => bool) (x::nat) y::nat. |
|
102 BITWISE (Suc n) oper x y = |
|
103 BITWISE n oper x y + SBIT (oper (bit n x) (bit n y)) n)" |
|
104 by (import bits BITWISE_def) |
|
105 |
|
106 lemma DIV1: "ALL x::nat. x div 1 = x" |
|
107 by (import bits DIV1) |
|
108 |
|
109 lemma SUC_SUB: "Suc (a::nat) - a = 1" |
|
110 by (import bits SUC_SUB) |
|
111 |
|
112 lemma DIV_MULT_1: "ALL (r::nat) n::nat. r < n --> (n + r) div n = 1" |
|
113 by (import bits DIV_MULT_1) |
|
114 |
|
115 lemma ZERO_LT_TWOEXP: "(All::(nat => bool) => bool) |
|
116 (%n::nat. |
|
117 (op <::nat => nat => bool) (0::nat) |
|
61 ((op ^::nat => nat => nat) |
118 ((op ^::nat => nat => nat) |
62 ((number_of::bin => nat) |
119 ((number_of::bin => nat) |
63 ((op BIT::bin => bit => bin) |
120 ((op BIT::bin => bit => bin) |
64 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) (bit.B1::bit)) |
121 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) (bit.B1::bit)) |
65 (bit.B0::bit))) |
122 (bit.B0::bit))) |
66 n) |
123 n))" |
67 (0::nat))" |
124 by (import bits ZERO_LT_TWOEXP) |
68 |
125 |
69 lemma SBIT_def: "(All::(bool => bool) => bool) |
126 lemma MOD_2EXP_LT: "ALL (n::nat) k::nat. k mod 2 ^ n < 2 ^ n" |
70 (%b::bool. |
127 by (import bits MOD_2EXP_LT) |
128 |
|
129 lemma TWOEXP_DIVISION: "ALL (n::nat) k::nat. k = k div 2 ^ n * 2 ^ n + k mod 2 ^ n" |
|
130 by (import bits TWOEXP_DIVISION) |
|
131 |
|
132 lemma TWOEXP_MONO: "(All::(nat => bool) => bool) |
|
133 (%a::nat. |
|
71 (All::(nat => bool) => bool) |
134 (All::(nat => bool) => bool) |
72 (%n::nat. |
135 (%b::nat. |
73 (op =::nat => nat => bool) ((SBIT::bool => nat => nat) b n) |
136 (op -->::bool => bool => bool) ((op <::nat => nat => bool) a b) |
74 ((If::bool => nat => nat => nat) b |
137 ((op <::nat => nat => bool) |
75 ((op ^::nat => nat => nat) |
138 ((op ^::nat => nat => nat) |
76 ((number_of::bin => nat) |
139 ((number_of::bin => nat) |
77 ((op BIT::bin => bit => bin) |
140 ((op BIT::bin => bit => bin) |
78 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
141 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
79 (bit.B1::bit)) |
142 (bit.B1::bit)) |
80 (bit.B0::bit))) |
143 (bit.B0::bit))) |
81 n) |
144 a) |
82 (0::nat))))" |
145 ((op ^::nat => nat => nat) |
83 by (import bits SBIT_def) |
146 ((number_of::bin => nat) |
84 |
147 ((op BIT::bin => bit => bin) |
85 consts |
148 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
86 BITS :: "nat => nat => nat => nat" |
149 (bit.B1::bit)) |
87 |
150 (bit.B0::bit))) |
88 defs |
151 b))))" |
89 BITS_primdef: "BITS == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h - l) (DIV_2EXP l n)" |
|
90 |
|
91 lemma BITS_def: "ALL (h::nat) (l::nat) n::nat. |
|
92 BITS h l n = MOD_2EXP (Suc h - l) (DIV_2EXP l n)" |
|
93 by (import bits BITS_def) |
|
94 |
|
95 constdefs |
|
96 bit :: "nat => nat => bool" |
|
97 "bit == %(b::nat) n::nat. BITS b b n = (1::nat)" |
|
98 |
|
99 lemma BIT_def: "ALL (b::nat) n::nat. bit b n = (BITS b b n = (1::nat))" |
|
100 by (import bits BIT_def) |
|
101 |
|
102 consts |
|
103 SLICE :: "nat => nat => nat => nat" |
|
104 |
|
105 defs |
|
106 SLICE_primdef: "SLICE == %(h::nat) (l::nat) n::nat. MOD_2EXP (Suc h) n - MOD_2EXP l n" |
|
107 |
|
108 lemma SLICE_def: "ALL (h::nat) (l::nat) n::nat. |
|
109 SLICE h l n = MOD_2EXP (Suc h) n - MOD_2EXP l n" |
|
110 by (import bits SLICE_def) |
|
111 |
|
112 consts |
|
113 LSBn :: "nat => bool" |
|
114 |
|
115 defs |
|
116 LSBn_primdef: "LSBn == bit (0::nat)" |
|
117 |
|
118 lemma LSBn_def: "LSBn = bit (0::nat)" |
|
119 by (import bits LSBn_def) |
|
120 |
|
121 consts |
|
122 BITWISE :: "nat => (bool => bool => bool) => nat => nat => nat" |
|
123 |
|
124 specification (BITWISE_primdef: BITWISE) BITWISE_def: "(ALL (oper::bool => bool => bool) (x::nat) y::nat. |
|
125 BITWISE (0::nat) oper x y = (0::nat)) & |
|
126 (ALL (n::nat) (oper::bool => bool => bool) (x::nat) y::nat. |
|
127 BITWISE (Suc n) oper x y = |
|
128 BITWISE n oper x y + SBIT (oper (bit n x) (bit n y)) n)" |
|
129 by (import bits BITWISE_def) |
|
130 |
|
131 lemma DIV1: "ALL x::nat. x div (1::nat) = x" |
|
132 by (import bits DIV1) |
|
133 |
|
134 lemma SUC_SUB: "Suc (a::nat) - a = (1::nat)" |
|
135 by (import bits SUC_SUB) |
|
136 |
|
137 lemma DIV_MULT_1: "ALL (r::nat) n::nat. r < n --> (n + r) div n = (1::nat)" |
|
138 by (import bits DIV_MULT_1) |
|
139 |
|
140 lemma ZERO_LT_TWOEXP: "ALL n::nat. (0::nat) < (2::nat) ^ n" |
|
141 by (import bits ZERO_LT_TWOEXP) |
|
142 |
|
143 lemma MOD_2EXP_LT: "ALL (n::nat) k::nat. k mod (2::nat) ^ n < (2::nat) ^ n" |
|
144 by (import bits MOD_2EXP_LT) |
|
145 |
|
146 lemma TWOEXP_DIVISION: "ALL (n::nat) k::nat. |
|
147 k = k div (2::nat) ^ n * (2::nat) ^ n + k mod (2::nat) ^ n" |
|
148 by (import bits TWOEXP_DIVISION) |
|
149 |
|
150 lemma TWOEXP_MONO: "ALL (a::nat) b::nat. a < b --> (2::nat) ^ a < (2::nat) ^ b" |
|
151 by (import bits TWOEXP_MONO) |
152 by (import bits TWOEXP_MONO) |
152 |
153 |
153 lemma TWOEXP_MONO2: "ALL (a::nat) b::nat. a <= b --> (2::nat) ^ a <= (2::nat) ^ b" |
154 lemma TWOEXP_MONO2: "(All::(nat => bool) => bool) |
155 (%a::nat. |
|
156 (All::(nat => bool) => bool) |
|
157 (%b::nat. |
|
158 (op -->::bool => bool => bool) ((op <=::nat => nat => bool) a b) |
|
159 ((op <=::nat => nat => bool) |
|
160 ((op ^::nat => nat => nat) |
|
161 ((number_of::bin => nat) |
|
162 ((op BIT::bin => bit => bin) |
|
163 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
|
164 (bit.B1::bit)) |
|
165 (bit.B0::bit))) |
|
166 a) |
|
167 ((op ^::nat => nat => nat) |
|
168 ((number_of::bin => nat) |
|
169 ((op BIT::bin => bit => bin) |
|
170 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
|
171 (bit.B1::bit)) |
|
172 (bit.B0::bit))) |
|
173 b))))" |
|
154 by (import bits TWOEXP_MONO2) |
174 by (import bits TWOEXP_MONO2) |
155 |
175 |
156 lemma EXP_SUB_LESS_EQ: "ALL (a::nat) b::nat. (2::nat) ^ (a - b) <= (2::nat) ^ a" |
176 lemma EXP_SUB_LESS_EQ: "(All::(nat => bool) => bool) |
177 (%a::nat. |
|
178 (All::(nat => bool) => bool) |
|
179 (%b::nat. |
|
180 (op <=::nat => nat => bool) |
|
181 ((op ^::nat => nat => nat) |
|
182 ((number_of::bin => nat) |
|
183 ((op BIT::bin => bit => bin) |
|
184 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
|
185 (bit.B1::bit)) |
|
186 (bit.B0::bit))) |
|
187 ((op -::nat => nat => nat) a b)) |
|
188 ((op ^::nat => nat => nat) |
|
189 ((number_of::bin => nat) |
|
190 ((op BIT::bin => bit => bin) |
|
191 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
|
192 (bit.B1::bit)) |
|
193 (bit.B0::bit))) |
|
194 a)))" |
|
157 by (import bits EXP_SUB_LESS_EQ) |
195 by (import bits EXP_SUB_LESS_EQ) |
158 |
196 |
159 lemma BITS_THM: "ALL (x::nat) (xa::nat) xb::nat. |
197 lemma BITS_THM: "ALL (x::nat) (xa::nat) xb::nat. |
160 BITS x xa xb = xb div (2::nat) ^ xa mod (2::nat) ^ (Suc x - xa)" |
198 BITS x xa xb = xb div 2 ^ xa mod 2 ^ (Suc x - xa)" |
161 by (import bits BITS_THM) |
199 by (import bits BITS_THM) |
162 |
200 |
163 lemma BITSLT_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l n < (2::nat) ^ (Suc h - l)" |
201 lemma BITSLT_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l n < 2 ^ (Suc h - l)" |
164 by (import bits BITSLT_THM) |
202 by (import bits BITSLT_THM) |
165 |
203 |
166 lemma DIV_MULT_LEM: "ALL (m::nat) n::nat. (0::nat) < n --> m div n * n <= m" |
204 lemma DIV_MULT_LEM: "ALL (m::nat) n::nat. 0 < n --> m div n * n <= m" |
167 by (import bits DIV_MULT_LEM) |
205 by (import bits DIV_MULT_LEM) |
168 |
206 |
169 lemma MOD_2EXP_LEM: "ALL (n::nat) x::nat. |
207 lemma MOD_2EXP_LEM: "ALL (n::nat) x::nat. n mod 2 ^ x = n - n div 2 ^ x * 2 ^ x" |
170 n mod (2::nat) ^ x = n - n div (2::nat) ^ x * (2::nat) ^ x" |
|
171 by (import bits MOD_2EXP_LEM) |
208 by (import bits MOD_2EXP_LEM) |
172 |
209 |
173 lemma BITS2_THM: "ALL (h::nat) (l::nat) n::nat. |
210 lemma BITS2_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l n = n mod 2 ^ Suc h div 2 ^ l" |
174 BITS h l n = n mod (2::nat) ^ Suc h div (2::nat) ^ l" |
|
175 by (import bits BITS2_THM) |
211 by (import bits BITS2_THM) |
176 |
212 |
177 lemma BITS_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat. |
213 lemma BITS_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat. |
178 h2 + l1 <= h1 --> BITS h2 l2 (BITS h1 l1 n) = BITS (h2 + l1) (l2 + l1) n" |
214 h2 + l1 <= h1 --> BITS h2 l2 (BITS h1 l1 n) = BITS (h2 + l1) (l2 + l1) n" |
179 by (import bits BITS_COMP_THM) |
215 by (import bits BITS_COMP_THM) |
180 |
216 |
181 lemma BITS_DIV_THM: "ALL (h::nat) (l::nat) (x::nat) n::nat. |
217 lemma BITS_DIV_THM: "ALL (h::nat) (l::nat) (x::nat) n::nat. |
182 BITS h l x div (2::nat) ^ n = BITS h (l + n) x" |
218 BITS h l x div 2 ^ n = BITS h (l + n) x" |
183 by (import bits BITS_DIV_THM) |
219 by (import bits BITS_DIV_THM) |
184 |
220 |
185 lemma BITS_LT_HIGH: "ALL (h::nat) (l::nat) n::nat. |
221 lemma BITS_LT_HIGH: "ALL (h::nat) (l::nat) n::nat. n < 2 ^ Suc h --> BITS h l n = n div 2 ^ l" |
186 n < (2::nat) ^ Suc h --> BITS h l n = n div (2::nat) ^ l" |
|
187 by (import bits BITS_LT_HIGH) |
222 by (import bits BITS_LT_HIGH) |
188 |
223 |
189 lemma BITS_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> BITS h l n = (0::nat)" |
224 lemma BITS_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> BITS h l n = 0" |
190 by (import bits BITS_ZERO) |
225 by (import bits BITS_ZERO) |
191 |
226 |
192 lemma BITS_ZERO2: "ALL (h::nat) l::nat. BITS h l (0::nat) = (0::nat)" |
227 lemma BITS_ZERO2: "ALL (h::nat) l::nat. BITS h l 0 = 0" |
193 by (import bits BITS_ZERO2) |
228 by (import bits BITS_ZERO2) |
194 |
229 |
195 lemma BITS_ZERO3: "ALL (h::nat) x::nat. BITS h (0::nat) x = x mod (2::nat) ^ Suc h" |
230 lemma BITS_ZERO3: "ALL (h::nat) x::nat. BITS h 0 x = x mod 2 ^ Suc h" |
196 by (import bits BITS_ZERO3) |
231 by (import bits BITS_ZERO3) |
197 |
232 |
198 lemma BITS_COMP_THM2: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat. |
233 lemma BITS_COMP_THM2: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::nat. |
199 BITS h2 l2 (BITS h1 l1 n) = BITS (min h1 (h2 + l1)) (l2 + l1) n" |
234 BITS h2 l2 (BITS h1 l1 n) = BITS (min h1 (h2 + l1)) (l2 + l1) n" |
200 by (import bits BITS_COMP_THM2) |
235 by (import bits BITS_COMP_THM2) |
201 |
236 |
202 lemma NOT_MOD2_LEM: "ALL n::nat. (n mod (2::nat) ~= (0::nat)) = (n mod (2::nat) = (1::nat))" |
237 lemma NOT_MOD2_LEM: "ALL n::nat. (n mod 2 ~= 0) = (n mod 2 = 1)" |
203 by (import bits NOT_MOD2_LEM) |
238 by (import bits NOT_MOD2_LEM) |
204 |
239 |
205 lemma NOT_MOD2_LEM2: "ALL (n::nat) a::'a::type. |
240 lemma NOT_MOD2_LEM2: "ALL (n::nat) a::'a::type. (n mod 2 ~= 1) = (n mod 2 = 0)" |
206 (n mod (2::nat) ~= (1::nat)) = (n mod (2::nat) = (0::nat))" |
|
207 by (import bits NOT_MOD2_LEM2) |
241 by (import bits NOT_MOD2_LEM2) |
208 |
242 |
209 lemma EVEN_MOD2_LEM: "ALL n::nat. EVEN n = (n mod (2::nat) = (0::nat))" |
243 lemma EVEN_MOD2_LEM: "ALL n::nat. EVEN n = (n mod 2 = 0)" |
210 by (import bits EVEN_MOD2_LEM) |
244 by (import bits EVEN_MOD2_LEM) |
211 |
245 |
212 lemma ODD_MOD2_LEM: "ALL n::nat. ODD n = (n mod (2::nat) = (1::nat))" |
246 lemma ODD_MOD2_LEM: "ALL n::nat. ODD n = (n mod 2 = 1)" |
213 by (import bits ODD_MOD2_LEM) |
247 by (import bits ODD_MOD2_LEM) |
214 |
248 |
215 lemma LSB_ODD: "LSBn = ODD" |
249 lemma LSB_ODD: "LSBn = ODD" |
216 by (import bits LSB_ODD) |
250 by (import bits LSB_ODD) |
217 |
251 |
218 lemma DIV_MULT_THM: "ALL (x::nat) n::nat. |
252 lemma DIV_MULT_THM: "ALL (x::nat) n::nat. n div 2 ^ x * 2 ^ x = n - n mod 2 ^ x" |
219 n div (2::nat) ^ x * (2::nat) ^ x = n - n mod (2::nat) ^ x" |
|
220 by (import bits DIV_MULT_THM) |
253 by (import bits DIV_MULT_THM) |
221 |
254 |
222 lemma DIV_MULT_THM2: "ALL x::nat. (2::nat) * (x div (2::nat)) = x - x mod (2::nat)" |
255 lemma DIV_MULT_THM2: "ALL x::nat. 2 * (x div 2) = x - x mod 2" |
223 by (import bits DIV_MULT_THM2) |
256 by (import bits DIV_MULT_THM2) |
224 |
257 |
225 lemma LESS_EQ_EXP_MULT: "ALL (a::nat) b::nat. a <= b --> (EX x::nat. (2::nat) ^ b = x * (2::nat) ^ a)" |
258 lemma LESS_EQ_EXP_MULT: "ALL (a::nat) b::nat. a <= b --> (EX x::nat. 2 ^ b = x * 2 ^ a)" |
226 by (import bits LESS_EQ_EXP_MULT) |
259 by (import bits LESS_EQ_EXP_MULT) |
227 |
260 |
228 lemma SLICE_LEM1: "ALL (a::nat) (x::nat) y::nat. |
261 lemma SLICE_LEM1: "ALL (a::nat) (x::nat) y::nat. |
229 a div (2::nat) ^ (x + y) * (2::nat) ^ (x + y) = |
262 a div 2 ^ (x + y) * 2 ^ (x + y) = |
230 a div (2::nat) ^ x * (2::nat) ^ x - |
263 a div 2 ^ x * 2 ^ x - a div 2 ^ x mod 2 ^ y * 2 ^ x" |
231 a div (2::nat) ^ x mod (2::nat) ^ y * (2::nat) ^ x" |
|
232 by (import bits SLICE_LEM1) |
264 by (import bits SLICE_LEM1) |
233 |
265 |
234 lemma SLICE_LEM2: "ALL (a::'a::type) (x::nat) y::nat. |
266 lemma SLICE_LEM2: "ALL (a::'a::type) (x::nat) y::nat. |
235 (n::nat) mod (2::nat) ^ (x + y) = |
267 (n::nat) mod 2 ^ (x + y) = n mod 2 ^ x + n div 2 ^ x mod 2 ^ y * 2 ^ x" |
236 n mod (2::nat) ^ x + n div (2::nat) ^ x mod (2::nat) ^ y * (2::nat) ^ x" |
|
237 by (import bits SLICE_LEM2) |
268 by (import bits SLICE_LEM2) |
238 |
269 |
239 lemma SLICE_LEM3: "ALL (n::nat) (h::nat) l::nat. |
270 lemma SLICE_LEM3: "ALL (n::nat) (h::nat) l::nat. l < h --> n mod 2 ^ Suc l <= n mod 2 ^ h" |
240 l < h --> n mod (2::nat) ^ Suc l <= n mod (2::nat) ^ h" |
|
241 by (import bits SLICE_LEM3) |
271 by (import bits SLICE_LEM3) |
242 |
272 |
243 lemma SLICE_THM: "ALL (n::nat) (h::nat) l::nat. SLICE h l n = BITS h l n * (2::nat) ^ l" |
273 lemma SLICE_THM: "ALL (n::nat) (h::nat) l::nat. SLICE h l n = BITS h l n * 2 ^ l" |
244 by (import bits SLICE_THM) |
274 by (import bits SLICE_THM) |
245 |
275 |
246 lemma SLICELT_THM: "ALL (h::nat) (l::nat) n::nat. SLICE h l n < (2::nat) ^ Suc h" |
276 lemma SLICELT_THM: "ALL (h::nat) (l::nat) n::nat. SLICE h l n < 2 ^ Suc h" |
247 by (import bits SLICELT_THM) |
277 by (import bits SLICELT_THM) |
248 |
278 |
249 lemma BITS_SLICE_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l (SLICE h l n) = BITS h l n" |
279 lemma BITS_SLICE_THM: "ALL (h::nat) (l::nat) n::nat. BITS h l (SLICE h l n) = BITS h l n" |
250 by (import bits BITS_SLICE_THM) |
280 by (import bits BITS_SLICE_THM) |
251 |
281 |
252 lemma BITS_SLICE_THM2: "ALL (h::nat) (l::nat) n::nat. |
282 lemma BITS_SLICE_THM2: "ALL (h::nat) (l::nat) n::nat. |
253 h <= (h2::nat) --> BITS h2 l (SLICE h l n) = BITS h l n" |
283 h <= (h2::nat) --> BITS h2 l (SLICE h l n) = BITS h l n" |
254 by (import bits BITS_SLICE_THM2) |
284 by (import bits BITS_SLICE_THM2) |
255 |
285 |
256 lemma MOD_2EXP_MONO: "ALL (n::nat) (h::nat) l::nat. |
286 lemma MOD_2EXP_MONO: "ALL (n::nat) (h::nat) l::nat. l <= h --> n mod 2 ^ l <= n mod 2 ^ Suc h" |
257 l <= h --> n mod (2::nat) ^ l <= n mod (2::nat) ^ Suc h" |
|
258 by (import bits MOD_2EXP_MONO) |
287 by (import bits MOD_2EXP_MONO) |
259 |
288 |
260 lemma SLICE_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) n::nat. |
289 lemma SLICE_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) n::nat. |
261 Suc m <= h & l <= m --> SLICE h (Suc m) n + SLICE m l n = SLICE h l n" |
290 Suc m <= h & l <= m --> SLICE h (Suc m) n + SLICE m l n = SLICE h l n" |
262 by (import bits SLICE_COMP_THM) |
291 by (import bits SLICE_COMP_THM) |
263 |
292 |
264 lemma SLICE_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> SLICE h l n = (0::nat)" |
293 lemma SLICE_ZERO: "ALL (h::nat) (l::nat) n::nat. h < l --> SLICE h l n = 0" |
265 by (import bits SLICE_ZERO) |
294 by (import bits SLICE_ZERO) |
266 |
295 |
267 lemma BIT_COMP_THM3: "ALL (h::nat) (m::nat) (l::nat) n::nat. |
296 lemma BIT_COMP_THM3: "ALL (h::nat) (m::nat) (l::nat) n::nat. |
268 Suc m <= h & l <= m --> |
297 Suc m <= h & l <= m --> |
269 BITS h (Suc m) n * (2::nat) ^ (Suc m - l) + BITS m l n = BITS h l n" |
298 BITS h (Suc m) n * 2 ^ (Suc m - l) + BITS m l n = BITS h l n" |
270 by (import bits BIT_COMP_THM3) |
299 by (import bits BIT_COMP_THM3) |
271 |
300 |
272 lemma NOT_BIT: "ALL (n::nat) a::nat. (~ bit n a) = (BITS n n a = (0::nat))" |
301 lemma NOT_BIT: "ALL (n::nat) a::nat. (~ bit n a) = (BITS n n a = 0)" |
273 by (import bits NOT_BIT) |
302 by (import bits NOT_BIT) |
274 |
303 |
275 lemma NOT_BITS: "ALL (n::nat) a::nat. (BITS n n a ~= (0::nat)) = (BITS n n a = (1::nat))" |
304 lemma NOT_BITS: "ALL (n::nat) a::nat. (BITS n n a ~= 0) = (BITS n n a = 1)" |
276 by (import bits NOT_BITS) |
305 by (import bits NOT_BITS) |
277 |
306 |
278 lemma NOT_BITS2: "ALL (n::nat) a::nat. (BITS n n a ~= (1::nat)) = (BITS n n a = (0::nat))" |
307 lemma NOT_BITS2: "ALL (n::nat) a::nat. (BITS n n a ~= 1) = (BITS n n a = 0)" |
279 by (import bits NOT_BITS2) |
308 by (import bits NOT_BITS2) |
280 |
309 |
281 lemma BIT_SLICE: "ALL (n::nat) (a::nat) b::nat. |
310 lemma BIT_SLICE: "ALL (n::nat) (a::nat) b::nat. |
282 (bit n a = bit n b) = (SLICE n n a = SLICE n n b)" |
311 (bit n a = bit n b) = (SLICE n n a = SLICE n n b)" |
283 by (import bits BIT_SLICE) |
312 by (import bits BIT_SLICE) |
284 |
313 |
285 lemma BIT_SLICE_LEM: "ALL (y::nat) (x::nat) n::nat. |
314 lemma BIT_SLICE_LEM: "ALL (y::nat) (x::nat) n::nat. SBIT (bit x n) (x + y) = SLICE x x n * 2 ^ y" |
286 SBIT (bit x n) (x + y) = SLICE x x n * (2::nat) ^ y" |
|
287 by (import bits BIT_SLICE_LEM) |
315 by (import bits BIT_SLICE_LEM) |
288 |
316 |
289 lemma BIT_SLICE_THM: "ALL (x::nat) xa::nat. SBIT (bit x xa) x = SLICE x x xa" |
317 lemma BIT_SLICE_THM: "ALL (x::nat) xa::nat. SBIT (bit x xa) x = SLICE x x xa" |
290 by (import bits BIT_SLICE_THM) |
318 by (import bits BIT_SLICE_THM) |
291 |
319 |
292 lemma SBIT_DIV: "ALL (b::bool) (m::nat) n::nat. |
320 lemma SBIT_DIV: "ALL (b::bool) (m::nat) n::nat. n < m --> SBIT b (m - n) = SBIT b m div 2 ^ n" |
293 n < m --> SBIT b (m - n) = SBIT b m div (2::nat) ^ n" |
|
294 by (import bits SBIT_DIV) |
321 by (import bits SBIT_DIV) |
295 |
322 |
296 lemma BITS_SUC: "ALL (h::nat) (l::nat) n::nat. |
323 lemma BITS_SUC: "ALL (h::nat) (l::nat) n::nat. |
297 l <= Suc h --> |
324 l <= Suc h --> |
298 SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n = BITS (Suc h) l n" |
325 SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n = BITS (Suc h) l n" |
299 by (import bits BITS_SUC) |
326 by (import bits BITS_SUC) |
300 |
327 |
301 lemma BITS_SUC_THM: "ALL (h::nat) (l::nat) n::nat. |
328 lemma BITS_SUC_THM: "ALL (h::nat) (l::nat) n::nat. |
302 BITS (Suc h) l n = |
329 BITS (Suc h) l n = |
303 (if Suc h < l then 0::nat |
330 (if Suc h < l then 0 else SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n)" |
304 else SBIT (bit (Suc h) n) (Suc h - l) + BITS h l n)" |
|
305 by (import bits BITS_SUC_THM) |
331 by (import bits BITS_SUC_THM) |
306 |
332 |
307 lemma BIT_BITS_THM: "ALL (h::nat) (l::nat) (a::nat) b::nat. |
333 lemma BIT_BITS_THM: "ALL (h::nat) (l::nat) (a::nat) b::nat. |
308 (ALL x::nat. l <= x & x <= h --> bit x a = bit x b) = |
334 (ALL x::nat. l <= x & x <= h --> bit x a = bit x b) = |
309 (BITS h l a = BITS h l b)" |
335 (BITS h l a = BITS h l b)" |
310 by (import bits BIT_BITS_THM) |
336 by (import bits BIT_BITS_THM) |
311 |
337 |
312 lemma BITWISE_LT_2EXP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
338 lemma BITWISE_LT_2EXP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
313 BITWISE n oper a b < (2::nat) ^ n" |
339 BITWISE n oper a b < 2 ^ n" |
314 by (import bits BITWISE_LT_2EXP) |
340 by (import bits BITWISE_LT_2EXP) |
315 |
341 |
316 lemma LESS_EXP_MULT2: "ALL (a::nat) b::nat. |
342 lemma LESS_EXP_MULT2: "(All::(nat => bool) => bool) |
317 a < b --> |
343 (%a::nat. |
318 (EX x::nat. (2::nat) ^ b = (2::nat) ^ (x + (1::nat)) * (2::nat) ^ a)" |
344 (All::(nat => bool) => bool) |
345 (%b::nat. |
|
346 (op -->::bool => bool => bool) ((op <::nat => nat => bool) a b) |
|
347 ((Ex::(nat => bool) => bool) |
|
348 (%x::nat. |
|
349 (op =::nat => nat => bool) |
|
350 ((op ^::nat => nat => nat) |
|
351 ((number_of::bin => nat) |
|
352 ((op BIT::bin => bit => bin) |
|
353 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
|
354 (bit.B1::bit)) |
|
355 (bit.B0::bit))) |
|
356 b) |
|
357 ((op *::nat => nat => nat) |
|
358 ((op ^::nat => nat => nat) |
|
359 ((number_of::bin => nat) |
|
360 ((op BIT::bin => bit => bin) |
|
361 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
|
362 (bit.B1::bit)) |
|
363 (bit.B0::bit))) |
|
364 ((op +::nat => nat => nat) x (1::nat))) |
|
365 ((op ^::nat => nat => nat) |
|
366 ((number_of::bin => nat) |
|
367 ((op BIT::bin => bit => bin) |
|
368 ((op BIT::bin => bit => bin) (Numeral.Pls::bin) |
|
369 (bit.B1::bit)) |
|
370 (bit.B0::bit))) |
|
371 a))))))" |
|
319 by (import bits LESS_EXP_MULT2) |
372 by (import bits LESS_EXP_MULT2) |
320 |
373 |
321 lemma BITWISE_THM: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
374 lemma BITWISE_THM: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
322 x < n --> bit x (BITWISE n oper a b) = oper (bit x a) (bit x b)" |
375 x < n --> bit x (BITWISE n oper a b) = oper (bit x a) (bit x b)" |
323 by (import bits BITWISE_THM) |
376 by (import bits BITWISE_THM) |
324 |
377 |
325 lemma BITWISE_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
378 lemma BITWISE_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
326 x < n --> |
379 x < n --> |
327 oper (bit x a) (bit x b) --> |
380 oper (bit x a) (bit x b) --> BITWISE n oper a b div 2 ^ x mod 2 = 1" |
328 BITWISE n oper a b div (2::nat) ^ x mod (2::nat) = (1::nat)" |
|
329 by (import bits BITWISE_COR) |
381 by (import bits BITWISE_COR) |
330 |
382 |
331 lemma BITWISE_NOT_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
383 lemma BITWISE_NOT_COR: "ALL (x::nat) (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
332 x < n --> |
384 x < n --> |
333 ~ oper (bit x a) (bit x b) --> |
385 ~ oper (bit x a) (bit x b) --> BITWISE n oper a b div 2 ^ x mod 2 = 0" |
334 BITWISE n oper a b div (2::nat) ^ x mod (2::nat) = (0::nat)" |
|
335 by (import bits BITWISE_NOT_COR) |
386 by (import bits BITWISE_NOT_COR) |
336 |
387 |
337 lemma MOD_PLUS_RIGHT: "ALL n>0::nat. ALL (j::nat) k::nat. (j + k mod n) mod n = (j + k) mod n" |
388 lemma MOD_PLUS_RIGHT: "ALL n>0. ALL (j::nat) k::nat. (j + k mod n) mod n = (j + k) mod n" |
338 by (import bits MOD_PLUS_RIGHT) |
389 by (import bits MOD_PLUS_RIGHT) |
339 |
390 |
340 lemma MOD_PLUS_1: "ALL n>0::nat. |
391 lemma MOD_PLUS_1: "ALL n>0. ALL x::nat. ((x + 1) mod n = 0) = (x mod n + 1 = n)" |
341 ALL x::nat. ((x + (1::nat)) mod n = (0::nat)) = (x mod n + (1::nat) = n)" |
|
342 by (import bits MOD_PLUS_1) |
392 by (import bits MOD_PLUS_1) |
343 |
393 |
344 lemma MOD_ADD_1: "ALL n>0::nat. |
394 lemma MOD_ADD_1: "ALL n>0. ALL x::nat. (x + 1) mod n ~= 0 --> (x + 1) mod n = x mod n + 1" |
345 ALL x::nat. |
|
346 (x + (1::nat)) mod n ~= (0::nat) --> |
|
347 (x + (1::nat)) mod n = x mod n + (1::nat)" |
|
348 by (import bits MOD_ADD_1) |
395 by (import bits MOD_ADD_1) |
349 |
396 |
350 ;end_setup |
397 ;end_setup |
351 |
398 |
352 ;setup_theory word32 |
399 ;setup_theory word32 |
377 |
424 |
378 consts |
425 consts |
379 MODw :: "nat => nat" |
426 MODw :: "nat => nat" |
380 |
427 |
381 defs |
428 defs |
382 MODw_primdef: "MODw == %n::nat. n mod (2::nat) ^ WL" |
429 MODw_primdef: "MODw == %n::nat. n mod 2 ^ WL" |
383 |
430 |
384 lemma MODw_def: "ALL n::nat. MODw n = n mod (2::nat) ^ WL" |
431 lemma MODw_def: "ALL n::nat. MODw n = n mod 2 ^ WL" |
385 by (import word32 MODw_def) |
432 by (import word32 MODw_def) |
386 |
433 |
387 consts |
434 consts |
388 INw :: "nat => bool" |
435 INw :: "nat => bool" |
389 |
436 |
390 defs |
437 defs |
391 INw_primdef: "INw == %n::nat. n < (2::nat) ^ WL" |
438 INw_primdef: "INw == %n::nat. n < 2 ^ WL" |
392 |
439 |
393 lemma INw_def: "ALL n::nat. INw n = (n < (2::nat) ^ WL)" |
440 lemma INw_def: "ALL n::nat. INw n = (n < 2 ^ WL)" |
394 by (import word32 INw_def) |
441 by (import word32 INw_def) |
395 |
442 |
396 consts |
443 consts |
397 EQUIV :: "nat => nat => bool" |
444 EQUIV :: "nat => nat => bool" |
398 |
445 |
427 by (import word32 MODw_IDEM2) |
474 by (import word32 MODw_IDEM2) |
428 |
475 |
429 lemma TOw_QT: "ALL a::nat. EQUIV (MODw a) a" |
476 lemma TOw_QT: "ALL a::nat. EQUIV (MODw a) a" |
430 by (import word32 TOw_QT) |
477 by (import word32 TOw_QT) |
431 |
478 |
432 lemma MODw_THM: "MODw = BITS HB (0::nat)" |
479 lemma MODw_THM: "MODw = BITS HB 0" |
433 by (import word32 MODw_THM) |
480 by (import word32 MODw_THM) |
434 |
481 |
435 lemma MOD_ADD: "ALL (a::nat) b::nat. MODw (a + b) = MODw (MODw a + MODw b)" |
482 lemma MOD_ADD: "ALL (a::nat) b::nat. MODw (a + b) = MODw (MODw a + MODw b)" |
436 by (import word32 MOD_ADD) |
483 by (import word32 MOD_ADD) |
437 |
484 |
440 |
487 |
441 consts |
488 consts |
442 AONE :: "nat" |
489 AONE :: "nat" |
443 |
490 |
444 defs |
491 defs |
445 AONE_primdef: "AONE == 1::nat" |
492 AONE_primdef: "AONE == 1" |
446 |
493 |
447 lemma AONE_def: "AONE = (1::nat)" |
494 lemma AONE_def: "AONE = 1" |
448 by (import word32 AONE_def) |
495 by (import word32 AONE_def) |
449 |
496 |
450 lemma ADD_QT: "(ALL n::nat. EQUIV ((0::nat) + n) n) & |
497 lemma ADD_QT: "(ALL n::nat. EQUIV (0 + n) n) & |
451 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n)))" |
498 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n)))" |
452 by (import word32 ADD_QT) |
499 by (import word32 ADD_QT) |
453 |
500 |
454 lemma ADD_0_QT: "ALL a::nat. EQUIV (a + (0::nat)) a" |
501 lemma ADD_0_QT: "ALL a::nat. EQUIV (a + 0) a" |
455 by (import word32 ADD_0_QT) |
502 by (import word32 ADD_0_QT) |
456 |
503 |
457 lemma ADD_COMM_QT: "ALL (a::nat) b::nat. EQUIV (a + b) (b + a)" |
504 lemma ADD_COMM_QT: "ALL (a::nat) b::nat. EQUIV (a + b) (b + a)" |
458 by (import word32 ADD_COMM_QT) |
505 by (import word32 ADD_COMM_QT) |
459 |
506 |
460 lemma ADD_ASSOC_QT: "ALL (a::nat) (b::nat) c::nat. EQUIV (a + (b + c)) (a + b + c)" |
507 lemma ADD_ASSOC_QT: "ALL (a::nat) (b::nat) c::nat. EQUIV (a + (b + c)) (a + b + c)" |
461 by (import word32 ADD_ASSOC_QT) |
508 by (import word32 ADD_ASSOC_QT) |
462 |
509 |
463 lemma MULT_QT: "(ALL n::nat. EQUIV ((0::nat) * n) (0::nat)) & |
510 lemma MULT_QT: "(ALL n::nat. EQUIV (0 * n) 0) & |
464 (ALL (m::nat) n::nat. EQUIV (Suc m * n) (m * n + n))" |
511 (ALL (m::nat) n::nat. EQUIV (Suc m * n) (m * n + n))" |
465 by (import word32 MULT_QT) |
512 by (import word32 MULT_QT) |
466 |
513 |
467 lemma ADD1_QT: "ALL m::nat. EQUIV (Suc m) (m + AONE)" |
514 lemma ADD1_QT: "ALL m::nat. EQUIV (Suc m) (m + AONE)" |
468 by (import word32 ADD1_QT) |
515 by (import word32 ADD1_QT) |
469 |
516 |
470 lemma ADD_CLAUSES_QT: "(ALL m::nat. EQUIV ((0::nat) + m) m) & |
517 lemma ADD_CLAUSES_QT: "(ALL m::nat. EQUIV (0 + m) m) & |
471 (ALL m::nat. EQUIV (m + (0::nat)) m) & |
518 (ALL m::nat. EQUIV (m + 0) m) & |
472 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n))) & |
519 (ALL (m::nat) n::nat. EQUIV (Suc m + n) (Suc (m + n))) & |
473 (ALL (m::nat) n::nat. EQUIV (m + Suc n) (Suc (m + n)))" |
520 (ALL (m::nat) n::nat. EQUIV (m + Suc n) (Suc (m + n)))" |
474 by (import word32 ADD_CLAUSES_QT) |
521 by (import word32 ADD_CLAUSES_QT) |
475 |
522 |
476 lemma SUC_EQUIV_COMP: "ALL (a::nat) b::nat. |
523 lemma SUC_EQUIV_COMP: "ALL (a::nat) b::nat. EQUIV (Suc a) b --> EQUIV a (b + (2 ^ WL - 1))" |
477 EQUIV (Suc a) b --> EQUIV a (b + ((2::nat) ^ WL - (1::nat)))" |
|
478 by (import word32 SUC_EQUIV_COMP) |
524 by (import word32 SUC_EQUIV_COMP) |
479 |
525 |
480 lemma INV_SUC_EQ_QT: "ALL (m::nat) n::nat. EQUIV (Suc m) (Suc n) = EQUIV m n" |
526 lemma INV_SUC_EQ_QT: "ALL (m::nat) n::nat. EQUIV (Suc m) (Suc n) = EQUIV m n" |
481 by (import word32 INV_SUC_EQ_QT) |
527 by (import word32 INV_SUC_EQ_QT) |
482 |
528 |
483 lemma ADD_INV_0_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m --> EQUIV n (0::nat)" |
529 lemma ADD_INV_0_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m --> EQUIV n 0" |
484 by (import word32 ADD_INV_0_QT) |
530 by (import word32 ADD_INV_0_QT) |
485 |
531 |
486 lemma ADD_INV_0_EQ_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m = EQUIV n (0::nat)" |
532 lemma ADD_INV_0_EQ_QT: "ALL (m::nat) n::nat. EQUIV (m + n) m = EQUIV n 0" |
487 by (import word32 ADD_INV_0_EQ_QT) |
533 by (import word32 ADD_INV_0_EQ_QT) |
488 |
534 |
489 lemma EQ_ADD_LCANCEL_QT: "ALL (m::nat) (n::nat) p::nat. EQUIV (m + n) (m + p) = EQUIV n p" |
535 lemma EQ_ADD_LCANCEL_QT: "ALL (m::nat) (n::nat) p::nat. EQUIV (m + n) (m + p) = EQUIV n p" |
490 by (import word32 EQ_ADD_LCANCEL_QT) |
536 by (import word32 EQ_ADD_LCANCEL_QT) |
491 |
537 |
500 |
546 |
501 lemma MULT_COMM_QT: "ALL (m::nat) n::nat. EQUIV (m * n) (n * m)" |
547 lemma MULT_COMM_QT: "ALL (m::nat) n::nat. EQUIV (m * n) (n * m)" |
502 by (import word32 MULT_COMM_QT) |
548 by (import word32 MULT_COMM_QT) |
503 |
549 |
504 lemma MULT_CLAUSES_QT: "ALL (m::nat) n::nat. |
550 lemma MULT_CLAUSES_QT: "ALL (m::nat) n::nat. |
505 EQUIV ((0::nat) * m) (0::nat) & |
551 EQUIV (0 * m) 0 & |
506 EQUIV (m * (0::nat)) (0::nat) & |
552 EQUIV (m * 0) 0 & |
507 EQUIV (AONE * m) m & |
553 EQUIV (AONE * m) m & |
508 EQUIV (m * AONE) m & |
554 EQUIV (m * AONE) m & |
509 EQUIV (Suc m * n) (m * n + n) & EQUIV (m * Suc n) (m + m * n)" |
555 EQUIV (Suc m * n) (m * n + n) & EQUIV (m * Suc n) (m + m * n)" |
510 by (import word32 MULT_CLAUSES_QT) |
556 by (import word32 MULT_CLAUSES_QT) |
511 |
557 |
520 |
566 |
521 consts |
567 consts |
522 ONE_COMP :: "nat => nat" |
568 ONE_COMP :: "nat => nat" |
523 |
569 |
524 defs |
570 defs |
525 ONE_COMP_primdef: "ONE_COMP == %x::nat. (2::nat) ^ WL - (1::nat) - MODw x" |
571 ONE_COMP_primdef: "ONE_COMP == %x::nat. 2 ^ WL - 1 - MODw x" |
526 |
572 |
527 lemma ONE_COMP_def: "ALL x::nat. ONE_COMP x = (2::nat) ^ WL - (1::nat) - MODw x" |
573 lemma ONE_COMP_def: "ALL x::nat. ONE_COMP x = 2 ^ WL - 1 - MODw x" |
528 by (import word32 ONE_COMP_def) |
574 by (import word32 ONE_COMP_def) |
529 |
575 |
530 consts |
576 consts |
531 TWO_COMP :: "nat => nat" |
577 TWO_COMP :: "nat => nat" |
532 |
578 |
533 defs |
579 defs |
534 TWO_COMP_primdef: "TWO_COMP == %x::nat. (2::nat) ^ WL - MODw x" |
580 TWO_COMP_primdef: "TWO_COMP == %x::nat. 2 ^ WL - MODw x" |
535 |
581 |
536 lemma TWO_COMP_def: "ALL x::nat. TWO_COMP x = (2::nat) ^ WL - MODw x" |
582 lemma TWO_COMP_def: "ALL x::nat. TWO_COMP x = 2 ^ WL - MODw x" |
537 by (import word32 TWO_COMP_def) |
583 by (import word32 TWO_COMP_def) |
538 |
584 |
539 lemma ADD_TWO_COMP_QT: "ALL a::nat. EQUIV (MODw a + TWO_COMP a) (0::nat)" |
585 lemma ADD_TWO_COMP_QT: "ALL a::nat. EQUIV (MODw a + TWO_COMP a) 0" |
540 by (import word32 ADD_TWO_COMP_QT) |
586 by (import word32 ADD_TWO_COMP_QT) |
541 |
587 |
542 lemma TWO_COMP_ONE_COMP_QT: "ALL a::nat. EQUIV (TWO_COMP a) (ONE_COMP a + AONE)" |
588 lemma TWO_COMP_ONE_COMP_QT: "ALL a::nat. EQUIV (TWO_COMP a) (ONE_COMP a + AONE)" |
543 by (import word32 TWO_COMP_ONE_COMP_QT) |
589 by (import word32 TWO_COMP_ONE_COMP_QT) |
544 |
590 |
555 ((bit::nat => nat => bool) xb x) |
601 ((bit::nat => nat => bool) xb x) |
556 ((bit::nat => nat => bool) xb xa)))) |
602 ((bit::nat => nat => bool) xb xa)))) |
557 ((EQUIV::nat => nat => bool) x xa)))" |
603 ((EQUIV::nat => nat => bool) x xa)))" |
558 by (import word32 BIT_EQUIV_THM) |
604 by (import word32 BIT_EQUIV_THM) |
559 |
605 |
560 lemma BITS_SUC2: "ALL (n::nat) a::nat. |
606 lemma BITS_SUC2: "ALL (n::nat) a::nat. BITS (Suc n) 0 a = SLICE (Suc n) (Suc n) a + BITS n 0 a" |
561 BITS (Suc n) (0::nat) a = SLICE (Suc n) (Suc n) a + BITS n (0::nat) a" |
|
562 by (import word32 BITS_SUC2) |
607 by (import word32 BITS_SUC2) |
563 |
608 |
564 lemma BITWISE_ONE_COMP_THM: "ALL (a::nat) b::nat. BITWISE WL (%(x::bool) y::bool. ~ x) a b = ONE_COMP a" |
609 lemma BITWISE_ONE_COMP_THM: "ALL (a::nat) b::nat. BITWISE WL (%(x::bool) y::bool. ~ x) a b = ONE_COMP a" |
565 by (import word32 BITWISE_ONE_COMP_THM) |
610 by (import word32 BITWISE_ONE_COMP_THM) |
566 |
611 |
596 |
641 |
597 consts |
642 consts |
598 COMP0 :: "nat" |
643 COMP0 :: "nat" |
599 |
644 |
600 defs |
645 defs |
601 COMP0_primdef: "COMP0 == ONE_COMP (0::nat)" |
646 COMP0_primdef: "COMP0 == ONE_COMP 0" |
602 |
647 |
603 lemma COMP0_def: "COMP0 = ONE_COMP (0::nat)" |
648 lemma COMP0_def: "COMP0 = ONE_COMP 0" |
604 by (import word32 COMP0_def) |
649 by (import word32 COMP0_def) |
605 |
650 |
606 lemma BITWISE_THM2: "(All::(nat => bool) => bool) |
651 lemma BITWISE_THM2: "(All::(nat => bool) => bool) |
607 (%y::nat. |
652 (%y::nat. |
608 (All::((bool => bool => bool) => bool) => bool) |
653 (All::((bool => bool => bool) => bool) => bool) |
653 by (import word32 AND_IDEM_QT) |
698 by (import word32 AND_IDEM_QT) |
654 |
699 |
655 lemma OR_COMP_QT: "ALL a::nat. EQUIV (OR a (ONE_COMP a)) COMP0" |
700 lemma OR_COMP_QT: "ALL a::nat. EQUIV (OR a (ONE_COMP a)) COMP0" |
656 by (import word32 OR_COMP_QT) |
701 by (import word32 OR_COMP_QT) |
657 |
702 |
658 lemma AND_COMP_QT: "ALL a::nat. EQUIV (AND a (ONE_COMP a)) (0::nat)" |
703 lemma AND_COMP_QT: "ALL a::nat. EQUIV (AND a (ONE_COMP a)) 0" |
659 by (import word32 AND_COMP_QT) |
704 by (import word32 AND_COMP_QT) |
660 |
705 |
661 lemma ONE_COMP_QT: "ALL a::nat. EQUIV (ONE_COMP (ONE_COMP a)) a" |
706 lemma ONE_COMP_QT: "ALL a::nat. EQUIV (ONE_COMP (ONE_COMP a)) a" |
662 by (import word32 ONE_COMP_QT) |
707 by (import word32 ONE_COMP_QT) |
663 |
708 |
681 |
726 |
682 lemma MSB_WELLDEF: "ALL (a::nat) b::nat. EQUIV a b --> MSBn a = MSBn b" |
727 lemma MSB_WELLDEF: "ALL (a::nat) b::nat. EQUIV a b --> MSBn a = MSBn b" |
683 by (import word32 MSB_WELLDEF) |
728 by (import word32 MSB_WELLDEF) |
684 |
729 |
685 lemma BITWISE_ISTEP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
730 lemma BITWISE_ISTEP: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
686 (0::nat) < n --> |
731 0 < n --> |
687 BITWISE n oper (a div (2::nat)) (b div (2::nat)) = |
732 BITWISE n oper (a div 2) (b div 2) = |
688 BITWISE n oper a b div (2::nat) + |
733 BITWISE n oper a b div 2 + SBIT (oper (bit n a) (bit n b)) (n - 1)" |
689 SBIT (oper (bit n a) (bit n b)) (n - (1::nat))" |
|
690 by (import word32 BITWISE_ISTEP) |
734 by (import word32 BITWISE_ISTEP) |
691 |
735 |
692 lemma BITWISE_EVAL: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
736 lemma BITWISE_EVAL: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) b::nat. |
693 BITWISE (Suc n) oper a b = |
737 BITWISE (Suc n) oper a b = |
694 (2::nat) * BITWISE n oper (a div (2::nat)) (b div (2::nat)) + |
738 2 * BITWISE n oper (a div 2) (b div 2) + SBIT (oper (LSBn a) (LSBn b)) 0" |
695 SBIT (oper (LSBn a) (LSBn b)) (0::nat)" |
|
696 by (import word32 BITWISE_EVAL) |
739 by (import word32 BITWISE_EVAL) |
697 |
740 |
698 lemma BITWISE_WELLDEF: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) (b::nat) (c::nat) d::nat. |
741 lemma BITWISE_WELLDEF: "ALL (n::nat) (oper::bool => bool => bool) (a::nat) (b::nat) (c::nat) d::nat. |
699 EQUIV a b & EQUIV c d --> EQUIV (BITWISE n oper a c) (BITWISE n oper b d)" |
742 EQUIV a b & EQUIV c d --> EQUIV (BITWISE n oper a c) (BITWISE n oper b d)" |
700 by (import word32 BITWISE_WELLDEF) |
743 by (import word32 BITWISE_WELLDEF) |
726 |
769 |
727 consts |
770 consts |
728 LSR_ONE :: "nat => nat" |
771 LSR_ONE :: "nat => nat" |
729 |
772 |
730 defs |
773 defs |
731 LSR_ONE_primdef: "LSR_ONE == %a::nat. MODw a div (2::nat)" |
774 LSR_ONE_primdef: "LSR_ONE == %a::nat. MODw a div 2" |
732 |
775 |
733 lemma LSR_ONE_def: "ALL a::nat. LSR_ONE a = MODw a div (2::nat)" |
776 lemma LSR_ONE_def: "ALL a::nat. LSR_ONE a = MODw a div 2" |
734 by (import word32 LSR_ONE_def) |
777 by (import word32 LSR_ONE_def) |
735 |
778 |
736 consts |
779 consts |
737 ASR_ONE :: "nat => nat" |
780 ASR_ONE :: "nat => nat" |
738 |
781 |
770 by (import word32 ROR_ONE_WELLDEF) |
813 by (import word32 ROR_ONE_WELLDEF) |
771 |
814 |
772 lemma RRX_WELLDEF: "ALL (a::nat) (b::nat) c::bool. EQUIV a b --> EQUIV (RRXn c a) (RRXn c b)" |
815 lemma RRX_WELLDEF: "ALL (a::nat) (b::nat) c::bool. EQUIV a b --> EQUIV (RRXn c a) (RRXn c b)" |
773 by (import word32 RRX_WELLDEF) |
816 by (import word32 RRX_WELLDEF) |
774 |
817 |
775 lemma LSR_ONE: "LSR_ONE = BITS HB (1::nat)" |
818 lemma LSR_ONE: "LSR_ONE = BITS HB 1" |
776 by (import word32 LSR_ONE) |
819 by (import word32 LSR_ONE) |
777 |
820 |
778 typedef (open) word32 = "{x::nat => bool. EX xa::nat. x = EQUIV xa}" |
821 typedef (open) word32 = "{x::nat => bool. EX xa::nat. x = EQUIV xa}" |
779 by (rule typedef_helper,import word32 word32_TY_DEF) |
822 by (rule typedef_helper,import word32 word32_TY_DEF) |
780 |
823 |
791 |
834 |
792 consts |
835 consts |
793 w_0 :: "word32" |
836 w_0 :: "word32" |
794 |
837 |
795 defs |
838 defs |
796 w_0_primdef: "w_0 == mk_word32 (EQUIV (0::nat))" |
839 w_0_primdef: "w_0 == mk_word32 (EQUIV 0)" |
797 |
840 |
798 lemma w_0_def: "w_0 = mk_word32 (EQUIV (0::nat))" |
841 lemma w_0_def: "w_0 = mk_word32 (EQUIV 0)" |
799 by (import word32 w_0_def) |
842 by (import word32 w_0_def) |
800 |
843 |
801 consts |
844 consts |
802 w_1 :: "word32" |
845 w_1 :: "word32" |
803 |
846 |
1079 word_1comp (bitwise_and x xa) = |
1122 word_1comp (bitwise_and x xa) = |
1080 bitwise_or (word_1comp x) (word_1comp xa) & |
1123 bitwise_or (word_1comp x) (word_1comp xa) & |
1081 word_1comp (bitwise_or x xa) = bitwise_and (word_1comp x) (word_1comp xa)" |
1124 word_1comp (bitwise_or x xa) = bitwise_and (word_1comp x) (word_1comp xa)" |
1082 by (import word32 DE_MORGAN_THMw) |
1125 by (import word32 DE_MORGAN_THMw) |
1083 |
1126 |
1084 lemma w_0: "w_0 = n2w (0::nat)" |
1127 lemma w_0: "w_0 = n2w 0" |
1085 by (import word32 w_0) |
1128 by (import word32 w_0) |
1086 |
1129 |
1087 lemma w_1: "w_1 = n2w (1::nat)" |
1130 lemma w_1: "w_1 = n2w 1" |
1088 by (import word32 w_1) |
1131 by (import word32 w_1) |
1089 |
1132 |
1090 lemma w_T: "w_T = |
1133 lemma w_T: "w_T = |
1091 n2w (NUMERAL |
1134 n2w (NUMERAL |
1092 (NUMERAL_BIT1 |
1135 (NUMERAL_BIT1 |
1137 lemma word_sub: "ALL (a::word32) b::word32. word_sub a b = word_add a (word_2comp b)" |
1180 lemma word_sub: "ALL (a::word32) b::word32. word_sub a b = word_add a (word_2comp b)" |
1138 by (import word32 word_sub) |
1181 by (import word32 word_sub) |
1139 |
1182 |
1140 constdefs |
1183 constdefs |
1141 word_lsl :: "word32 => nat => word32" |
1184 word_lsl :: "word32 => nat => word32" |
1142 "word_lsl == %(a::word32) n::nat. word_mul a (n2w ((2::nat) ^ n))" |
1185 "word_lsl == %(a::word32) n::nat. word_mul a (n2w (2 ^ n))" |
1143 |
1186 |
1144 lemma word_lsl: "ALL (a::word32) n::nat. word_lsl a n = word_mul a (n2w ((2::nat) ^ n))" |
1187 lemma word_lsl: "ALL (a::word32) n::nat. word_lsl a n = word_mul a (n2w (2 ^ n))" |
1145 by (import word32 word_lsl) |
1188 by (import word32 word_lsl) |
1146 |
1189 |
1147 constdefs |
1190 constdefs |
1148 word_lsr :: "word32 => nat => word32" |
1191 word_lsr :: "word32 => nat => word32" |
1149 "word_lsr == %(a::word32) n::nat. (word_lsr1 ^ n) a" |
1192 "word_lsr == %(a::word32) n::nat. (word_lsr1 ^ n) a" |
1318 by (import word32 ROR_ADD) |
1361 by (import word32 ROR_ADD) |
1319 |
1362 |
1320 lemma LSL_LIMIT: "ALL (w::word32) n::nat. HB < n --> word_lsl w n = w_0" |
1363 lemma LSL_LIMIT: "ALL (w::word32) n::nat. HB < n --> word_lsl w n = w_0" |
1321 by (import word32 LSL_LIMIT) |
1364 by (import word32 LSL_LIMIT) |
1322 |
1365 |
1323 lemma MOD_MOD_DIV: "ALL (a::nat) b::nat. INw (MODw a div (2::nat) ^ b)" |
1366 lemma MOD_MOD_DIV: "ALL (a::nat) b::nat. INw (MODw a div 2 ^ b)" |
1324 by (import word32 MOD_MOD_DIV) |
1367 by (import word32 MOD_MOD_DIV) |
1325 |
1368 |
1326 lemma MOD_MOD_DIV_2EXP: "ALL (a::nat) n::nat. |
1369 lemma MOD_MOD_DIV_2EXP: "ALL (a::nat) n::nat. MODw (MODw a div 2 ^ n) div 2 = MODw a div 2 ^ Suc n" |
1327 MODw (MODw a div (2::nat) ^ n) div (2::nat) = MODw a div (2::nat) ^ Suc n" |
|
1328 by (import word32 MOD_MOD_DIV_2EXP) |
1370 by (import word32 MOD_MOD_DIV_2EXP) |
1329 |
1371 |
1330 lemma LSR_EVAL: "ALL n::nat. word_lsr (n2w (a::nat)) n = n2w (MODw a div (2::nat) ^ n)" |
1372 lemma LSR_EVAL: "ALL n::nat. word_lsr (n2w (a::nat)) n = n2w (MODw a div 2 ^ n)" |
1331 by (import word32 LSR_EVAL) |
1373 by (import word32 LSR_EVAL) |
1332 |
1374 |
1333 lemma LSR_THM: "ALL (x::nat) n::nat. word_lsr (n2w n) x = n2w (BITS HB (min WL x) n)" |
1375 lemma LSR_THM: "ALL (x::nat) n::nat. word_lsr (n2w n) x = n2w (BITS HB (min WL x) n)" |
1334 by (import word32 LSR_THM) |
1376 by (import word32 LSR_THM) |
1335 |
1377 |
1336 lemma LSR_LIMIT: "ALL (x::nat) w::word32. HB < x --> word_lsr w x = w_0" |
1378 lemma LSR_LIMIT: "ALL (x::nat) w::word32. HB < x --> word_lsr w x = w_0" |
1337 by (import word32 LSR_LIMIT) |
1379 by (import word32 LSR_LIMIT) |
1338 |
1380 |
1339 lemma LEFT_SHIFT_LESS: "ALL (n::nat) (m::nat) a::nat. |
1381 lemma LEFT_SHIFT_LESS: "ALL (n::nat) (m::nat) a::nat. a < 2 ^ m --> 2 ^ n + a * 2 ^ n <= 2 ^ (m + n)" |
1340 a < (2::nat) ^ m --> |
|
1341 (2::nat) ^ n + a * (2::nat) ^ n <= (2::nat) ^ (m + n)" |
|
1342 by (import word32 LEFT_SHIFT_LESS) |
1382 by (import word32 LEFT_SHIFT_LESS) |
1343 |
1383 |
1344 lemma ROR_THM: "ALL (x::nat) n::nat. |
1384 lemma ROR_THM: "ALL (x::nat) n::nat. |
1345 word_ror (n2w n) x = |
1385 word_ror (n2w n) x = |
1346 (let x'::nat = x mod WL |
1386 (let x'::nat = x mod WL |
1347 in n2w (BITS HB x' n + |
1387 in n2w (BITS HB x' n + BITS (x' - 1) 0 n * 2 ^ (WL - x')))" |
1348 BITS (x' - (1::nat)) (0::nat) n * (2::nat) ^ (WL - x')))" |
|
1349 by (import word32 ROR_THM) |
1388 by (import word32 ROR_THM) |
1350 |
1389 |
1351 lemma ROR_CYCLE: "ALL (x::nat) w::word32. word_ror w (x * WL) = w" |
1390 lemma ROR_CYCLE: "ALL (x::nat) w::word32. word_ror w (x * WL) = w" |
1352 by (import word32 ROR_CYCLE) |
1391 by (import word32 ROR_CYCLE) |
1353 |
1392 |
1354 lemma ASR_THM: "ALL (x::nat) n::nat. |
1393 lemma ASR_THM: "ALL (x::nat) n::nat. |
1355 word_asr (n2w n) x = |
1394 word_asr (n2w n) x = |
1356 (let x'::nat = min HB x; s::nat = BITS HB x' n |
1395 (let x'::nat = min HB x; s::nat = BITS HB x' n |
1357 in n2w (if MSBn n then (2::nat) ^ WL - (2::nat) ^ (WL - x') + s else s))" |
1396 in n2w (if MSBn n then 2 ^ WL - 2 ^ (WL - x') + s else s))" |
1358 by (import word32 ASR_THM) |
1397 by (import word32 ASR_THM) |
1359 |
1398 |
1360 lemma ASR_LIMIT: "ALL (x::nat) w::word32. |
1399 lemma ASR_LIMIT: "ALL (x::nat) w::word32. |
1361 HB <= x --> word_asr w x = (if MSB w then w_T else w_0)" |
1400 HB <= x --> word_asr w x = (if MSB w then w_T else w_0)" |
1362 by (import word32 ASR_LIMIT) |
1401 by (import word32 ASR_LIMIT) |
1364 lemma ZERO_SHIFT: "(ALL n::nat. word_lsl w_0 n = w_0) & |
1403 lemma ZERO_SHIFT: "(ALL n::nat. word_lsl w_0 n = w_0) & |
1365 (ALL n::nat. word_asr w_0 n = w_0) & |
1404 (ALL n::nat. word_asr w_0 n = w_0) & |
1366 (ALL n::nat. word_lsr w_0 n = w_0) & (ALL n::nat. word_ror w_0 n = w_0)" |
1405 (ALL n::nat. word_lsr w_0 n = w_0) & (ALL n::nat. word_ror w_0 n = w_0)" |
1367 by (import word32 ZERO_SHIFT) |
1406 by (import word32 ZERO_SHIFT) |
1368 |
1407 |
1369 lemma ZERO_SHIFT2: "(ALL a::word32. word_lsl a (0::nat) = a) & |
1408 lemma ZERO_SHIFT2: "(ALL a::word32. word_lsl a 0 = a) & |
1370 (ALL a::word32. word_asr a (0::nat) = a) & |
1409 (ALL a::word32. word_asr a 0 = a) & |
1371 (ALL a::word32. word_lsr a (0::nat) = a) & |
1410 (ALL a::word32. word_lsr a 0 = a) & (ALL a::word32. word_ror a 0 = a)" |
1372 (ALL a::word32. word_ror a (0::nat) = a)" |
|
1373 by (import word32 ZERO_SHIFT2) |
1411 by (import word32 ZERO_SHIFT2) |
1374 |
1412 |
1375 lemma ASR_w_T: "ALL n::nat. word_asr w_T n = w_T" |
1413 lemma ASR_w_T: "ALL n::nat. word_asr w_T n = w_T" |
1376 by (import word32 ASR_w_T) |
1414 by (import word32 ASR_w_T) |
1377 |
1415 |
1423 lemma MUL_EVAL2: "ALL (b::nat) a::nat. word_mul (n2w a) (n2w b) = n2w (MODw (a * b))" |
1461 lemma MUL_EVAL2: "ALL (b::nat) a::nat. word_mul (n2w a) (n2w b) = n2w (MODw (a * b))" |
1424 by (import word32 MUL_EVAL2) |
1462 by (import word32 MUL_EVAL2) |
1425 |
1463 |
1426 lemma ONE_COMP_EVAL2: "ALL a::nat. |
1464 lemma ONE_COMP_EVAL2: "ALL a::nat. |
1427 word_1comp (n2w a) = |
1465 word_1comp (n2w a) = |
1428 n2w ((2::nat) ^ |
1466 n2w (2 ^ |
1429 NUMERAL |
1467 NUMERAL |
1430 (NUMERAL_BIT2 |
1468 (NUMERAL_BIT2 |
1431 (NUMERAL_BIT1 |
1469 (NUMERAL_BIT1 |
1432 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) - |
1470 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) - |
1433 (1::nat) - |
1471 1 - |
1434 MODw a)" |
1472 MODw a)" |
1435 by (import word32 ONE_COMP_EVAL2) |
1473 by (import word32 ONE_COMP_EVAL2) |
1436 |
1474 |
1437 lemma TWO_COMP_EVAL2: "ALL a::nat. |
1475 lemma TWO_COMP_EVAL2: "ALL a::nat. |
1438 word_2comp (n2w a) = |
1476 word_2comp (n2w a) = |
1439 n2w (MODw |
1477 n2w (MODw |
1440 ((2::nat) ^ |
1478 (2 ^ |
1441 NUMERAL |
1479 NUMERAL |
1442 (NUMERAL_BIT2 |
1480 (NUMERAL_BIT2 |
1443 (NUMERAL_BIT1 |
1481 (NUMERAL_BIT1 |
1444 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) - |
1482 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO))))) - |
1445 MODw a))" |
1483 MODw a))" |
1446 by (import word32 TWO_COMP_EVAL2) |
1484 by (import word32 TWO_COMP_EVAL2) |
1447 |
1485 |
1448 lemma LSR_ONE_EVAL2: "ALL a::nat. word_lsr1 (n2w a) = n2w (MODw a div (2::nat))" |
1486 lemma LSR_ONE_EVAL2: "ALL a::nat. word_lsr1 (n2w a) = n2w (MODw a div 2)" |
1449 by (import word32 LSR_ONE_EVAL2) |
1487 by (import word32 LSR_ONE_EVAL2) |
1450 |
1488 |
1451 lemma ASR_ONE_EVAL2: "ALL a::nat. |
1489 lemma ASR_ONE_EVAL2: "ALL a::nat. |
1452 word_asr1 (n2w a) = |
1490 word_asr1 (n2w a) = |
1453 n2w (MODw a div (2::nat) + |
1491 n2w (MODw a div 2 + |
1454 SBIT (MSBn a) |
1492 SBIT (MSBn a) |
1455 (NUMERAL |
1493 (NUMERAL |
1456 (NUMERAL_BIT1 |
1494 (NUMERAL_BIT1 |
1457 (NUMERAL_BIT1 |
1495 (NUMERAL_BIT1 |
1458 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))" |
1496 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))" |
1459 by (import word32 ASR_ONE_EVAL2) |
1497 by (import word32 ASR_ONE_EVAL2) |
1460 |
1498 |
1461 lemma ROR_ONE_EVAL2: "ALL a::nat. |
1499 lemma ROR_ONE_EVAL2: "ALL a::nat. |
1462 word_ror1 (n2w a) = |
1500 word_ror1 (n2w a) = |
1463 n2w (MODw a div (2::nat) + |
1501 n2w (MODw a div 2 + |
1464 SBIT (LSBn a) |
1502 SBIT (LSBn a) |
1465 (NUMERAL |
1503 (NUMERAL |
1466 (NUMERAL_BIT1 |
1504 (NUMERAL_BIT1 |
1467 (NUMERAL_BIT1 |
1505 (NUMERAL_BIT1 |
1468 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))" |
1506 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))" |
1469 by (import word32 ROR_ONE_EVAL2) |
1507 by (import word32 ROR_ONE_EVAL2) |
1470 |
1508 |
1471 lemma RRX_EVAL2: "ALL (c::bool) a::nat. |
1509 lemma RRX_EVAL2: "ALL (c::bool) a::nat. |
1472 RRX c (n2w a) = |
1510 RRX c (n2w a) = |
1473 n2w (MODw a div (2::nat) + |
1511 n2w (MODw a div 2 + |
1474 SBIT c |
1512 SBIT c |
1475 (NUMERAL |
1513 (NUMERAL |
1476 (NUMERAL_BIT1 |
1514 (NUMERAL_BIT1 |
1477 (NUMERAL_BIT1 |
1515 (NUMERAL_BIT1 |
1478 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))" |
1516 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))))" |
1518 (NUMERAL_BIT1 |
1556 (NUMERAL_BIT1 |
1519 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))) |
1557 (NUMERAL_BIT1 (NUMERAL_BIT1 (NUMERAL_BIT1 ALT_ZERO)))))) |
1520 (%(x::bool) y::bool. x ~= y) a b)" |
1558 (%(x::bool) y::bool. x ~= y) a b)" |
1521 by (import word32 EOR_EVAL2) |
1559 by (import word32 EOR_EVAL2) |
1522 |
1560 |
1523 lemma BITWISE_EVAL2: "(All::(nat => bool) => bool) |
1561 lemma BITWISE_EVAL2: "ALL (n::nat) (oper::bool => bool => bool) (x::nat) y::nat. |
1524 (%n::nat. |
1562 BITWISE n oper x y = |
1525 (All::((bool => bool => bool) => bool) => bool) |
1563 (if n = 0 then 0 |
1526 (%oper::bool => bool => bool. |
1564 else 2 * BITWISE (n - 1) oper (x div 2) (y div 2) + |
1527 (All::(nat => bool) => bool) |
1565 (if oper (ODD x) (ODD y) then 1 else 0))" |
1528 (%x::nat. |
|
1529 (All::(nat => bool) => bool) |
|
1530 (%y::nat. |
|
1531 (op =::nat => nat => bool) |
|
1532 ((BITWISE::nat |
|
1533 => (bool => bool => bool) |
|
1534 => nat => nat => nat) |
|
1535 n oper x y) |
|
1536 ((If::bool => nat => nat => nat) |
|
1537 ((op =::nat => nat => bool) n (0::nat)) (0::nat) |
|
1538 ((op +::nat => nat => nat) |
|
1539 ((op *::nat => nat => nat) |
|
1540 ((number_of::bin => nat) |
|
1541 ((op BIT::bin => bit => bin) |
|
1542 ((op BIT::bin => bit => bin) |
|
1543 (Numeral.Pls::bin) (bit.B1::bit)) |
|
1544 (bit.B0::bit))) |
|
1545 ((BITWISE::nat |
|
1546 => (bool => bool => bool) => nat => nat => nat) |
|
1547 ((op -::nat => nat => nat) n (1::nat)) oper |
|
1548 ((op div::nat => nat => nat) x |
|
1549 ((number_of::bin => nat) |
|
1550 ((op BIT::bin => bit => bin) |
|
1551 ((op BIT::bin => bit => bin) |
|
1552 (Numeral.Pls::bin) (bit.B1::bit)) |
|
1553 (bit.B0::bit)))) |
|
1554 ((op div::nat => nat => nat) y |
|
1555 ((number_of::bin => nat) |
|
1556 ((op BIT::bin => bit => bin) |
|
1557 ((op BIT::bin => bit => bin) |
|
1558 (Numeral.Pls::bin) (bit.B1::bit)) |
|
1559 (bit.B0::bit)))))) |
|
1560 ((If::bool => nat => nat => nat) |
|
1561 (oper ((ODD::nat => bool) x) |
|
1562 ((ODD::nat => bool) y)) |
|
1563 (1::nat) (0::nat))))))))" |
|
1564 by (import word32 BITWISE_EVAL2) |
1566 by (import word32 BITWISE_EVAL2) |
1565 |
1567 |
1566 lemma BITSwLT_THM: "ALL (h::nat) (l::nat) n::word32. BITSw h l n < (2::nat) ^ (Suc h - l)" |
1568 lemma BITSwLT_THM: "ALL (h::nat) (l::nat) n::word32. BITSw h l n < 2 ^ (Suc h - l)" |
1567 by (import word32 BITSwLT_THM) |
1569 by (import word32 BITSwLT_THM) |
1568 |
1570 |
1569 lemma BITSw_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::word32. |
1571 lemma BITSw_COMP_THM: "ALL (h1::nat) (l1::nat) (h2::nat) (l2::nat) n::word32. |
1570 h2 + l1 <= h1 --> |
1572 h2 + l1 <= h1 --> |
1571 BITS h2 l2 (BITSw h1 l1 n) = BITSw (h2 + l1) (l2 + l1) n" |
1573 BITS h2 l2 (BITSw h1 l1 n) = BITSw (h2 + l1) (l2 + l1) n" |
1572 by (import word32 BITSw_COMP_THM) |
1574 by (import word32 BITSw_COMP_THM) |
1573 |
1575 |
1574 lemma BITSw_DIV_THM: "ALL (h::nat) (l::nat) (n::nat) x::word32. |
1576 lemma BITSw_DIV_THM: "ALL (h::nat) (l::nat) (n::nat) x::word32. |
1575 BITSw h l x div (2::nat) ^ n = BITSw h (l + n) x" |
1577 BITSw h l x div 2 ^ n = BITSw h (l + n) x" |
1576 by (import word32 BITSw_DIV_THM) |
1578 by (import word32 BITSw_DIV_THM) |
1577 |
1579 |
1578 lemma BITw_THM: "ALL (b::nat) n::word32. BITw b n = (BITSw b b n = (1::nat))" |
1580 lemma BITw_THM: "ALL (b::nat) n::word32. BITw b n = (BITSw b b n = 1)" |
1579 by (import word32 BITw_THM) |
1581 by (import word32 BITw_THM) |
1580 |
1582 |
1581 lemma SLICEw_THM: "ALL (n::word32) (h::nat) l::nat. SLICEw h l n = BITSw h l n * (2::nat) ^ l" |
1583 lemma SLICEw_THM: "ALL (n::word32) (h::nat) l::nat. SLICEw h l n = BITSw h l n * 2 ^ l" |
1582 by (import word32 SLICEw_THM) |
1584 by (import word32 SLICEw_THM) |
1583 |
1585 |
1584 lemma BITS_SLICEw_THM: "ALL (h::nat) (l::nat) n::word32. BITS h l (SLICEw h l n) = BITSw h l n" |
1586 lemma BITS_SLICEw_THM: "ALL (h::nat) (l::nat) n::word32. BITS h l (SLICEw h l n) = BITSw h l n" |
1585 by (import word32 BITS_SLICEw_THM) |
1587 by (import word32 BITS_SLICEw_THM) |
1586 |
1588 |
1587 lemma SLICEw_ZERO_THM: "ALL (n::word32) h::nat. SLICEw h (0::nat) n = BITSw h (0::nat) n" |
1589 lemma SLICEw_ZERO_THM: "ALL (n::word32) h::nat. SLICEw h 0 n = BITSw h 0 n" |
1588 by (import word32 SLICEw_ZERO_THM) |
1590 by (import word32 SLICEw_ZERO_THM) |
1589 |
1591 |
1590 lemma SLICEw_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) a::word32. |
1592 lemma SLICEw_COMP_THM: "ALL (h::nat) (m::nat) (l::nat) a::word32. |
1591 Suc m <= h & l <= m --> SLICEw h (Suc m) a + SLICEw m l a = SLICEw h l a" |
1593 Suc m <= h & l <= m --> SLICEw h (Suc m) a + SLICEw m l a = SLICEw h l a" |
1592 by (import word32 SLICEw_COMP_THM) |
1594 by (import word32 SLICEw_COMP_THM) |
1593 |
1595 |
1594 lemma BITSw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> BITSw h l n = (0::nat)" |
1596 lemma BITSw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> BITSw h l n = 0" |
1595 by (import word32 BITSw_ZERO) |
1597 by (import word32 BITSw_ZERO) |
1596 |
1598 |
1597 lemma SLICEw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> SLICEw h l n = (0::nat)" |
1599 lemma SLICEw_ZERO: "ALL (h::nat) (l::nat) n::word32. h < l --> SLICEw h l n = 0" |
1598 by (import word32 SLICEw_ZERO) |
1600 by (import word32 SLICEw_ZERO) |
1599 |
1601 |
1600 ;end_setup |
1602 ;end_setup |
1601 |
1603 |
1602 end |
1604 end |