1 let inferisign_lem00 = prove_by_refinement(
2 `x1 < x3 ==> x3 < x2 ==> (!x. x1 < x /\ x < x2 ==> P x) ==>
3 (!x. x1 < x /\ x < x3 ==> P x) /\
4 (!x. (x = x3) ==> P x) /\
5 (!x. x3 < x /\ x < x2 ==> P x)`,
10 FIRST_ASSUM MATCH_MP_TAC;
12 MATCH_MP_TAC REAL_LT_TRANS;
15 FIRST_ASSUM MATCH_MP_TAC;
17 FIRST_ASSUM MATCH_MP_TAC;
19 MATCH_MP_TAC REAL_LT_TRANS;
26 let neg_neg_neq_thm = prove_by_refinement(
27 `!x y p. x < y /\ poly p x < &0 /\ poly p y < &0 /\
28 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
29 (!z. x < z /\ z < y ==> poly p z < &0)`,
33 REWRITE_TAC[ARITH_RULE `x < y <=> ~(y <= x)`];
35 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
38 CLAIM `&0 < poly p z - poly p x`;
40 USE_THEN "Z-3" MP_TAC;
41 USE_THEN "Z-8" MP_TAC;
44 CLAIM `&0 < (z - x) * poly (poly_diff p) x'`;
45 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
46 ASM_REWRITE_TAC[REAL_MUL_GT];
50 USE_THEN "Z-8" MP_TAC THEN REAL_ARITH_TAC;
52 USE_THEN "Z-1" MP_TAC THEN REAL_ARITH_TAC;
54 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
57 CLAIM `poly p y - poly p z < &0`;
59 USE_THEN "Z-13" MP_TAC;
60 USE_THEN "Z-9" MP_TAC;
65 USE_THEN "Z-11" MP_TAC THEN REAL_ARITH_TAC;
67 CLAIM `(y - z) * poly (poly_diff p) x'' < &0`;
72 ASM_REWRITE_TAC[REAL_MUL_LT];
74 REPEAT_N 3 (POP_ASSUM MP_TAC);
77 MATCH_MP_TAC REAL_LT_TRANS;
81 MP_TAC (ISPECL [`poly_diff p`;`x':real`;`x'':real`] (REWRITE_RULE[real_gt] POLY_IVT_NEG));
84 CLAIM `x < x''' /\ x''' < y`;
86 MATCH_MP_TAC REAL_LT_TRANS;
89 MATCH_MP_TAC REAL_LT_TRANS;
96 let neg_neg_neq_thm2 = prove_by_refinement(
97 `!x y p. x < y ==> poly p x < &0 ==> poly p y < &0 ==>
98 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
99 (!z. x < z /\ z < y ==> poly p z < &0)`,
102 REPEAT_N 7 STRIP_TAC;
103 MATCH_MP_TAC neg_neg_neq_thm;
108 let pos_pos_neq_thm = prove_by_refinement(
109 `!x y p. x < y /\ &0 < poly p x /\ &0 < poly p y /\
110 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
111 (!z. x < z /\ z < y ==> &0 < poly p z)`,
115 REWRITE_TAC[ARITH_RULE `x < y <=> ~(y <= x)`];
117 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
120 CLAIM `poly p z - poly p x < &0`;
122 USE_THEN "Z-3" MP_TAC;
123 USE_THEN "Z-8" MP_TAC;
126 CLAIM `(z - x) * poly (poly_diff p) x' < &0`;
127 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
128 ASM_REWRITE_TAC[REAL_MUL_LT];
132 USE_THEN "Z-8" MP_TAC THEN REAL_ARITH_TAC;
134 USE_THEN "Z-1" MP_TAC THEN REAL_ARITH_TAC;
136 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
139 CLAIM `&0 < poly p y - poly p z`;
141 USE_THEN "Z-13" MP_TAC;
142 USE_THEN "Z-9" MP_TAC;
147 USE_THEN "Z-11" MP_TAC THEN REAL_ARITH_TAC;
149 CLAIM `&0 < (y - z) * poly (poly_diff p) x''`;
154 ASM_REWRITE_TAC[REAL_MUL_GT];
156 REPEAT_N 3 (POP_ASSUM MP_TAC);
159 MATCH_MP_TAC REAL_LT_TRANS;
163 MP_TAC (ISPECL [`poly_diff p`;`x':real`;`x'':real`] (REWRITE_RULE[real_gt] POLY_IVT_POS));
166 CLAIM `x < x''' /\ x''' < y`;
168 MATCH_MP_TAC REAL_LT_TRANS;
171 MATCH_MP_TAC REAL_LT_TRANS;
178 let pos_pos_neq_thm2 = prove_by_refinement(
179 `!x y p. x < y ==> poly p x > &0 ==> poly p y > &0 ==>
180 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
181 (!z. x < z /\ z < y ==> poly p z > &0)`,
184 REWRITE_TAC[real_gt];
185 REPEAT_N 7 STRIP_TAC;
186 MATCH_MP_TAC pos_pos_neq_thm;
191 let pos_neg_neq_thm = prove_by_refinement(
192 `!x y p. x < y /\ &0 < poly p x /\ poly p y < &0 /\
193 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
194 ?X. x < X /\ X < y /\ (poly p X = &0) /\
195 (!z. x < z /\ z < X ==> &0 < poly p z) /\
196 (!z. X < z /\ z < y ==> poly p z < &0)`,
201 MP_TAC (ISPECL [`p:real list`;`x:real`;`y:real`] POLY_IVT_NEG);
202 REWRITE_TAC[real_gt];
204 DISCH_THEN (X_CHOOSE_TAC `X:real`);
205 POP_ASSUM MP_TAC THEN STRIP_TAC;
211 ONCE_REWRITE_TAC[ARITH_RULE `x < y <=> ~(y < x \/ (x = y))`];
213 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
215 DISCH_THEN (X_CHOOSE_TAC `N:real`);
216 POP_ASSUM MP_TAC THEN STRIP_TAC;
217 CLAIM `poly p z - poly p x < &0`;
219 USE_THEN "Z-3" MP_TAC;
220 USE_THEN "Z-11" MP_TAC;
223 CLAIM `(z - x) * poly (poly_diff p) N < &0`;
224 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
225 ASM_REWRITE_TAC[REAL_MUL_LT];
229 USE_THEN "Z-8" MP_TAC THEN REAL_ARITH_TAC;
231 USE_THEN "Z-1" MP_TAC THEN REAL_ARITH_TAC;
233 MP_TAC (ISPECL [`p:real list`;`z:real`;`X:real`] POLY_MVT);
235 DISCH_THEN (X_CHOOSE_TAC `M:real`);
236 POP_ASSUM MP_TAC THEN STRIP_TAC;
237 CLAIM `&0 < &0 - poly p z`;
239 USE_THEN "Z-9" MP_TAC;
244 USE_THEN "Z-11" MP_TAC THEN REAL_ARITH_TAC;
246 CLAIM `&0 < (X - z) * poly (poly_diff p) M`;
251 REWRITE_TAC[REAL_MUL_GT];
258 MATCH_MP_TAC REAL_LT_TRANS;
262 MP_TAC (ISPECL [`poly_diff p`;`N:real`;`M:real`] (REWRITE_RULE[real_gt] POLY_IVT_POS));
264 DISCH_THEN (X_CHOOSE_TAC `K:real`);
265 POP_ASSUM MP_TAC THEN STRIP_TAC;
267 CLAIM `x < K /\ K < y`;
269 MATCH_MP_TAC REAL_LT_TRANS;
272 MATCH_MP_TAC REAL_LT_TRANS;
275 MATCH_MP_TAC REAL_LT_TRANS;
280 POP_ASSUM (ASSUME_TAC o GSYM);
281 MP_TAC (ISPECL [`p:real list`;`z:real`;`X:real`] POLY_MVT);
284 ONCE_REWRITE_TAC[REAL_ARITH `(x:real = y) <=> (y = x)`];
285 ASM_REWRITE_TAC[REAL_ENTIRE];
286 DISCH_THEN (X_CHOOSE_TAC `M:real`);
287 POP_ASSUM MP_TAC THEN STRIP_TAC;
290 USE_THEN "Z-4" MP_TAC THEN REAL_ARITH_TAC;
291 CLAIM `x < M /\ M < y`;
293 MATCH_MP_TAC REAL_LT_TRANS;
296 MATCH_MP_TAC REAL_LT_TRANS;
302 ONCE_REWRITE_TAC[ARITH_RULE `x < y <=> ~(y < x \/ (x = y))`];
304 MP_TAC (ISPECL [`p:real list`;`X:real`;`z:real`] POLY_MVT);
306 DISCH_THEN (X_CHOOSE_TAC `N:real`);
307 POP_ASSUM MP_TAC THEN STRIP_TAC;
311 CLAIM `&0 < (z - X) * poly (poly_diff p) N`;
313 USE_THEN "Z-3" MP_TAC;
314 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
315 ASM_REWRITE_TAC[REAL_MUL_GT];
319 USE_THEN "Z-7" MP_TAC THEN REAL_ARITH_TAC;
321 USE_THEN "Z-1" MP_TAC THEN REAL_ARITH_TAC;
323 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
325 USE_THEN "Z-6" (REWRITE_TAC o list);
326 DISCH_THEN (X_CHOOSE_TAC `M:real`);
327 POP_ASSUM MP_TAC THEN STRIP_TAC;
328 CLAIM `poly p y - poly p z < &0`;
330 USE_THEN "Z-12" MP_TAC;
331 USE_THEN "Z-5" MP_TAC;
336 USE_THEN "Z-6" MP_TAC THEN REAL_ARITH_TAC;
338 CLAIM `(y - z) * poly (poly_diff p) M < &0`;
343 REWRITE_TAC[REAL_MUL_LT];
350 MATCH_MP_TAC REAL_LT_TRANS;
354 MP_TAC (ISPECL [`poly_diff p`;`N:real`;`M:real`] (REWRITE_RULE[real_gt] POLY_IVT_NEG));
356 DISCH_THEN (X_CHOOSE_TAC `K:real`);
357 POP_ASSUM MP_TAC THEN STRIP_TAC;
359 CLAIM `x < K /\ K < y`;
361 MATCH_MP_TAC REAL_LT_TRANS;
364 MATCH_MP_TAC REAL_LT_TRANS;
367 MATCH_MP_TAC REAL_LT_TRANS;
372 MP_TAC (ISPECL [`p:real list`;`X:real`;`z:real`] POLY_MVT);
375 ONCE_REWRITE_TAC[REAL_ARITH `(x:real = y) <=> (y = x)`];
376 ASM_REWRITE_TAC[REAL_ENTIRE];
377 DISCH_THEN (X_CHOOSE_TAC `M:real`);
378 POP_ASSUM MP_TAC THEN STRIP_TAC;
381 USE_THEN "Z-5" MP_TAC THEN REAL_ARITH_TAC;
382 CLAIM `x < M /\ M < y`;
384 MATCH_MP_TAC REAL_LT_TRANS;
387 MATCH_MP_TAC REAL_LT_TRANS;
396 let pos_neg_neq_thm2 = prove_by_refinement(
397 `!x y p. x < y ==> poly p x > &0 ==> poly p y < &0 ==>
398 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
399 ?X. x < X /\ X < y /\
400 (!z. (z = X) ==> (poly p z = &0)) /\
401 (!z. x < z /\ z < X ==> poly p z > &0) /\
402 (!z. X < z /\ z < y ==> poly p z < &0)`,
405 REWRITE_TAC[real_gt];
407 MP_TAC (ISPECL[`x:real`;`y:real`;`p:real list`] pos_neg_neq_thm);
415 let neg_pos_neq_thm = prove_by_refinement(
416 `!x y p. x < y /\ poly p x < &0 /\ &0 < poly p y /\
417 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
418 ?X. x < X /\ X < y /\ (poly p X = &0) /\
419 (!z. x < z /\ z < X ==> poly p z < &0) /\
420 (!z. X < z /\ z < y ==> &0 < poly p z)`,
425 MP_TAC (ISPECL [`p:real list`;`x:real`;`y:real`] POLY_IVT_POS);
426 REWRITE_TAC[real_gt];
428 DISCH_THEN (X_CHOOSE_TAC `X:real`);
429 POP_ASSUM MP_TAC THEN STRIP_TAC;
435 ONCE_REWRITE_TAC[ARITH_RULE `x < y <=> ~(y < x \/ (x = y))`];
437 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
439 DISCH_THEN (X_CHOOSE_TAC `N:real`);
440 POP_ASSUM MP_TAC THEN STRIP_TAC;
441 CLAIM `&0 < poly p z - poly p x`;
443 USE_THEN "Z-3" MP_TAC;
444 USE_THEN "Z-11" MP_TAC;
447 CLAIM `&0 < (z - x) * poly (poly_diff p) N`;
448 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
449 ASM_REWRITE_TAC[REAL_MUL_GT];
453 USE_THEN "Z-8" MP_TAC THEN REAL_ARITH_TAC;
455 USE_THEN "Z-1" MP_TAC THEN REAL_ARITH_TAC;
457 MP_TAC (ISPECL [`p:real list`;`z:real`;`X:real`] POLY_MVT);
459 DISCH_THEN (X_CHOOSE_TAC `M:real`);
460 POP_ASSUM MP_TAC THEN STRIP_TAC;
461 CLAIM `&0 - poly p z < &0`;
463 USE_THEN "Z-9" MP_TAC;
468 USE_THEN "Z-11" MP_TAC THEN REAL_ARITH_TAC;
470 CLAIM `(X - z) * poly (poly_diff p) M < &0`;
475 REWRITE_TAC[REAL_MUL_LT];
482 MATCH_MP_TAC REAL_LT_TRANS;
486 MP_TAC (ISPECL [`poly_diff p`;`N:real`;`M:real`] (REWRITE_RULE[real_gt] POLY_IVT_NEG));
488 DISCH_THEN (X_CHOOSE_TAC `K:real`);
489 POP_ASSUM MP_TAC THEN STRIP_TAC;
491 CLAIM `x < K /\ K < y`;
493 MATCH_MP_TAC REAL_LT_TRANS;
496 MATCH_MP_TAC REAL_LT_TRANS;
499 MATCH_MP_TAC REAL_LT_TRANS;
504 MP_TAC (ISPECL [`p:real list`;`z:real`;`X:real`] POLY_MVT);
507 ONCE_REWRITE_TAC[REAL_ARITH `(x:real = y) <=> (y = x)`];
508 ASM_REWRITE_TAC[REAL_ENTIRE];
509 DISCH_THEN (X_CHOOSE_TAC `M:real`);
510 POP_ASSUM MP_TAC THEN STRIP_TAC;
513 USE_THEN "Z-4" MP_TAC THEN REAL_ARITH_TAC;
514 CLAIM `x < M /\ M < y`;
516 MATCH_MP_TAC REAL_LT_TRANS;
519 MATCH_MP_TAC REAL_LT_TRANS;
525 ONCE_REWRITE_TAC[ARITH_RULE `x < y <=> ~(y < x \/ (x = y))`];
527 MP_TAC (ISPECL [`p:real list`;`X:real`;`z:real`] POLY_MVT);
529 DISCH_THEN (X_CHOOSE_TAC `N:real`);
530 POP_ASSUM MP_TAC THEN STRIP_TAC;
534 CLAIM `(z - X) * poly (poly_diff p) N < &0`;
536 USE_THEN "Z-3" MP_TAC;
537 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;
538 ASM_REWRITE_TAC[REAL_MUL_LT];
542 USE_THEN "Z-7" MP_TAC THEN REAL_ARITH_TAC;
544 USE_THEN "Z-1" MP_TAC THEN REAL_ARITH_TAC;
546 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
548 USE_THEN "Z-6" (REWRITE_TAC o list);
549 DISCH_THEN (X_CHOOSE_TAC `M:real`);
550 POP_ASSUM MP_TAC THEN STRIP_TAC;
551 CLAIM `&0 < poly p y - poly p z`;
553 USE_THEN "Z-12" MP_TAC;
554 USE_THEN "Z-5" MP_TAC;
559 USE_THEN "Z-6" MP_TAC THEN REAL_ARITH_TAC;
561 CLAIM `&0 < (y - z) * poly (poly_diff p) M`;
566 REWRITE_TAC[REAL_MUL_GT];
573 MATCH_MP_TAC REAL_LT_TRANS;
577 MP_TAC (ISPECL [`poly_diff p`;`N:real`;`M:real`] (REWRITE_RULE[real_gt] POLY_IVT_POS));
579 DISCH_THEN (X_CHOOSE_TAC `K:real`);
580 POP_ASSUM MP_TAC THEN STRIP_TAC;
582 CLAIM `x < K /\ K < y`;
584 MATCH_MP_TAC REAL_LT_TRANS;
587 MATCH_MP_TAC REAL_LT_TRANS;
590 MATCH_MP_TAC REAL_LT_TRANS;
595 POP_ASSUM (ASSUME_TAC o GSYM);
596 MP_TAC (ISPECL [`p:real list`;`X:real`;`z:real`] POLY_MVT);
599 ONCE_REWRITE_TAC[REAL_ARITH `(x:real = y) <=> (y = x)`];
600 ASM_REWRITE_TAC[REAL_ENTIRE];
601 DISCH_THEN (X_CHOOSE_TAC `M:real`);
602 POP_ASSUM MP_TAC THEN STRIP_TAC;
605 USE_THEN "Z-5" MP_TAC THEN REAL_ARITH_TAC;
606 CLAIM `x < M /\ M < y`;
608 MATCH_MP_TAC REAL_LT_TRANS;
611 MATCH_MP_TAC REAL_LT_TRANS;
619 let neg_pos_neq_thm2 = prove_by_refinement(
620 `!x y p. x < y ==> poly p x < &0 ==> poly p y > &0 ==>
621 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
622 ?X. x < X /\ X < y /\
623 (!z. (z = X) ==> (poly p z = &0)) /\
624 (!z. x < z /\ z < X ==> poly p z < &0) /\
625 (!z. X < z /\ z < y ==> poly p z > &0)`,
628 REWRITE_TAC[real_gt];
630 MP_TAC (ISPECL[`x:real`;`y:real`;`p:real list`] neg_pos_neq_thm);
639 let lt_nz_thm = prove_by_refinement(
640 `(!x. x1 < x /\ x < x2 ==> poly p x < &0) ==> (!x. x1 < x /\ x < x2 ==> ~(poly p x = &0))`,
643 MESON_TAC[REAL_LT_NZ];
647 let gt_nz_thm = prove_by_refinement(
648 `(!x. x1 < x /\ x < x2 ==> poly p x > &0) ==> (!x. x1 < x /\ x < x2 ==> ~(poly p x = &0))`,
651 MESON_TAC[REAL_LT_NZ;real_gt];
655 let eq_eq_false_thm = prove_by_refinement(
656 `!x y p. x < y ==> (poly p x = &0) ==> (poly p y = &0) ==>
657 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==> F`,
661 REPEAT_N 3 STRIP_TAC;
662 DISCH_THEN (fun x -> MP_TAC (MATCH_MP (ISPEC `p:real list` POLY_MVT) x) THEN ASSUME_TAC x);
665 CLAIM `poly p y - poly p x = &0`;
666 REWRITE_TAC[real_sub];
669 DISCH_THEN (REWRITE_ASSUMS o list);
671 USE_THEN "Z-6" MP_TAC THEN REAL_ARITH_TAC;
672 POP_ASSUM (MP_TAC o ISPEC `x':real`);
674 POP_ASSUM IGNORE THEN POP_ASSUM IGNORE;
678 ASM_MESON_TAC[REAL_ENTIRE;REAL_POS_NZ];
683 let neg_zero_neg_thm = prove_by_refinement(
684 `!x y p. x < y ==> poly p x < &0 ==> (poly p y = &0) ==>
685 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
686 (!z. x < z /\ z < y ==> poly p z < &0)`,
691 REWRITE_TAC[ARITH_RULE `x < y <=> ~(y <= x)`];
692 REWRITE_TAC[ARITH_RULE `x <= y <=> (x < y \/ (x = y))`];
694 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
697 CLAIM `poly p z - poly p x > &0`;
699 USE_THEN "Z-3" MP_TAC;
700 USE_THEN "Z-8" MP_TAC;
703 CLAIM `(z - x) * poly (poly_diff p) x' > &0`;
704 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
705 REWRITE_TAC[real_gt];
706 ASM_REWRITE_TAC[REAL_MUL_GT];
710 USE_THEN "Z-8" MP_TAC THEN REAL_ARITH_TAC;
712 CLAIM `(z - x) * poly (poly_diff p) x' < &0`;
713 REWRITE_TAC[REAL_MUL_LT];
716 ASM_MESON_TAC[REAL_LT_ANTISYM];
718 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
721 CLAIM `&0 - poly p z < &0`;
723 USE_THEN "Z-9" MP_TAC;
728 USE_THEN "Z-11" MP_TAC THEN REAL_ARITH_TAC;
730 CLAIM `(y - z) * poly (poly_diff p) x'' < &0`;
735 ASM_REWRITE_TAC[REAL_MUL_LT];
737 REPEAT_N 3 (POP_ASSUM MP_TAC);
741 MATCH_MP_TAC REAL_LT_TRANS;
745 MP_TAC (ISPECL [`poly_diff p`;`x':real`;`x'':real`] (REWRITE_RULE[real_gt] POLY_IVT_NEG));
746 REWRITE_ASSUMS[real_gt];
749 CLAIM `x < x''' /\ x''' < y`;
751 MATCH_MP_TAC REAL_LT_TRANS;
754 MATCH_MP_TAC REAL_LT_TRANS;
759 MP_TAC (ISPECL[`z:real`;`y:real`;`p:real list`] eq_eq_false_thm);
760 POP_ASSUM (ASSUME_TAC o GSYM);
762 REPEAT_N 2 STRIP_TAC;
763 FIRST_ASSUM MATCH_MP_TAC;
765 MATCH_MP_TAC REAL_LT_TRANS;
772 let pos_zero_pos_thm = prove_by_refinement(
773 `!x y p. x < y ==> poly p x > &0 ==> (poly p y = &0) ==>
774 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
775 (!z. x < z /\ z < y ==> poly p z > &0)`,
780 REWRITE_TAC[ARITH_RULE `x > y <=> ~(y >= x)`];
781 REWRITE_TAC[ARITH_RULE `x >= y <=> (x > y \/ (x = y))`];
783 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
786 CLAIM `poly p z - poly p x < &0`;
788 USE_THEN "Z-3" MP_TAC;
789 USE_THEN "Z-8" MP_TAC;
792 CLAIM `(z - x) * poly (poly_diff p) x' < &0`;
793 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
794 REWRITE_TAC[real_gt];
795 ASM_REWRITE_TAC[REAL_MUL_LT];
799 USE_THEN "Z-8" MP_TAC THEN REAL_ARITH_TAC;
801 CLAIM `&0 < (z - x) * poly (poly_diff p) x'`;
802 REWRITE_TAC[REAL_MUL_GT];
805 ASM_MESON_TAC[REAL_LT_ANTISYM];
807 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
810 CLAIM `&0 - poly p z > &0`;
812 USE_THEN "Z-9" MP_TAC;
817 USE_THEN "Z-11" MP_TAC THEN REAL_ARITH_TAC;
819 CLAIM `(y - z) * poly (poly_diff p) x'' > &0`;
824 ASM_REWRITE_TAC[REAL_MUL_GT;REAL_MUL_LT;real_gt;];
826 REPEAT_N 3 (POP_ASSUM MP_TAC);
830 MATCH_MP_TAC REAL_LT_TRANS;
834 MP_TAC (ISPECL [`poly_diff p`;`x':real`;`x'':real`] (REWRITE_RULE[real_gt] POLY_IVT_POS));
835 REWRITE_ASSUMS[real_gt];
838 CLAIM `x < x''' /\ x''' < y`;
840 MATCH_MP_TAC REAL_LT_TRANS;
843 MATCH_MP_TAC REAL_LT_TRANS;
848 MP_TAC (ISPECL[`z:real`;`y:real`;`p:real list`] eq_eq_false_thm);
849 POP_ASSUM (ASSUME_TAC o GSYM);
851 REPEAT_N 2 STRIP_TAC;
852 FIRST_ASSUM MATCH_MP_TAC;
854 MATCH_MP_TAC REAL_LT_TRANS;
861 let zero_neg_neg_thm = prove_by_refinement(
862 `!x y p. x < y ==> (poly p x = &0) ==> (poly p y < &0) ==>
863 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
864 (!z. x < z /\ z < y ==> poly p z < &0)`,
869 REWRITE_TAC[ARITH_RULE `x < y <=> ~(y <= x)`];
870 REWRITE_TAC[ARITH_RULE `x <= y <=> (x < y \/ (x = y))`];
872 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
875 CLAIM `poly p z - &0 > &0`;
877 USE_THEN "Z-3" MP_TAC;
878 USE_THEN "Z-8" MP_TAC;
881 CLAIM `(z - x) * poly (poly_diff p) x' > &0`;
882 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
883 REWRITE_TAC[real_gt];
884 ASM_REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;];
888 USE_THEN "Z-8" MP_TAC THEN REAL_ARITH_TAC;
890 CLAIM `&0 > (z - x) * poly (poly_diff p) x'`;
891 REWRITE_TAC[REAL_MUL_GT;real_gt;REAL_MUL_LT;];
894 ASM_MESON_TAC[REAL_LT_ANTISYM];
896 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
899 CLAIM `poly p y - poly p z < &0`;
901 USE_THEN "Z-13" MP_TAC;
902 USE_THEN "Z-9" MP_TAC;
907 USE_THEN "Z-11" MP_TAC THEN REAL_ARITH_TAC;
909 CLAIM `(y - z) * poly (poly_diff p) x'' < &0`;
914 ASM_REWRITE_TAC[REAL_MUL_GT;REAL_MUL_LT;real_gt;];
916 REPEAT_N 3 (POP_ASSUM MP_TAC);
920 MATCH_MP_TAC REAL_LT_TRANS;
924 MP_TAC (ISPECL [`poly_diff p`;`x':real`;`x'':real`] (REWRITE_RULE[real_gt] POLY_IVT_NEG));
925 REWRITE_ASSUMS[real_gt];
928 CLAIM `x < x''' /\ x''' < y`;
930 MATCH_MP_TAC REAL_LT_TRANS;
933 MATCH_MP_TAC REAL_LT_TRANS;
938 MP_TAC (ISPECL[`x:real`;`z:real`;`p:real list`] eq_eq_false_thm);
939 POP_ASSUM (ASSUME_TAC o GSYM);
941 REPEAT_N 2 STRIP_TAC;
942 FIRST_ASSUM MATCH_MP_TAC;
944 MATCH_MP_TAC REAL_LT_TRANS;
951 let zero_pos_pos_thm = prove_by_refinement(
952 `!x y p. x < y ==> (poly p x = &0) ==> (poly p y > &0) ==>
953 (!z. x < z /\ z < y ==> ~(poly (poly_diff p) z = &0)) ==>
954 (!z. x < z /\ z < y ==> poly p z > &0)`,
959 REWRITE_TAC[ARITH_RULE `x > y <=> ~(y >= x)`];
960 REWRITE_TAC[ARITH_RULE `x >= y <=> (x > y \/ (x = y))`];
962 MP_TAC (ISPECL [`p:real list`;`z:real`;`y:real`] POLY_MVT);
965 CLAIM `poly p y - poly p z > &0`;
967 USE_THEN "Z-7" MP_TAC;
968 USE_THEN "Z-3" MP_TAC;
971 CLAIM `(y - z) * poly (poly_diff p) x' > &0`;
972 REPEAT_N 2 (POP_ASSUM MP_TAC) THEN REAL_ARITH_TAC;
973 REWRITE_TAC[real_gt];
974 ASM_REWRITE_TAC[REAL_MUL_LT;REAL_MUL_GT;];
977 USE_THEN "Z-1" MP_TAC;
978 USE_THEN "Z-7" MP_TAC;
981 MP_TAC (ISPECL [`p:real list`;`x:real`;`z:real`] POLY_MVT);
984 CLAIM `poly p z - &0 < &0`;
986 USE_THEN "Z-9" MP_TAC;
991 USE_THEN "Z-12" MP_TAC THEN REAL_ARITH_TAC;
993 CLAIM `(z - x) * poly (poly_diff p) x'' < &0`;
998 ASM_REWRITE_TAC[REAL_MUL_GT;REAL_MUL_LT;real_gt;];
1000 REPEAT_N 3 (POP_ASSUM MP_TAC);
1004 MATCH_MP_TAC REAL_LT_TRANS;
1008 MP_TAC (ISPECL [`poly_diff p`;`x'':real`;`x':real`] (REWRITE_RULE[real_gt] POLY_IVT_POS));
1009 REWRITE_ASSUMS[real_gt];
1012 CLAIM `x < x''' /\ x''' < y`;
1014 MATCH_MP_TAC REAL_LT_TRANS;
1017 MATCH_MP_TAC REAL_LT_TRANS;
1022 MP_TAC (ISPECL[`x:real`;`z:real`;`p:real list`] eq_eq_false_thm);
1023 POP_ASSUM (ASSUME_TAC o GSYM);
1025 REPEAT_N 2 STRIP_TAC;
1026 FIRST_ASSUM MATCH_MP_TAC;
1028 MATCH_MP_TAC REAL_LT_TRANS;