1 let EVEN_DIV_LEM = prove_by_refinement(
3 (!x. a pow n * p x = c x * q x + d x) ==>
6 ((interpsign set q Zero) ==>
7 (interpsign set d Neg) ==>
8 (interpsign set p Neg)) /\
9 ((interpsign set q Zero) ==>
10 (interpsign set d Pos) ==>
11 (interpsign set p Pos)) /\
12 ((interpsign set q Zero) ==>
13 (interpsign set d Zero) ==>
14 (interpsign set p Zero))`,
18 REWRITE_TAC[interpsign];
20 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
21 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
23 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
26 ASM_MESON_TAC[EVEN_ODD_POW;real_gt];
28 CLAIM `a pow n * p x < &0`;
29 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
30 REWRITE_TAC[REAL_MUL_LT];
32 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
33 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
34 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
36 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
39 ASM_MESON_TAC[EVEN_ODD_POW;real_gt];
41 CLAIM `a pow n * p x > &0`;
42 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
43 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
45 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
46 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
47 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
49 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
52 ASM_MESON_TAC[EVEN_ODD_POW;real_gt];
54 CLAIM `a pow n * p x = &0`;
55 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
56 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
58 ASM_MESON_TAC[REAL_ENTIRE;REAL_POS_NZ];
63 let GT_DIV_LEM = prove_by_refinement(
65 (!x. a pow n * p x = c x * q x + d x) ==>
67 ((interpsign set q Zero) ==>
68 (interpsign set d Neg) ==>
69 (interpsign set p Neg)) /\
70 ((interpsign set q Zero) ==>
71 (interpsign set d Pos) ==>
72 (interpsign set p Pos)) /\
73 ((interpsign set q Zero) ==>
74 (interpsign set d Zero) ==>
75 (interpsign set p Zero))`,
78 REWRITE_TAC[interpsign];
81 ASM_MESON_TAC[REAL_POW_LT;real_gt;];
84 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
85 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
87 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
89 CLAIM `a pow n * p x < &0`;
90 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
91 REWRITE_TAC[REAL_MUL_LT];
93 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
95 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
96 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
98 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
100 CLAIM `a pow n * p x > &0`;
101 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
102 REWRITE_TAC[REAL_MUL_GT;real_gt];
104 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
105 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
106 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
108 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
110 CLAIM `a pow n * p x = &0`;
111 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
112 ASM_MESON_TAC[REAL_ENTIRE;REAL_NOT_EQ;real_gt];
116 let NEG_ODD_LEM = prove_by_refinement(
118 (!x. a pow n * p x = c x * q x + d x) ==>
121 ((interpsign set q Zero) ==>
122 (interpsign set (\x. -- d x) Neg) ==>
123 (interpsign set p Neg)) /\
124 ((interpsign set q Zero) ==>
125 (interpsign set (\x. -- d x) Pos) ==>
126 (interpsign set p Pos)) /\
127 ((interpsign set q Zero) ==>
128 (interpsign set (\x. -- d x) Zero) ==>
129 (interpsign set p Zero))`,
132 REWRITE_TAC[interpsign;POLY_NEG];
133 REPEAT_N 10 STRIP_TAC;
134 CLAIM `a pow n < &0`;
135 ASM_MESON_TAC[PARITY_POW_LT;real_gt;];
139 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
140 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
142 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
144 CLAIM `a pow n * p x > &0`;
145 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
146 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
148 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
150 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
151 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
153 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
155 CLAIM `a pow n * p x < &0`;
156 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
157 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
159 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
160 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
161 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
163 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
165 CLAIM `a pow n * p x = &0`;
166 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
167 ASM_MESON_TAC[REAL_ENTIRE;REAL_NOT_EQ;real_gt];
171 let NEQ_ODD_LEM = prove_by_refinement(
173 (!x. a pow n * p x = c x * q x + d x) ==>
176 ((interpsign set q Zero) ==>
177 (interpsign set (\x. a * d x) Neg) ==>
178 (interpsign set p Neg)) /\
179 ((interpsign set q Zero) ==>
180 (interpsign set (\x. a * d x) Pos) ==>
181 (interpsign set p Pos)) /\
182 ((interpsign set q Zero) ==>
183 (interpsign set (\x. a * d x) Zero) ==>
184 (interpsign set p Zero))`,
187 REWRITE_TAC[interpsign;POLY_CMUL];
188 REPEAT_N 10 STRIP_TAC;
189 CLAIM `a < &0 \/ a > &0 \/ (a = &0)`;
196 CLAIM `a pow n < &0`;
197 ASM_MESON_TAC[PARITY_POW_LT];
200 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
201 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
203 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
207 ASM_REWRITE_TAC[real_gt;REAL_MUL_LT];
209 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
210 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
214 REWRITE_TAC[REAL_MUL_LT];
216 CLAIM `&0 < a pow n * p x`;
217 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
218 REWRITE_TAC[REAL_MUL_GT];
220 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
221 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
223 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
224 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
226 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
230 REWRITE_TAC[REAL_MUL_GT;real_gt];
232 CLAIM `a pow n * p x < &0`;
233 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
234 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
236 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
237 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
239 CLAIM `a pow n * p x < &0`;
240 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
241 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
243 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
244 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
245 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
247 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
250 ASM_MESON_TAC[REAL_ENTIRE;REAL_NOT_EQ;real_gt];
252 CLAIM `a pow n * p x = &0`;
253 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
254 ASM_MESON_TAC[REAL_ENTIRE;REAL_NOT_EQ;real_gt];
256 CLAIM `a pow n > &0`;
257 ASM_MESON_TAC[EVEN_ODD_POW;NEQ;real_gt];
260 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
261 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
263 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
267 ASM_REWRITE_TAC[real_gt;REAL_MUL_LT];
269 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
270 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
274 REWRITE_TAC[REAL_MUL_LT];
276 CLAIM `a pow n * p x < &0`;
277 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
278 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
280 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
281 CLAIM `a pow n * p x < &0`;
282 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
283 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
285 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
287 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
288 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
290 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
294 REWRITE_TAC[REAL_MUL_GT;real_gt];
296 CLAIM `a pow n * p x < &0`;
297 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
298 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
300 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
301 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
303 CLAIM `a pow n * p x > &0`;
304 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
305 REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;real_gt];
307 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
308 RULE_ASSUM_TAC (fun y -> try ISPEC `x:real` y with _ -> y);
309 POP_ASSUM (fun x -> REWRITE_ASSUMS[x]);
311 POP_ASSUM (fun x -> REWRITE_ASSUMS[x;REAL_MUL_RZERO;REAL_ADD_LID;]);
314 ASM_MESON_TAC[REAL_ENTIRE;REAL_NOT_EQ;real_gt];
316 CLAIM `a pow n * p x = &0`;
317 EVERY_ASSUM MP_TAC THEN REAL_ARITH_TAC;
318 ASM_MESON_TAC[REAL_ENTIRE;REAL_NOT_EQ;real_gt];
322 let NEQ_MULT_LT_LEM = prove_by_refinement(
325 ((interpsign set d Neg) ==>
326 (interpsign set (\x. a * d x) Pos)) /\
327 ((interpsign set d Pos) ==>
328 (interpsign set (\x. a * d x) Neg)) /\
329 ((interpsign set d Zero) ==>
330 (interpsign set (\x. a * d x) Zero))`,
333 REWRITE_TAC[interpsign;POLY_NEG];
335 ASM_MESON_TAC[REAL_MUL_GT;real_gt];
336 ASM_MESON_TAC[REAL_MUL_LT;real_gt];
337 ASM_MESON_TAC[REAL_ENTIRE;REAL_NOT_EQ;real_gt];
341 let NEQ_MULT_GT_LEM = prove_by_refinement(
344 ((interpsign set d Neg) ==>
345 (interpsign set (\x. a * d x) Neg)) /\
346 ((interpsign set d Pos) ==>
347 (interpsign set (\x. a * d x) Pos)) /\
348 ((interpsign set d Zero) ==>
349 (interpsign set (\x. a * d x) Zero))`,
352 REWRITE_TAC[interpsign;POLY_NEG] THEN
353 MESON_TAC[REAL_MUL_LT;REAL_ENTIRE;REAL_NOT_EQ;REAL_MUL_GT;real_gt];
357 let unknown_thm = prove(
358 `!set p. (interpsign set p Unknown)`,
359 MESON_TAC[interpsign]);;
361 let ips_gt_nz_thm = prove_by_refinement(
362 `!x. x > &0 ==> x <> &0`,
370 let ips_lt_nz_thm = prove_by_refinement(
371 `!x. x < &0 ==> x <> &0`,