1 (* ========================================================================== *)
2 (* FLYSPECK - BOOK FORMALIZATION *)
3 (* Section: Counting Spheres *)
5 (* Author: Thomas C. Hales *)
7 (* ========================================================================== *)
10 to put all terms over a common denominator :
12 rationalize `-- (v/ u pow 3)/(&1/x + &3 * (-- (u /( v * inv (w)))))`;;
14 To prove a rational identity, modulo accumulated side conditions:
16 rational_identity `&1 / (x + y) - &1 / (x - y) = -- &2 * y / (x pow 2 - y pow 2)`;;
22 written to automate the calculation of derivatives, with accumulating side conditions.
23 It implements --, -, +, *, /, inv, pow, sqrt, sin, cos, atn, asn, acs, chain rule.
25 To recover results without "within" use:
27 "WITHINREAL_UNIV", |- !a. atreal x within (:real) = atreal x)
29 derived_form p f f' x s means:
30 Under the assumption p, the derivative of the function f evaluated at x,
32 is equal to the real number f'.
34 Apply REWRITE_RULE[derived_form] to express the result back in terms of
37 (* A rational inequality implies a polynomial ineq with
38 denominators cleared. Allowed ops <,>, <=,>=,=,~=,*)
40 val rational_ineq_rule : thm -> thm
48 To calculate the derivative of tm with respect to q, evaluated at x, on the interval s:
52 let s = `{t | t > &0}` in
53 let tm = `(\q:real. (q - sin(q pow 3) + q pow 7 + y)/(q pow 2 + q pow 4 *(&33 + &43 * q)) + (q pow 3) * ((q pow 2) / (-- (q pow 3))))` in
54 differentiate tm x s;;
59 module Calc_derivative
64 val rationalize_ratform: term -> thm
66 val rationalize: term -> thm
67 val rational_identity:term -> thm
68 val rational_ineq_rule : thm -> thm
70 val invert_den_lt :thm
71 val invert_den_le: thm
74 val differentiate:term -> term -> term -> thm
79 (* ========================================================================== *)
80 (* RATIONALIZE CONVERSION *)
84 rationalize puts everything over a common denominator, accumulating
85 assumptions as it goes.
89 let ratform = new_definition `ratform p r a b = (p ==> ~(b = &0) /\ (r = a/b))`;;
91 let ratform_tac = REWRITE_TAC [ratform] THEN
92 REPEAT STRIP_TAC THENL
93 [ASM_MESON_TAC[REAL_ENTIRE] ;
94 REPEAT (FIRST_X_ASSUM (fun t -> MP_TAC t THEN ANTS_TAC THEN
95 ASM_REWRITE_TAC[])) THEN
97 ASM_REWRITE_TAC[] THEN
98 REPEAT (POP_ASSUM MP_TAC) THEN
99 CONV_TAC REAL_FIELD];;
101 let REAL_POW_NEQ_0 = prove_by_refinement(
102 `!x n. ~(x pow n = &0) <=> ~(x = &0) \/ (n = 0)`,
105 MESON_TAC[REAL_POW_EQ_0];
109 let ratform_pow = prove_by_refinement(
110 `ratform p1 r1 a1 b1 ==> ratform p1 (r1 pow n) (a1 pow n) (b1 pow n)`,
113 REWRITE_TAC[GSYM REAL_POW_DIV;ratform];
114 MESON_TAC[REAL_POW_NEQ_0;];
118 let ratform_add = prove_by_refinement(
119 `ratform p1 r1 a1 b1 /\ ratform p2 r2 a2 b2 ==> ratform (p1 /\ p2) (r1 + r2) (a1 * b2 + b1 * a2) (b1 * b2)`,
126 let ratform_sub = prove_by_refinement(
127 `ratform p1 r1 a1 b1 /\ ratform p2 r2 a2 b2 ==> ratform (p1 /\ p2) (r1 - r2) (a1 * b2 - b1 * a2) (b1 * b2)`,
134 let ratform_neg = prove_by_refinement(
135 `ratform p1 r1 a1 b1 ==> ratform p1 (-- r1 ) (-- a1 ) (b1)`,
142 let ratform_mul = prove_by_refinement(
143 `ratform p1 r1 a1 b1 /\ ratform p2 r2 a2 b2 ==> ratform (p1 /\ p2) (r1 * r2) (a1 * a2) (b1 * b2)`,
150 let ratform_div = prove_by_refinement(
151 `ratform p1 r1 a1 b1 /\ ratform p2 r2 a2 b2 ==> ratform (p1 /\ p2 /\ ~(a2 = &0)) (r1 / r2) (a1 * b2) (b1 * a2)`,
158 let ratform_inv = prove_by_refinement(
159 `ratform p1 r1 a1 b1 ==> ratform (p1 /\ ~(a1= &0)) (inv r1) b1 a1`,
162 REWRITE_TAC [ratform;];
164 ASM_MESON_TAC[REAL_ENTIRE];
165 REPEAT (FIRST_X_ASSUM (fun t -> MP_TAC t THEN ANTS_TAC THEN ASM_REWRITE_TAC[]));
167 ASM_REWRITE_TAC[REAL_INV_DIV];
171 let trivial_ratform = prove_by_refinement(
172 `!t. ratform T t t (&1)`,
175 REWRITE_TAC[ratform];
180 let pre_rationalize =
181 let binop_assoc = [(`(+)`,ratform_add);
182 (`( * )`,ratform_mul);(`( - )`,ratform_sub);
183 (`( / )`,ratform_div)] in
184 let unary_assoc = [(` ( -- )`,ratform_neg);(`inv`,ratform_inv)] in
185 let rec pre_rationalize tm =
187 let (x,y) = dest_binop `(pow)` tm in
188 MATCH_MP (INST [y,`n:num`] ratform_pow) (pre_rationalize x)
192 let h = fst (strip_comb tm) in
193 let bin_th = assoc h binop_assoc in
194 let (x,y) = dest_binop h tm in
195 MATCH_MP bin_th (CONJ (pre_rationalize x) (pre_rationalize y))
199 let (h,x) = dest_comb tm in
200 let un_th = assoc h unary_assoc in
201 MATCH_MP un_th (pre_rationalize x)
203 with _ -> SPEC tm trivial_ratform) in
207 let ra = REAL_ARITH `&1 * x = x /\ x * &1 = x /\ &0 * x = &0 /\
208 x * &0 = &0 /\ &0+x = x /\ x + &0 = x /\ x - &0 = x /\ &0 - x = -- x ` in
209 REWRITE_CONV[REAL_POW_NEQ_0;GSYM CONJ_ASSOC;
210 TAUT `~(p \/ q) <=> ~p /\ ~q`;
211 REAL_POW_POW;REAL_POW_1;real_pow;REAL_POW_ONE;
214 THENC NUM_REDUCE_CONV;;
216 let dest_ratform rf = snd(strip_comb rf);;
218 let rationalize_ratform =
219 let rc = clean_conv in
220 let clean_ratform = MESON[]
221 `ratform p r a b /\ (p = p') /\ (a = a') /\ (b = b') ==> ratform p' r a' b'` in
223 let pr = pre_rationalize tm in
224 let [p;_;a;b] = dest_ratform (concl pr) in
228 MATCH_MP clean_ratform (end_itlist CONJ [pr;p';a';b']);;
231 REWRITE_RULE[ratform] o rationalize_ratform;;
234 rationalize `-- (v/ u pow 3)/(&1/x + &3 * (-- (u /( v * inv (w)))))`;;
238 let lite_imp = prove_by_refinement(
239 `ratform p (u - v) a b /\ (p = p') /\ (a = &0) ==> (p' ==> (u = v))`,
242 REWRITE_TAC[ratform];
243 ASM_MESON_TAC[REAL_ARITH `(u = v) <=> u - v = &0 /b`];
247 let lite_imp2 = prove_by_refinement(
248 `ratform p (u - v) a b /\ (p = p') /\ (a = a') ==> ((p' /\ (a' = &0)) ==> (u = v))`,
251 REWRITE_TAC[ratform];
252 ASM_MESON_TAC[REAL_ARITH `(u = v) <=> u - v = &0 /b`];
256 let rational_identity =
259 let (lhs,rhs) = dest_eq tm in
260 let diff = mk_binop sub lhs rhs in
261 let rf = pre_rationalize diff in
262 let [p;_;a;_]=dest_ratform (concl rf) in
263 let p' = clean_conv p in
264 let a' = clean_conv a in
266 let zero = REAL_FIELD (mk_eq (a,`&0`)) in
267 MATCH_MP (lite_imp) (end_itlist CONJ [rf ;p';zero])
269 with _ -> MATCH_MP (lite_imp2) (end_itlist CONJ [rf;p';a']);;
271 let CALC_ID_TAC gl = (MATCH_MP_TAC (rational_identity (goal_concl gl))) gl;;
273 let invert_den_lt = prove_by_refinement(
274 `!a b. &0 < a/b <=> &0 < a*b`,
278 REWRITE_TAC [real_div];
279 REWRITE_TAC [REAL_MUL_POS_LT];
280 REWRITE_TAC [REAL_ARITH `inv x < &0 <=> &0 < -- inv x`];
281 REWRITE_TAC [GSYM REAL_INV_NEG];
282 REWRITE_TAC [REAL_LT_INV_EQ];
287 let invert_den_le = prove_by_refinement(
288 `!a b. &0 <= a/b <=> &0 <= a*b`,
292 REWRITE_TAC [real_div];
293 REWRITE_TAC [REAL_MUL_POS_LE];
294 REWRITE_TAC [REAL_ARITH `inv x < &0 <=> &0 < -- inv x`];
295 REWRITE_TAC [GSYM REAL_INV_NEG];
296 REWRITE_TAC [REAL_LT_INV_EQ;Real_ext.REAL_PROP_ZERO_INV];
301 let invert_den_eq = prove_by_refinement(
302 `!a b. (a/b = &0) <=> ( a*b = &0)`,
306 REWRITE_TAC [real_div];
307 REWRITE_TAC [REAL_ENTIRE];
308 REWRITE_TAC [REAL_LT_INV_EQ;Real_ext.REAL_PROP_ZERO_INV];
312 let imp_lt = prove_by_refinement(
313 `!p p' x a a' b b'. (&0 < x) /\ (ratform p x a b) /\ (p = p') /\ (a = a') /\ (b = b') ==> (p' ==> &0 < a' * b')`,
316 REWRITE_TAC [ratform];
318 ASM_MESON_TAC [invert_den_lt]
323 let imp_le = prove_by_refinement(
324 `!p p' x a a' b b'. (&0 <= x) /\ (ratform p x a b) /\ (p = p') /\ (a = a') /\ (b = b') ==> (p' ==> &0 <= a' * b')`,
327 REWRITE_TAC [ratform];
329 ASM_MESON_TAC [invert_den_le]
333 let imp_eq = prove_by_refinement(
334 `!p p' x a a' b b'. (x= &0) /\ (ratform p x a b) /\ (p = p') /\ (a = a') /\ (b = b') ==> (p' /\ ~(b' = &0) ==> (a'= &0 ))`,
337 REWRITE_TAC [ratform];
339 ASM_MESON_TAC [invert_den_eq;REAL_ENTIRE]
344 let imp_nz = prove_by_refinement(
345 `!p p' x a a' b b'. ~(x= &0) /\ (ratform p x a b) /\ (p = p') /\ (a = a') /\ (b = b') ==> (p' ==> (~(a' = &0) /\ ~(b' = &0)))`,
348 REWRITE_TAC [ratform];
349 REPEAT STRIP_TAC THEN ASM_MESON_TAC [invert_den_eq;REAL_ENTIRE]
356 let (a,b) = dest_comb tm in
357 let _ = (a = neg) or failwith "not a negation" in
360 (* clear the denominator of an inequality *)
362 let rational_ineq_rule =
365 let ra1 = REAL_ARITH `a < b <=> &0 < b - a` in
366 let ra2 = REAL_ARITH `a <= b <=> &0 <= b - a` in
367 let ra3 = REAL_ARITH `(x = y) <=> (x - y = &0)` in
369 [snd o (dest_binop lt ), imp_lt;
370 snd o (dest_binop le ), imp_le;
371 fst o (dest_eq ), imp_eq;
372 fst o (dest_nz), imp_nz] in
374 let thm' = REWRITE_RULE[real_gt;real_ge] thm in
375 let thm' = ONCE_REWRITE_RULE [ra1] thm' in
376 let thm' = ONCE_REWRITE_RULE [ra2] thm' in
377 let thm' = ONCE_REWRITE_RULE [ra3] thm' in
378 let (diff,imp) = tryfind (fun (d,imp) -> (d(concl thm'),imp)) ineq_types in
379 let rf = pre_rationalize diff in
380 let [p;_;a;b]=dest_ratform (concl rf) in
381 let p' = clean_conv p in
382 let a' = clean_conv a in
383 let b' = clean_conv b in
384 let thm' = MATCH_MP (imp) (end_itlist CONJ [thm';rf ;p';a';b']) in
389 rational_identity `(&1 / u - &1/v) pow 2 = inv u pow 2 - &2 * inv (u * v) + inv v pow 2`;;
391 rational_identity `&1 / (x + y) - &1 / (x - y) = -- &2 * y / (x pow 2 - y pow 2)`;;
393 rational_ineq_rule (ASSUME `a / (b * e) < c / (&2 * b)`);;
398 (* ========================================================================== *)
402 let derived_form = new_definition
403 `derived_form p f f' x s = (p ==> (f has_real_derivative f') (atreal x within s))`;;
405 let deriv_tac = REWRITE_TAC[derived_form] THEN
406 (* REPEAT GEN_TAC THEN
408 REWRITE_TAC[] THEN *)
409 REPEAT STRIP_TAC THEN
410 ASM_REWRITE_TAC[] THEN
411 FIRST (map MATCH_MP_TAC [
412 HAS_REAL_DERIVATIVE_ADD;
413 HAS_REAL_DERIVATIVE_SUB;
414 HAS_REAL_DERIVATIVE_MUL_ATREAL;
415 HAS_REAL_DERIVATIVE_MUL_WITHIN;
416 HAS_REAL_DERIVATIVE_DIV_ATREAL;
417 HAS_REAL_DERIVATIVE_DIV_WITHIN;
418 HAS_REAL_DERIVATIVE_NEG;
419 HAS_REAL_DERIVATIVE_POW_WITHIN;
420 HAS_REAL_DERIVATIVE_POW_ATREAL
427 let derived_form_add = prove_by_refinement(
428 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s /\ (u = (\x. f1 x + f2 x)) ==> derived_form (p1 /\ p2) u (f1'+f2') x s`,
435 let derived_form_sub = prove_by_refinement(
436 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s /\ (u = (\x. f1 x - f2 x)) ==> derived_form (p1 /\ p2) u (f1'-f2') x s`,
443 let derived_form_mul = prove_by_refinement(
444 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s /\ (u = (\x. f1 x * f2 x)) ==> derived_form (p1 /\ p2) u (f1 x * f2' + f1' * f2 x) x s`,
451 let derived_form_div = prove_by_refinement(
452 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s /\ (u = (\x. f1 x / f2 x) ) ==> derived_form (p1 /\ p2 /\ ~(f2 x = &0)) u ((f1' * f2 x - f1 x * f2')/(f2 x pow 2)) x s`,
459 let derived_form_neg = prove_by_refinement(
460 `!x s. derived_form p1 f1 f1' x s /\ (u = (\x. -- f1 x)) ==> derived_form p1 u (-- f1') x s`,
467 let derived_form_pow = prove_by_refinement(
468 `!x s. derived_form p f f' x s /\ (u = (\x. f x pow n)) ==> derived_form p u (&n * f x pow (n-1)* f') x s`,
475 let deriv_fn_tac = REPEAT STRIP_TAC THEN
476 ASM_REWRITE_TAC[derived_form] THEN
477 (* COND_CASES_TAC THEN *)
478 ASM_MESON_TAC[ HAS_REAL_DERIVATIVE_CONST;
479 HAS_REAL_DERIVATIVE_ATREAL_WITHIN;
480 HAS_REAL_DERIVATIVE_SIN;
481 HAS_REAL_DERIVATIVE_COS;
482 HAS_REAL_DERIVATIVE_SQRT;
483 HAS_REAL_DERIVATIVE_ATN;
484 HAS_REAL_DERIVATIVE_ACS;
485 HAS_REAL_DERIVATIVE_ASN;
486 HAS_REAL_DERIVATIVE_INV_BASIC;
489 let derived_form_const = prove_by_refinement(
490 `!x s. (u = \x. c) ==> derived_form T u (&0) x s`,
497 let derived_form_sin = prove_by_refinement(
498 `!x s. derived_form T sin (cos x) x s`,
505 let derived_form_cos = prove_by_refinement(
506 `!x s. derived_form T cos (-- sin x) x s`,
513 let derived_form_sqrt = prove_by_refinement(
514 `!x s. derived_form (&0 < x) sqrt (inv (&2 * sqrt x)) x s`,
521 let derived_form_atn = prove_by_refinement(
522 `!x s. derived_form T atn (inv (&1 + x pow 2)) x s`,
529 let derived_form_acs = prove_by_refinement(
530 `!x s. derived_form (abs x < &1) acs (-- inv (sqrt(&1 - x pow 2))) x s`,
537 let derived_form_asn = prove_by_refinement(
538 `!x s. derived_form (abs x < &1) asn ( inv (sqrt(&1 - x pow 2))) x s`,
546 let derived_form_inv = prove_by_refinement(
547 `!x s. derived_form (~(x = &0)) inv (-- inv (x pow 2)) x s`,
554 let derived_form_id = prove_by_refinement(
555 `!x s. (u = (\x. x)) ==>derived_form T u (&1) x s`,
559 ASM_REWRITE_TAC[derived_form;HAS_REAL_DERIVATIVE_ID];
563 let derived_form_chain = prove_by_refinement(
564 `!x s. derived_form p g g' (f x) (:real) /\ derived_form p' f f' x s /\ (u = (\x. g(f x))) ==> derived_form (p /\ p' ) u (f' * g') x s`,
567 REWRITE_TAC[derived_form];
569 MP_TAC (SPECL [`(\t. ((t = (f:real->real) x) /\ p))`;`(f:real->real)`;`(g:real->real)`] (INST [`(\(t:real). (g':real))`,`g':real->real`] HAS_REAL_DERIVATIVE_CHAIN));
573 ASM_MESON_TAC[WITHINREAL_UNIV];
574 REPEAT (POP_ASSUM MP_TAC);
585 let derived_form_add = prove_by_refinement(
586 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s ==> derived_form (p1 /\ p2) (\x. f1 x + f2 x) (f1'+f2') x s`,
593 let derived_form_sub = prove_by_refinement(
594 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s ==> derived_form (p1 /\ p2) (\x. f1 x - f2 x) (f1'-f2') x s`,
601 let derived_form_mul = prove_by_refinement(
602 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s ==> derived_form (p1 /\ p2) (\x. f1 x * f2 x) (f1 x * f2' + f1' * f2 x) x s`,
609 let derived_form_div = prove_by_refinement(
610 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s ==> derived_form (p1 /\ p2 /\ ~(f2 x = &0)) (\x. f1 x / f2 x) ((f1' * f2 x - f1 x * f2')/(f2 x pow 2)) x s`,
617 (* moved to function section.
618 let derived_form_neg = prove_by_refinement(
619 `!x s. derived_form p1 f1 f1' x s ==> derived_form p1 (\x. -- f1 x) (-- f1') x s`,
627 let derived_form_pow = prove_by_refinement(
628 `!n x s. derived_form p f f' x s ==> derived_form p (\x. f x pow n) (&n * f x pow (n-1)* f') x s`,
635 let deriv_fn_tac = REPEAT STRIP_TAC THEN
636 ASM_REWRITE_TAC[derived_form] THEN
637 (* COND_CASES_TAC THEN *)
638 ASM_MESON_TAC[ HAS_REAL_DERIVATIVE_CONST;
639 HAS_REAL_DERIVATIVE_ATREAL_WITHIN;
640 HAS_REAL_DERIVATIVE_SIN;
641 HAS_REAL_DERIVATIVE_COS;
642 HAS_REAL_DERIVATIVE_SQRT;
643 HAS_REAL_DERIVATIVE_ATN;
644 HAS_REAL_DERIVATIVE_ACS;
645 HAS_REAL_DERIVATIVE_ASN;
646 HAS_REAL_DERIVATIVE_INV_BASIC;
649 let derived_form_neg = prove_by_refinement(
650 `!x s. derived_form T ( -- ) (-- &1) x s`,
654 REWRITE_TAC[derived_form];
655 SUBGOAL_THEN `( -- ) = (\x. --x)` SUBST1_TAC;
659 MATCH_MP_TAC HAS_REAL_DERIVATIVE_NEG;
660 REWRITE_TAC[HAS_REAL_DERIVATIVE_ID];
664 let derived_form_const = prove_by_refinement(
665 `!c x s. derived_form T (\x. c) (&0) x s`,
672 let derived_form_sin = prove_by_refinement(
673 `!x s. derived_form T sin (cos x) x s`,
680 let derived_form_cos = prove_by_refinement(
681 `!x s. derived_form T cos (-- sin x) x s`,
688 let derived_form_sqrt = prove_by_refinement(
689 `!x s. derived_form (&0 < x) sqrt (inv (&2 * sqrt x)) x s`,
696 let derived_form_atn = prove_by_refinement(
697 `!x s. derived_form T atn (inv (&1 + x pow 2)) x s`,
704 let derived_form_acs = prove_by_refinement(
705 `!x s. derived_form (abs x < &1) acs (-- inv (sqrt(&1 - x pow 2))) x s`,
712 let derived_form_asn = prove_by_refinement(
713 `!x s. derived_form (abs x < &1) asn ( inv (sqrt(&1 - x pow 2))) x s`,
721 let derived_form_inv = prove_by_refinement(
722 `!x s. derived_form (~(x = &0)) inv (-- inv (x pow 2)) x s`,
729 let derived_form_id = prove_by_refinement(
730 `!x s. derived_form T (\x. x) (&1) x s`,
734 ASM_REWRITE_TAC[derived_form;HAS_REAL_DERIVATIVE_ID];
738 let derived_form_chain = prove_by_refinement(
739 `!x s. derived_form p g g' (f1 x) (:real) /\ derived_form p' f2 f' x s /\ (f1=f2) ==> derived_form (p /\ p' ) (\x. g(f1 x)) (f' * g') x s`,
742 REWRITE_TAC[derived_form];
744 MP_TAC (SPECL [`(\t. ((t = (f1:real->real) x) /\ p))`;`(f1:real->real)`;`(g:real->real)`] (INST [`(\(t:real). (g':real))`,`g':real->real`] HAS_REAL_DERIVATIVE_CHAIN));
748 ASM_MESON_TAC[WITHINREAL_UNIV];
749 REPEAT (POP_ASSUM MP_TAC);
756 let derived_form_generic = prove_by_refinement(
757 `!f f' x s. derived_form (derived_form T f (f') x s) f (f') x s`,
760 REWRITE_TAC[derived_form];
764 (* START OF NICK VOLKER'S CODE *)
767 let region_conv = prove_by_refinement(
768 `!(x:real) (y:real). ~(y = &0 /\ x <= &0) ==> (x > &0) \/ (y < &0) \/ (y > &0)`,
774 let x2notless0 = prove_by_refinement(`!x:real. ~(x pow 2 < &0)`,
777 SUBGOAL_THEN `x = &0 ==> ~(x pow 2 < &0)` MP_TAC;
779 MP_TAC (SPECL[`x:real`] Trigonometry2.POW2_EQ_0);
782 SUBGOAL_THEN `~(x = &0) ==> ~(x pow 2 < &0)` MP_TAC;
784 MP_TAC (SPECL[`x:real`] (GENL[`a:real`] Trigonometry2.NOT_ZERO_EQ_POW2_LT));
787 MP_TAC (REAL_FIELD `&0 < x pow 2 ==> ~(x pow 2 < &0)`);
792 let x2notlesseq0 = prove_by_refinement(`!x:real. ~(x = &0) ==> ~(x pow 2 <= &0)`,
796 MP_TAC (SPECL[`x:real`] (GENL[`a:real`] Trigonometry2.NOT_ZERO_EQ_POW2_LT));
799 MP_TAC (REAL_FIELD `&0 < x pow 2 ==> ~(x pow 2 <= &0)`);
803 let sumsquaresnot0 = prove_by_refinement(`!x:real y:real. ~(x = &0) ==> ~(x pow 2 + y pow 2 <= &0)`,
808 MP_TAC (SPECL[`x:real`] x2notlesseq0);
811 MP_TAC (SPECL[`y:real`] x2notless0);
813 MP_TAC (REAL_ARITH `~(x pow 2 <= &0) /\ ~(y pow 2 < &0) ==> ~(x pow 2 + y pow 2 <= &0)`);
817 let notzerodenom = prove_by_refinement(`!a:real b:real c:real d:real. (~(b = &0) ==> (a*b - c*d)/(b pow 2) * inv (&1 + (c/b) pow 2) = (a*b - c*d)/(b pow 2 + c pow 2))`,
820 MP_TAC (SPECL [`b:real`;`c:real`] sumsquaresnot0);
823 MP_TAC (REAL_FIELD `~(b = &0) /\ ~(b pow 2 + c pow 2 <= &0) ==> (a*b - c*d)/(b pow 2) * inv (&1 + (c/b) pow 2) = (a*b - c*d)/(b pow 2 + c pow 2)`);
827 let notzerodenom2 = prove_by_refinement(`!a:real b:real c:real d:real. (~(c = &0) ==> (a*b - c*d)/(c pow 2) * inv (&1 + (b/c) pow 2) = (a*b - c*d)/(b pow 2 + c pow 2))`,
830 MP_TAC (SPECL [`c:real`;`b:real`] sumsquaresnot0);
833 MP_TAC (REAL_FIELD `~(c = &0) /\ ~(c pow 2 + b pow 2 <= &0) ==> (a*b - c*d)/(c pow 2) * inv (&1 + (b/c) pow 2) = (a*b - c*d)/(b pow 2 + c pow 2)`);
838 let derived_imp_pos_open = prove_by_refinement(
839 `!p f f' x s. p /\ derived_form p f f' x s /\ &0 < f x ==>
840 (?d. &0 < d /\ (!x'. x' IN s /\ abs (x' - x) < d ==> &0 < f x'))`,
843 REWRITE_TAC[derived_form];
844 REWRITE_TAC[TAUT `(a /\ (a ==> b) /\ c) <=> (a /\ b /\ c)`];
846 FIRST_X_ASSUM (MP_TAC o ( MATCH_MP HAS_REAL_DERIVATIVE_IMP_CONTINUOUS_WITHINREAL ));
847 REWRITE_TAC[real_continuous_withinreal];
848 DISCH_THEN (MP_TAC o (SPEC `(f:real->real) x`));
854 FIRST_X_ASSUM (MP_TAC o (SPEC `x':real`));
859 let derived_imp_pos_open_2 = prove_by_refinement(
860 `!p g g' x s. p /\ derived_form p g g' x s /\ &0 < g x ==>
861 (?d. &0 < d /\ (!x'. x' IN s /\ abs (x' - x) < d ==> &0 < g x'))`,
864 REWRITE_TAC[derived_form];
865 REWRITE_TAC[TAUT `(a /\ (a ==> b) /\ c) <=> (a /\ b /\ c)`];
867 FIRST_X_ASSUM (MP_TAC o ( MATCH_MP HAS_REAL_DERIVATIVE_IMP_CONTINUOUS_WITHINREAL ));
868 REWRITE_TAC[real_continuous_withinreal];
869 DISCH_THEN (MP_TAC o (SPEC `(g:real->real) x`));
875 FIRST_X_ASSUM (MP_TAC o (SPEC `x':real`));
880 let derived_imp_pos_open_3 = prove_by_refinement(
881 `!p g g' x s. p /\ derived_form p g g' x s /\ &0 > g x==>
882 (?d. &0 < d /\ (!x'. x' IN s /\ abs (x' - x) < d ==> &0 > g x' ))`,
885 REWRITE_TAC[REAL_ARITH ` &0 > g x <=> &0 < --(g x)`];
886 REWRITE_TAC[derived_form];
887 REWRITE_TAC[TAUT `(a /\ (a ==> b) /\ c) <=> (a /\ b /\ c)`];
889 FIRST_X_ASSUM (MP_TAC o ( MATCH_MP HAS_REAL_DERIVATIVE_IMP_CONTINUOUS_WITHINREAL ));
890 REWRITE_TAC[real_continuous_withinreal];
891 DISCH_THEN (MP_TAC o (SPEC `--(g:real->real) x`));
897 FIRST_X_ASSUM (MP_TAC o (SPEC `x':real`));
902 let deriv_pi = prove_by_refinement(
903 `!(x:real) s. derived_form T (\x. (pi / &2)) (&0) x s`,
905 MP_TAC (SPECL [`(pi / &2)`] derived_form_const);
909 let deriv_pi_minus = prove_by_refinement(
910 `!(x:real) pf f f' s. derived_form pf f f' x s ==> derived_form (T /\pf) (\x. (pi / &2) - f x) (&0 - f') x s`,
913 MP_TAC (SPECL[`x:real`;`s:real->bool`] deriv_pi);
915 MATCH_MP_TAC derived_form_sub;
919 let deriv_minus_pi = prove_by_refinement(
920 `!(x:real) s. derived_form T (\x. --(pi / &2)) (&0) x s`,
922 MP_TAC (SPECL [`--(pi / &2)`] derived_form_const);
926 let deriv_minus_pi_minus = prove_by_refinement(
927 `!(x:real) pf f f' s. derived_form pf f f' x s ==> derived_form (T /\pf) (\x. --(pi / &2) - f x) (&0 - f') x s`,
930 MP_TAC (SPECL[`x:real`;`s:real->bool`] deriv_minus_pi);
932 MATCH_MP_TAC derived_form_sub;
936 let derived_form_chain_simple = prove_by_refinement(
937 `!x s g g' f f' p p'.
938 derived_form p g g' (f x) (:real) /\
939 derived_form p' f f' x s
940 ==> derived_form (p /\ p') (\x. g (f x)) (f' * g') x s`,
943 MESON_TAC[derived_form_chain]
946 let atn_lemma = prove_by_refinement(
947 `!x pf f f' pg g g' s. (&0 < f x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form (T /\ (pg /\ pf)) (\x. atn( g x / f x)) ((g' * f x - g x * f')/(f x pow 2) *inv (&1 + (g x / f x) pow 2)) x s`,
951 MATCH_MP_TAC derived_form_chain_simple;
952 REWRITE_TAC[derived_form_atn];
953 MP_TAC (REAL_ARITH `&0 < (f:real->real) x ==> ~(f x = &0)`);
954 SUBGOAL_THEN `derived_form (pg /\ pf /\ ~(f x = &0)) (\x. g x / f x) ((g' * f x - g x * f') / f x pow 2) x s` MP_TAC;
955 MATCH_MP_TAC derived_form_div;
957 ASM_REWRITE_TAC[derived_form];
959 FIRST_X_ASSUM MATCH_MP_TAC;
963 let atn_notpi_lemma = prove_by_refinement(
964 `!x pf f f' pg g g' s. (&0 < g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form (T /\ (pf /\ pg)) (\x. atn( f x / g x)) ((f' * g x - f x * g')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s`,
968 MATCH_MP_TAC derived_form_chain_simple;
969 REWRITE_TAC[derived_form_atn];
970 MP_TAC (REAL_ARITH `&0 < (g:real->real) x ==> ~(g x = &0)`);
971 SUBGOAL_THEN `derived_form (pf /\ pg /\ ~(g x = &0)) (\x. f x / g x) ((f' * g x - f x * g') / g x pow 2) x s` MP_TAC;
972 MATCH_MP_TAC derived_form_div;
974 ASM_REWRITE_TAC[derived_form];
976 FIRST_X_ASSUM MATCH_MP_TAC;
980 let atn_notnegpi_lemma = prove_by_refinement(
981 `!x pf f f' pg g g' s. (&0 > g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form (T /\ (pf /\ pg)) (\x. atn( f x / g x)) ((f' * g x - f x * g')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s`,
985 MATCH_MP_TAC derived_form_chain_simple;
986 REWRITE_TAC[derived_form_atn];
987 MP_TAC (REAL_ARITH `&0 > (g:real->real) x ==> ~(g x = &0)`);
988 SUBGOAL_THEN `derived_form (pf /\ pg /\ ~(g x = &0)) (\x. f x / g x) ((f' * g x - f x * g') / g x pow 2) x s` MP_TAC;
989 MATCH_MP_TAC derived_form_div;
991 ASM_REWRITE_TAC[derived_form];
993 FIRST_X_ASSUM MATCH_MP_TAC;
997 let atn_lemma_2 = prove_by_refinement (
998 `!x pf f f' pg g g' s. (&0 < g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form (T /\ (pf /\ pg)) (\x. (pi / &2) - atn( f x / g x)) ((g' * f x - g x * f')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s`,
1001 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn_notpi_lemma);
1004 UNDISCH_THEN `derived_form (pf /\ pg) (\x. atn (f x / g x)) ((f' * g x - f x * g') / g x pow 2 * inv (&1 + (f x / g x) pow 2)) x s` (MP_TAC o (MATCH_MP deriv_pi_minus));
1005 (*REWRITE_TAC[REAL_ARITH `(&0 - (a*d -b*c))/u*v = (c*b - d*a)/u*v`]; *)
1006 UNDISCH_TAC `derived_form pf f f' x s`;
1007 UNDISCH_TAC `derived_form pg g g' x s`;
1008 REWRITE_TAC[derived_form];
1010 SUBGOAL_THEN `((\x. pi / &2 - atn (f x / g x)) has_real_derivative
1012 (f' * g x - f x * g') / g x pow 2 * inv (&1 + (f x / g x) pow 2))
1013 (atreal x within s)` MP_TAC;
1015 SUBGOAL_THEN `!(f:real->real) (g:real->real). (&0 - (f' * g x - f x * g') / g x pow 2 * inv (&1 + (f x / g x) pow 2)) = ((g' * f x - g x * f') / g x pow 2 * inv (&1 + (f x / g x) pow 2))` MP_TAC;
1022 let atn_lemma_3 = prove_by_refinement (
1023 `!x pf f f' pg g g' s. (&0 > g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form (T /\ (pf /\ pg)) (\x. --(pi / &2) - atn( f x / g x)) ((g' * f x - g x * f')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s`,
1026 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn_notnegpi_lemma);
1029 UNDISCH_THEN `derived_form (pf /\ pg) (\x. atn (f x / g x)) ((f' * g x - f x * g') / g x pow 2 * inv (&1 + (f x / g x) pow 2)) x s` (MP_TAC o (MATCH_MP deriv_minus_pi_minus));
1030 (*REWRITE_TAC[REAL_ARITH `(&0 - (a*d -b*c))/u*v = (c*b - d*a)/u*v`]; *)
1031 UNDISCH_TAC `derived_form pf f f' x s`;
1032 UNDISCH_TAC `derived_form pg g g' x s`;
1033 REWRITE_TAC[derived_form];
1035 SUBGOAL_THEN `((\x. --(pi / &2) - atn (f x / g x)) has_real_derivative
1037 (f' * g x - f x * g') / g x pow 2 * inv (&1 + (f x / g x) pow 2))
1038 (atreal x within s)` MP_TAC;
1040 SUBGOAL_THEN `!(f:real->real) (g:real->real). (&0 - (f' * g x - f x * g') / g x pow 2 * inv (&1 + (f x / g x) pow 2)) = ((g' * f x - g x * f') / g x pow 2 * inv (&1 + (f x / g x) pow 2))` MP_TAC;
1047 let atn2_atn_open = prove_by_refinement(
1048 `!p f f' g x s. p /\ derived_form p f f' x s /\ (&0 < f x)==>
1049 (?d. &0 < d /\ (!x'. x' IN s /\ abs (x' - x) < d ==>
1050 atn2 (f x', g x') = atn(g x' / f x')))`,
1054 (DISCH_THEN (MP_TAC o (MATCH_MP derived_imp_pos_open)));
1056 (EXISTS_TAC `d:real`);
1057 (ASM_REWRITE_TAC[]);
1059 (SUBGOAL_THEN `&0 < ((f:real->real) x')` MP_TAC);
1061 (MP_TAC (MATCH_MP (TAUT `a /\ b /\ c /\ d ==> a`) (SPECL [`((f:real->real) x')`;`((g:real->real) x')`] Trigonometry1.ATN2_BREAKDOWN)));
1065 let atn2_atn_open_2 = prove_by_refinement(
1066 `!p g g' f x s. p /\ derived_form p g g' x s /\ (&0 < g x)==>
1067 (?d. &0 < d /\ (!x'. x' IN s /\ abs (x' - x) < d ==>
1068 atn2 (f x', g x') = (pi / &2 - atn(f x' / g x'))))`,
1072 (DISCH_THEN (MP_TAC o (MATCH_MP derived_imp_pos_open)));
1074 (EXISTS_TAC `d:real`);
1075 (ASM_REWRITE_TAC[]);
1077 (SUBGOAL_THEN `&0 < ((g:real->real) x')` MP_TAC);
1079 (MP_TAC (MATCH_MP (TAUT `a /\ b /\ c /\ d ==> b`) (SPECL [`((f:real->real) x')`;`((g:real->real) x')`] Trigonometry1.ATN2_BREAKDOWN)));
1083 let atn2_atn_open_3 = prove_by_refinement(
1084 `!p g g' f x s. p /\ derived_form p g g' x s /\ (&0 > g x)==>
1085 (?d. &0 < d /\ (!x'. x' IN s /\ abs (x' - x) < d ==>
1086 atn2 (f x', g x') = (--(pi / &2) - atn(f x' / g x'))))`,
1090 (DISCH_THEN (MP_TAC o (MATCH_MP derived_imp_pos_open_3)));
1092 (EXISTS_TAC `d:real`);
1093 (ASM_REWRITE_TAC[]);
1095 (SUBGOAL_THEN `&0 > ((g:real->real) x')` MP_TAC);
1097 (REWRITE_TAC[REAL_ARITH `a > b <=> b < a`]);
1098 (MP_TAC (MATCH_MP (TAUT `a /\ b /\ c /\ d ==> c`) (SPECL [`((f:real->real) x')`;`((g:real->real) x')`] Trigonometry1.ATN2_BREAKDOWN)));
1102 (*//////////////////////////////////*)
1104 let atn2_final_1 = prove_by_refinement( `!x pf (f:real->real) f' pg (g:real->real) g' s. (&0 < f x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form ((x IN s) /\ (pg /\ pf)) (\x. atn2( f x , g x)) ((g' * f x - g x * f')/(f x pow 2) *inv (&1 + (g x / f x) pow 2)) x s`,
1108 REWRITE_TAC[derived_form];
1110 SUBGOAL_THEN `pf /\ derived_form pf f f' x s /\ (&0 < (f:real->real) x)` MP_TAC;
1111 REWRITE_TAC[derived_form];
1113 DISCH_THEN (MP_TAC o (MATCH_MP atn2_atn_open));
1115 SUBGOAL_THEN `derived_form (T /\ (pg /\ pf)) (\x. atn( g x / f x)) ((g' * f x - g x * f')/(f x pow 2) *inv (&1 + (g x / f x) pow 2)) x s` MP_TAC;
1117 REWRITE_TAC[derived_form];
1120 REWRITE_TAC[derived_form];
1122 MATCH_MP_TAC HAS_REAL_DERIVATIVE_TRANSFORM_WITHIN;
1126 let atn2_final_2 = prove_by_refinement (
1127 `!x pf (f:real->real) f' pg (g:real->real) g' s. (&0 < g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form ((x IN s) /\ (pg /\ pf)) (\x. atn2( f x , g x)) ((g' * f x - g x * f')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s`,
1130 REWRITE_TAC[derived_form];
1132 SUBGOAL_THEN `pg /\ derived_form pg g g' x s /\ (&0 < (g:real->real) x)` MP_TAC;
1133 REWRITE_TAC[derived_form];
1135 DISCH_THEN (MP_TAC o (MATCH_MP atn2_atn_open_2));
1137 SUBGOAL_THEN `derived_form (T /\ (pg /\ pf)) (\x. (pi / &2) - atn( f x / g x)) ((g' * f x - g x * f')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s` MP_TAC;
1139 REWRITE_TAC[derived_form];
1142 REWRITE_TAC[derived_form];
1144 MATCH_MP_TAC HAS_REAL_DERIVATIVE_TRANSFORM_WITHIN;
1148 let atn2_final_3 = prove_by_refinement (
1149 `!x pf (f:real->real) f' pg (g:real->real) g' s. (&0 > g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form ((x IN s) /\ (pg /\ pf)) (\x. atn2( f x , g x)) ((g' * f x - g x * f')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s`,
1152 REWRITE_TAC[derived_form];
1154 SUBGOAL_THEN `pg /\ derived_form pg g g' x s /\ (&0 > (g:real->real) x)` MP_TAC;
1155 REWRITE_TAC[derived_form];
1157 DISCH_THEN (MP_TAC o (MATCH_MP atn2_atn_open_3));
1159 SUBGOAL_THEN `derived_form (T /\ (pg /\ pf)) (\x. --(pi / &2) - atn( f x / g x)) ((g' * f x - g x * f')/(g x pow 2) *inv (&1 + (f x / g x) pow 2)) x s` MP_TAC;
1161 REWRITE_TAC[derived_form];
1164 REWRITE_TAC[derived_form];
1166 MATCH_MP_TAC HAS_REAL_DERIVATIVE_TRANSFORM_WITHIN;
1170 let atn2_deriv_simple1 = prove_by_refinement(`!x pf (f:real->real) f' pg (g:real->real) g' s. (&0 < f x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form ((x IN s) /\ (pg /\ pf)) (\x. atn2( f x , g x)) ((g' * f x - g x * f')/(f x pow 2 + g x pow 2)) x s`,
1173 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn2_final_1);
1176 MP_TAC (REAL_ARITH `&0 < (f:real->real) x ==> ~(f x = &0)`);
1179 MP_TAC (SPECL[`(f:real->real) x`;`(g:real->real) x`;] sumsquaresnot0);
1182 MP_TAC (SPECL[`g':real`;`(f:real->real) x`;`(g:real->real) x`;`f':real`] notzerodenom);
1187 let atn2_deriv_simple2 = prove_by_refinement(`!x pf (f:real->real) f' pg (g:real->real) g' s. (&0 < g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form ((x IN s) /\ (pg /\ pf)) (\x. atn2( f x , g x)) ((g' * f x - g x * f')/(f x pow 2 + g x pow 2)) x s`,
1190 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn2_final_2);
1193 MP_TAC (REAL_ARITH `&0 < (g:real->real) x ==> ~(g x = &0)`);
1196 MP_TAC (SPECL[`(f:real->real) x`;`(g:real->real) x`;] sumsquaresnot0);
1199 MP_TAC (SPECL[`g':real`;`(f:real->real) x`;`(g:real->real) x`;`f':real`] notzerodenom2);
1204 let atn2_deriv_simple3 = prove_by_refinement(`!x pf (f:real->real) f' pg (g:real->real) g' s. (&0 > g x) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form ((x IN s) /\ (pg /\ pf)) (\x. atn2( f x , g x)) ((g' * f x - g x * f')/(f x pow 2 + g x pow 2)) x s`,
1207 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn2_final_3);
1210 MP_TAC (REAL_ARITH `&0 > (g:real->real) x ==> ~(g x = &0)`);
1213 MP_TAC (SPECL[`(f:real->real) x`;`(g:real->real) x`;] sumsquaresnot0);
1216 MP_TAC (SPECL[`g':real`;`(f:real->real) x`;`(g:real->real) x`;`f':real`] notzerodenom2);
1221 let atn2_derivative = prove_by_refinement(`!x pf (f:real->real) f' pg (g:real->real) g' s. (~((g x = &0) /\ (f x <= &0))) /\ derived_form pf f f' x s /\ derived_form pg g g' x s ==> derived_form ((x IN s) /\ (pg /\ pf)) (\x. atn2( f x , g x)) ((g' * f x - g x * f')/(f x pow 2 + g x pow 2)) x s`,
1224 REWRITE_TAC[REAL_ARITH `(~((y = &0) /\ (x <= &0)) <=> (&0 < x) \/ (&0 < y) \/ (&0 > y))`];
1226 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn2_deriv_simple1);
1228 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn2_deriv_simple2);
1230 MP_TAC (SPECL[`x:real`;`pf:bool`;`f:real->real`;`f':real`;`pg:bool`;`g:real->real`;`g':real`;`s:real->bool`] atn2_deriv_simple3);
1235 (* END OF NICK VOLKER'S ATAN2 CODE *)
1239 let atn2curry = new_definition `atn2curry x y = atn2(x,y)`;;
1241 let derived_form_atn2curry = prove_by_refinement(
1242 `!x s. derived_form p1 f1 f1' x s /\ derived_form p2 f2 f2' x s ==> derived_form (p1 /\ p2 /\ (~((f2 x = &0) /\ (f1 x <= &0))) /\ (x IN s)) (\x. atn2curry (f1 x) (f2 x)) ( (f2' * f1 x - f2 x * f1')/ (f1 x pow 2 + f2 x pow 2)) x s`,
1245 REWRITE_TAC[atn2curry];
1247 MP_TAC (SPECL [`x:real`;`p1:bool`;`f1:real->real`;`f1':real`;`p2:bool`;`f2:real->real`;`f2':real`;`s:real->bool`] atn2_derivative);
1249 REWRITE_TAC[derived_form];
1254 (* apply chain only when head is a named constant, sqrt, cos, sin,... *)
1258 let real_univ = `(:real)` in
1259 let real_ty = `:real` in
1260 let pow = `(pow)` in
1263 let _ = (c:= !c+1) in
1264 mk_var("F"^(string_of_int !c),real_ty) in
1265 let curryl = [atn2curry] in
1266 let uncurry = REWRITE_CONV curryl in
1267 let curry = REWRITE_CONV (map GSYM curryl) in
1268 let binop = [(`( / )`,derived_form_div);(`( * )`,derived_form_mul);
1269 (`( + )`,derived_form_add); (`( - )`,derived_form_sub);
1270 (`atn2curry`,derived_form_atn2curry)] in
1272 let fns = [((` -- `), derived_form_neg);
1273 (`sin`,derived_form_sin);
1274 (`cos`,derived_form_cos);
1275 (`sqrt`,derived_form_sqrt);
1276 (`inv`,derived_form_inv);
1277 (`acs`,derived_form_acs);
1278 (`asn`,derived_form_asn);
1279 (`atn`,derived_form_atn);
1281 let rc = clean_conv in
1282 let check thm = ((* print_thm thm; *) thm) in
1283 let mate f g = try (MATCH_MP f g) with e ->
1285 print_string "ERROR: derivative MATCH_MP:\n\n" ;
1288 print_string "END ERROR\n";
1291 let clean_derived_form = MESON[]
1292 `derived_form p f f' x s /\ (p = p') /\ (f = tm) /\ (f' = f'') /\ (x = x') /\ (s = s') ==>
1293 derived_form p' tm f'' x' s'` in
1295 let cleanup_derived_form th tm s =
1296 let (_,[p;f;f';x;s']) = strip_comb (concl th) in
1298 let f'' = (rc THENC uncurry) f' in
1299 let tm1 = ((REDEPTH_CONV BETA_CONV) THENC curry) tm in
1300 let f1 = ((REDEPTH_CONV BETA_CONV) THENC curry) f in
1301 let u = try (prove(mk_eq (f,tm),REWRITE_TAC[tm1;f1] THEN MESON_TAC[]))
1303 (print_term tm; print_string" "; print_thm tm1; print_thm f1; failwith "cdfm") in
1304 mate (clean_derived_form) (end_itlist CONJ [th;p';u;f'';REFL x;REFL s]) in
1306 let rec derivative' tm x s =
1307 let hyp r = end_itlist CONJ ((map (fun t->derivative' t x s) r)) in
1308 let SPECM xs (dd,msg) =
1312 print_string("\n\n unexpected \n"^msg^"\n");
1319 if (r=[]) then SPECL [x;s] dd else (mate (SPECL [x;s] dd) (hyp r))
1322 print_string("\n\n unexpected failure on ops\n"^msg^"\n");
1323 map (fun u ->print_term u; print_string "\n") r;
1324 print_thm (SPECL [x;s] dd);
1325 print_string "-------\n\n";
1329 let derived_form_fn = assoc tm fns in
1330 (SPECM[x;s] (derived_form_fn,"fns")) in
1332 let (v,bod) = dest_abs tm in
1333 let _ = not(mem v (frees bod)) or failwith "constant" in
1334 (SPECM[bod;x;s] (derived_form_const,"const")) in
1336 let (v,bod) = dest_abs tm in
1337 let _ = (v=bod) or failwith "id" in
1338 (m [] (derived_form_id,"id")) in
1340 let (v,bod) = dest_abs tm in
1341 let (t,n) = dest_binop pow bod in
1342 let r = mk_abs (v,t) in
1343 (m [r] (SPEC n derived_form_pow,"pow")) in
1345 let (v,bod) = dest_abs tm in
1346 let (h,b) = strip_comb bod in
1347 if (List.length b = 1) then
1348 let _ = failwith "no unary ops exist" in
1349 let derived_form_unary = assoc h unop in
1350 let r = mk_abs (v,hd b) in
1351 (m [r] (derived_form_unary,"unary"))
1353 let _ = (List.length b = 2) or failwith "not a binary op" in
1355 let derived_form_op = (assoc h binop) in
1356 let r1 = mk_abs (v,f1) in
1357 let r2 = mk_abs (v,f2) in
1358 (m [r1;r2] (derived_form_op,"binary")) in
1360 let (v,bod) = dest_abs tm in
1361 let (h,br) = strip_comb bod in
1362 let _ = List.length br = 1 or failwith "not a chain" in
1363 let fs = mk_abs(v,hd br) in
1364 let r1 = derivative' h (mk_comb (fs,x)) real_univ in
1365 let r2 = derivative' fs x s in
1366 (* let b1 = ABS v (AP_TERM h (SYM(BETA (mk_comb (fs,v))))) in *)
1368 let (_,[_;_;_;f1x;_]) = strip_comb (concl r1) in
1369 let (f1,_) = dest_comb f1x in
1372 let (_,[_;f2;_;_;_]) = strip_comb(concl r2) in f2 in
1373 let rd = REDEPTH_CONV BETA_CONV in
1374 let b1 = prove(mk_eq(f1,f2),REWRITE_TAC[rd f1;rd f2] THEN MESON_TAC[]) in
1375 let spec = SPECM [x;s] (derived_form_chain,"chain") in
1376 (mate (spec) (end_itlist CONJ [r1;r2;b1])) in
1379 SPECM [tm;get_var();x;s] (derived_form_generic,"generic") in
1381 tryfind (fun t -> check(t tm)) [d_fns;d_const;d_id;d_pow;d_op;d_chain;d_hyp] in
1384 let tm' = rhs (concl (curry tm)) in
1385 cleanup_derived_form (derivative' tm' x s) tm s;;
1389 let differentiate tm x s =
1390 let th = (REWRITE_CONV [GSYM atn2curry] tm) in
1391 let tm1 = rhs (concl th) in
1392 let d = differentiate_prelim tm1 x s in
1393 let ans = REWRITE_RULE[SYM th] d in
1404 let s = `(:real)` in
1405 let tm = `\x:real. &1` in
1406 differentiate tm x s;;
1411 let s = `(:real)` in
1412 let tm = `\x:real. x` in
1413 differentiate tm x s;;
1417 let s = `(:real)` in
1419 differentiate tm x s;;
1423 let s = `(:real)` in
1424 let tm = `( -- )` in
1425 differentiate tm x s;;
1430 let s = `(:real)` in
1431 let tm = `\x. &1 + x` in
1432 differentiate tm x s;;
1437 let s = `(:real)` in
1438 let tm = `\x. x + &1` in
1439 differentiate tm x s;;
1443 let s = `(:real)` in
1444 let tm = `\x. -- (x pow 2)` in
1445 differentiate tm x s;;
1449 let s = `{t | t > &0}` in
1450 let tm = `(\q:real. (q - sin(q pow 3) + q pow 7 + y)/(q pow 2 + q pow 4 *(&33 + &43 * q)) + (q pow 3) * ((q pow 2) / (-- (q pow 3))))` in
1451 time(differentiate tm x) s;;
1455 let s = `(:real)` in
1456 let tm = `\q. cos(&1 + q pow 2) * acs (q pow 4) + atn(cos q) + inv (q + &1)` in
1457 time(differentiate tm x) s;;
1461 let s = `(:real)` in
1462 let tm = `\q. cos(&1 + q pow 2) * acs (q pow 4) + atn(cos q) + inv (q + &1)` in
1463 time(differentiate tm x) s;;
1467 let s = `(:real)` in
1468 let tm = `\q. (\x. x pow 5 + x* y - cos x) (&1 + q pow 2) ` in
1469 differentiate tm x s;;
1473 let s = `(:real)` in
1474 let tm = `\q. (\x. x pow 5 + &1 - cos x) q` in
1475 differentiate tm x s;;
1479 let s = `(:real)` in
1480 let tm = `\q. (\x. &2 + sin x + &1) q` in
1481 differentiate tm x s;;
1485 let s = `(:real)` in
1486 let tm = `\q. ((f:real->real) ((g:real->real) q)) + (g:real->real) q ` in
1487 differentiate tm x s;;
1492 let real_interval_nonempty = prove_by_refinement(
1493 `!a b. (a<=b) ==> ~(real_interval[a,b]={})`,
1496 REWRITE_TAC[real_interval];
1499 REWRITE_TAC[GSYM MEMBER_NOT_EMPTY;IN_ELIM_THM];
1500 EXISTS_TAC `a:real`;
1501 POP_ASSUM MP_TAC THEN REAL_ARITH_TAC;