Update from HH
[Flyspeck/.git] / formal_lp / old / formal_interval / theory / multivariate_taylor.hl
1 load_path := "/mnt/Repository/jHOLLight"::(!load_path);;
2 needs "caml/raw_printer.hl";;
3 needs "caml/sections.hl";;
4 needs "caml/ssreflect.hl";;
5 needs "Examples/ssrbool-compiled.hl";;
6 needs "Examples/ssrnat-compiled.hl";;
7 needs "../formal_lp/formal_interval/theory/taylor_interval.hl";;
8 section_stack := [];;
9 prioritize_overload `:real^K`;;
10 prioritize_overload `:real^N`;;
11 prioritize_real();;
12
13 let partial = new_definition `partial i f x = derivative (f o (\t. (x:real^N) + t % basis i)) (&0)`;;
14 let all_n = define `(all_n n [] s <=> T) /\ (all_n n (CONS h t) s <=> s n h /\ all_n (SUC n) t s)`;;
15 let m_lin_approx = new_definition `m_lin_approx (f:real^N->real) x f_bounds df_bounds_list <=> 
16         (lift o f) differentiable at x /\
17         interval_arith (f x) f_bounds /\
18         all_n 1 df_bounds_list (\i int. interval_arith (partial i f x) int)`;;
19 (begin_section "Misc");;
20 (start_section_proof ["f"](`lift o (\x. --f x) = (\x. --(lift o f) x)`));;
21 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN LIFT_NEG)(new_rewrite [] []))) THEN (done_tac)))));;
22 let f_lift_neg = end_section_proof();;
23 (start_section_proof ["f";"c"](`lift o (\x. c * f x) = (\x. c % (lift o f) x)`));;
24 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN LIFT_CMUL)(new_rewrite [] []))) THEN (done_tac)))));;
25 let f_lift_scale = end_section_proof();;
26 (start_section_proof ["f";"g"](`lift o (\x. f x + g x) = (\x. (lift o f) x + (lift o g) x)`));;
27 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN LIFT_ADD)(new_rewrite [] []))) THEN (done_tac)))));;
28 let f_lift_add = end_section_proof();;
29 (start_section_proof ["f";"g"](`lift o (\x. f x - g x) = (\x. (lift o f) x - (lift o g) x)`));;
30 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN LIFT_SUB)(new_rewrite [] []))) THEN (done_tac)))));;
31 let f_lift_sub = end_section_proof();;
32 (start_section_proof ["op";"f";"g"](`(\t. op (f t) (g t)) o drop = (\x. op (f (drop x)) (g (drop x)))`));;
33 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] [])))) THEN (done_tac)))));;
34 let f_binary_drop = end_section_proof();;
35 (start_section_proof ["op";"f"](`(\t. op (f t)) o drop = (\x. op (f (drop x)))`));;
36 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] [])))) THEN (done_tac)))));;
37 let f_unary_drop = end_section_proof();;
38 (begin_section "MoreFrechet");;
39 (add_section_var (mk_var ("f", (`:real^N -> real^M`))); add_section_var (mk_var ("g", (`:real^N -> real^M`))));;
40 (add_section_var (mk_var ("x", (`:real^N`))); add_section_var (mk_var ("y", (`:real^N`))));;
41 (start_section_proof ["f";"g";"x"](`f differentiable at (g x) ==>
42         g differentiable at x ==>
43         frechet_derivative (f o g) (at x) = frechet_derivative f (at (g x)) o frechet_derivative g (at x)`));;
44 refine (by (VALID (((BETA_TAC THEN (move ["df"]) THEN (move ["dg"])) THEN ((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac)))));;
45 refine (by (VALID ((((USE_THM_THEN DIFF_CHAIN_AT) apply_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
46 let frechet_compose = end_section_proof();;
47 (start_section_proof ["z"](`frechet_derivative (\x. y) (at z) = (\x. vec 0)`));;
48 refine (by (VALID ((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_CONST)(new_rewrite [] [])) THEN (done_tac)))));;
49 let frechet_const = end_section_proof();;
50 (start_section_proof [](`frechet_derivative (\x. x) (at y) = (\x. x)`));;
51 refine (by (VALID ((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_ID)(new_rewrite [] [])) THEN (done_tac)))));;
52 let frechet_id = end_section_proof();;
53 (start_section_proof ["z"](`frechet_derivative (\x. drop x % y) (at z) = (\x. drop x % y)`));;
54 refine (by (VALID ((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_VMUL_DROP) apply_tac)))));;
55 refine (by (VALID (((USE_THM_THEN HAS_DERIVATIVE_ID)(new_rewrite [] [])))));;
56 let frechet_vmul = end_section_proof();;
57 (add_section_hyp "df" (`f differentiable at x`));;
58 (start_section_proof [](`frechet_derivative (\x. --f x) (at x) = (\y. --frechet_derivative f (at x) y)`));;
59 refine (by (VALID ((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_NEG) apply_tac)))));;
60 refine (by (VALID ((((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(GSYM_THEN (new_rewrite [] []))) THEN (done_tac)))));;
61 let frechet_neg = end_section_proof();;
62 (start_section_proof ["c"](`frechet_derivative (\x. c % f x) (at x) = (\y. c % frechet_derivative f (at x) y)`));;
63 refine (by (VALID ((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_CMUL) apply_tac)))));;
64 refine (by (VALID ((((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(GSYM_THEN (new_rewrite [] []))) THEN (done_tac)))));;
65 let frechet_scale = end_section_proof();;
66 (add_section_hyp "dg" (`g differentiable at x`));;
67 (start_section_proof [](`frechet_derivative (\x. f x + g x) (at x) = 
68         (\y. frechet_derivative f (at x) y + frechet_derivative g (at x) y)`));;
69 refine (by (VALID ((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_ADD) apply_tac)))));;
70 refine (by (VALID ((((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN repeat_tactic 1 9 (((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
71 let frechet_add = end_section_proof();;
72 (start_section_proof [](`frechet_derivative (\x. f x - g x) (at x) = 
73         (\y. frechet_derivative f (at x) y - frechet_derivative g (at x) y)`));;
74 refine (by (VALID ((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_SUB) apply_tac)))));;
75 refine (by (VALID ((((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN repeat_tactic 1 9 (((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
76 let frechet_sub = end_section_proof();;
77 let frechet_sub = finalize_theorem frechet_sub;;
78 let frechet_add = finalize_theorem frechet_add;;
79 let frechet_scale = finalize_theorem frechet_scale;;
80 let frechet_neg = finalize_theorem frechet_neg;;
81 let frechet_vmul = finalize_theorem frechet_vmul;;
82 let frechet_id = finalize_theorem frechet_id;;
83 let frechet_const = finalize_theorem frechet_const;;
84 let frechet_compose = finalize_theorem frechet_compose;;
85 (end_section "MoreFrechet");;
86 (start_section_proof ["f";"g";"x"](`f differentiable at (g x) ==>
87         g differentiable at x ==>
88         (f o g) differentiable at x`));;
89 refine (by (VALID (((BETA_TAC THEN (move ["df"]) THEN (move ["dg"])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(new_rewrite [] []))))));;
90 refine (by (VALID (((((USE_THM_THEN frechet_compose)(new_rewrite [] [])) THEN ((TRY done_tac))) THEN ((USE_THM_THEN DIFF_CHAIN_AT) apply_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
91 let differentiable_compose_at = end_section_proof();;
92 (start_section_proof ["f";"g";"x"](`f differentiable at (g x) ==>
93         g differentiable at x ==>
94         jacobian (f o g) (at x) = jacobian f (at (g x)) ** jacobian g (at x)`));;
95 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dg"])))));;
96 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN jacobian)(new_rewrite [] []))) THEN ((USE_THM_THEN frechet_compose)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN MATRIX_COMPOSE)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN LINEAR_FRECHET_DERIVATIVE)(new_rewrite [] [])))) THEN (done_tac)))));;
97 let jacobian_compose = end_section_proof();;
98 (start_section_proof ["f";"x"](`f differentiable at x ==>
99         frechet_derivative f (at x) = (\h. jacobian f (at x) ** h)`));;
100 refine (by (VALID ((BETA_TAC THEN (move ["df"])))));;
101 refine (by (VALID (((((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN JACOBIAN_WORKS)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
102 let frechet_eq_jacobian = end_section_proof();;
103 (begin_section "Product");;
104 (start_section_proof ["w";"x";"y";"z"](`&0 < w /\ w <= x /\ &0 <= y /\ y < z ==> w * y < x * z`));;
105 refine (by (VALID ((BETA_TAC THEN (move ["ineq"])))));;
106 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`w = x`) thm_tac))MP_TAC) THEN case THENL [(move ["w_eq_x"]); (move ["wnx"])]))));;
107 refine (by (VALID (((((USE_THEN "w_eq_x")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LT_LMUL)(new_rewrite [] []))) THEN (done_tac)))));;
108 refine (by (VALID ((((USE_THM_THEN REAL_LT_MUL2)(new_rewrite [] [])) THEN (((USE_THEN "wnx")MP_TAC) THEN (clear_assumption "wnx") THEN ((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
109 let REAL_LET_MUL2 = end_section_proof();;
110 (start_section_proof ["y"](`(lift o (\x:real^2. x$1 * x$2) has_derivative lift o (\x. y$2 * x$1 + y$1 * x$2)) (at y)`));;
111 refine (by (VALID ((((USE_THM_THEN has_derivative_at)(new_rewrite [] [])) THEN (split_tac)))));;
112 refine (by (VALID ((((USE_THM_THEN linear)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_ADD)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_CMUL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_ADD)(new_rewrite [] [])))))));;
113 refine (by (VALID (((VECTOR_ARITH_TAC) THEN (done_tac)))));;
114 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN LIFT_ADD)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN LIFT_SUB)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN LIFT_CMUL)(GSYM_THEN (new_rewrite [] [])))))));;
115 refine (by (VALID (((((USE_THM_THEN LIM_AT)(new_rewrite [] [])) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN dist)(new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL VECTOR_SUB_RZERO))(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_LIFT)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] [])))) THEN (move ["e"]) THEN (move ["e0"])))));;
116 refine (by (VALID (((USE_THM_THEN (REAL_ARITH `(x:real^2)$1 * x$2 - ((y:real^2)$1 * y$2 + y$2 * (x$1 - y$1) + y$1 * (x$2 - y$2)) =
117                 (x$2 - y$2) * (x$1 - y$1)`))(new_rewrite [] [])))));;
118 refine (by (VALID (((exists_tac (mk_var("e",mk_type("real",[])))) THEN ((((USE_THEN "e0")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["x"]) THEN (case THEN ((move ["norm0"]) THEN (move ["norm_e"]))))))));;
119 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN REAL_ABS_MUL)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_ABS_INV)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ABS_NORM)(new_rewrite [] []))))));;
120 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN VECTOR_SUB_COMPONENT)(GSYM_THEN (new_rewrite [] [])))) THEN (set_tac "p" (`x - y:real^2`))))));;
121 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN NORM_BOUND_COMPONENT_LT)(fun fst_th ->(USE_THEN "norm_e")(fun th -> MATCH_MP_THEN th thm_tac fst_th))) MP_TAC) THEN (move ["ineq"])))));;
122 refine (by (VALID (((((USE_THM_THEN REAL_LTE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LTE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`inv (infnorm p) * infnorm p * e`))))));;
123 refine (by (VALID (((THENL_FIRST) (have_tac (move ["infnorm_0"]) (`&0 < infnorm p`)) ((((USE_THM_THEN INFNORM_POS_LT)(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_POS_LT)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac))))));;
124 refine (by (VALID (((THENL_ROT (-1)) (split_tac)))));;
125 refine (by (VALID (((((USE_THM_THEN REAL_MUL_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_LINV)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_MUL_LID)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN INFNORM_EQ_0)(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_POS_LT)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
126 refine (by (VALID ((((USE_THM_THEN REAL_LET_MUL2)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LT_INV)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_LE_INV2)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN INFNORM_LE_NORM)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
127 refine (by (VALID ((((USE_THM_THEN REAL_LE_MUL)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_ABS_POS)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
128 refine (by (VALID ((have_tac ALL_TAC (`infnorm p = abs (p$1) \/ infnorm p = abs (p$2)`)))));;
129 refine (by (VALID ((((USE_THM_THEN (GEN_ALL INFNORM_2))(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac)))));;
130 refine (by (VALID ((((THENL_FIRST) (case THEN (DISCH_THEN(GSYM_THEN (new_rewrite [] [])))) ((USE_THM_THEN REAL_MUL_SYM)(new_rewrite [] []))) THEN (((USE_THM_THEN REAL_LT_LMUL)(new_rewrite [] [])) THEN ((USE_THEN "ineq")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN DIMINDEX_2)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
131 let has_derivative_x12 = end_section_proof();;
132 (start_section_proof ["f"](`(\x:A. lambda i. f i x) =  
133         (\x. vsum (1..dimindex (:N)) (\i. f i x % (basis i:real^N)))`));;
134 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac)) THEN (move ["x"])))));;
135 refine (by (VALID (((((USE_THM_THEN CART_EQ)(new_rewrite [] [])) THEN (move ["i"]) THEN (move ["ineq"])) THEN (((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN VSUM_COMPONENT)(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac)))))));;
136 refine (by (VALID (((set_tac "A" (`1.. _`)) THEN (set_tac "B" (`A DIFF {i}`))))));;
137 refine (by (VALID ((have_tac (move ["cond"]) (`DISJOINT B {i} /\ A = B UNION {i}`)))));;
138 refine (by (VALID ((((USE_THM_THEN DISJOINT)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN EXTENSION)(new_rewrite [] []))) THEN ((USE_THEN "B_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "A_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN IN_INTER)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_DIFF)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_SING)(new_rewrite [] [])) THEN ((USE_THM_THEN NOT_IN_EMPTY)(new_rewrite [] [])) THEN (simp_tac)))));;
139 refine (by (VALID (((THENL_FIRST) ((split_tac) THEN (move ["x"])) ((repeat_tactic 1 9 (((USE_THM_THEN negb_and)(new_rewrite [] []))) THEN ((USE_THM_THEN negbK)(new_rewrite [] [])) THEN ((USE_THM_THEN orbA)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN EXCLUDED_MIDDLE)(new_rewrite [] []))) THEN (done_tac))))));;
140 refine (by (VALID ((((USE_THM_THEN IN_UNION)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_DIFF)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_SING)(new_rewrite [] []))))));;
141 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`x = i`) thm_tac))MP_TAC) THEN case THEN (DISCH_THEN(new_rewrite [] [])) THEN ((TRY done_tac))) THEN ((simp_tac) THEN ((USE_THM_THEN IN_NUMSEG)(new_rewrite [] []))) THEN (done_tac)))));;
142 refine (by (VALID ((((USE_THEN "cond")(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_UNION)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "cond")(new_rewrite [] []))) THEN ((USE_THEN "B_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_DIFF)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "A_def")(GSYM_THEN (new_rewrite [] [])))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_SING)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
143 refine (by (VALID ((((USE_THM_THEN SUM_SING)(new_rewrite [] [])) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] []))) THEN ((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN BASIS_COMPONENT)(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))))));;
144 refine (by (VALID (((((USE_THM_THEN (REAL_ARITH `!a b. a = b + a * &1 <=> b = &0`))(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_EQ_0)(new_rewrite [] [])) THEN ((TRY done_tac))) THEN (move ["j"])))));;
145 refine (by (VALID ((((((USE_THM_THEN IN_DIFF)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_SING)(new_rewrite [] []))) THEN (move ["ineq_j"]) THEN (simp_tac)) THEN (((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((fun thm_tac -> (USE_THM_THEN EQ_SYM_EQ)(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(new_rewrite [] [])))))));;
146 refine (by (VALID (((((USE_THEN "ineq_j")(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN REAL_MUL_RZERO)(new_rewrite [] []))) THEN (done_tac)))));;
147 let lambda_eq_vsum = end_section_proof();;
148 (start_section_proof ["f";"f'";"y"](`(!i. i IN 1..dimindex (:M) ==> (lift o (f i) has_derivative lift o (f' i)) (at (y:real^N))) ==>
149         (((\x. lambda i. f i x):real^N->real^M) has_derivative (\x. lambda i. f' i x) ) (at y)`));;
150 refine (by (VALID (((BETA_TAC THEN (move ["df"])) THEN repeat_tactic 1 9 (((USE_THM_THEN lambda_eq_vsum)(new_rewrite [] []))) THEN ((USE_THM_THEN HAS_DERIVATIVE_VSUM) apply_tac)))));;
151 refine (by (VALID (((((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["ineq"]) THEN (simp_tac)))));;
152 refine (by (VALID ((have_tac (move ["eq"]) (`!f. (\x:real^N. f i x % (basis i:real^M)) = (\x. drop ((lift o f i) x) % basis i)`)))));;
153 refine (by (VALID (((BETA_TAC THEN (move ["g"])) THEN (((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] []))) THEN (done_tac)))));;
154 refine (by (VALID (((((fun thm_tac -> (USE_THEN "eq")(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("num",[]);mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])])]))) thm_tac))(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THEN "eq")(ISPEC_THEN (mk_var("f'",mk_type("fun",[mk_type("num",[]);mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])])]))) thm_tac))(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL HAS_DERIVATIVE_VMUL_DROP))(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN (done_tac)))));;
155 let has_derivative_lambda = end_section_proof();;
156 (start_section_proof ["x";"y"](`(vector [x; y]:real^2) = (lambda i. if i = 1 then x else y)`));;
157 refine (by (VALID ((((((USE_THM_THEN CART_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN DIMINDEX_2)(new_rewrite [] []))) THEN (move ["i"])) THEN ((USE_THM_THEN (ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`))(new_rewrite [] []))))));;
158 refine (by (VALID (((case THEN (DISCH_THEN(new_rewrite [1; 3] []))) THEN (((USE_THM_THEN (GEN_ALL VECTOR_2))(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN (simp_tac) THEN repeat_tactic 0 10 (((USE_THM_THEN DIMINDEX_2)(new_rewrite [] [])))) THEN (arith_tac) THEN (done_tac)))));;
159 let vector2_eq_lambda = end_section_proof();;
160 (start_section_proof ["f";"g";"f'";"g'";"y"](`(lift o f has_derivative lift o f') (at y) ==>
161         (lift o g has_derivative lift o g') (at y) ==>
162         ((\x. vector [f x; g x]:real^2) has_derivative (\x. vector [f' x; g' x]:real^2)) (at y)`));;
163 refine (by (VALID (((BETA_TAC THEN (move ["df"]) THEN (move ["dg"])) THEN repeat_tactic 1 9 (((USE_THM_THEN vector2_eq_lambda)(new_rewrite [] [])))))));;
164 refine (by (VALID ((((USE_THM_THEN has_derivative_lambda) apply_tac) THEN ((((USE_THM_THEN DIMINDEX_2)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_NUMSEG)(new_rewrite [] []))) THEN (move ["i"]))))));;
165 refine (by (VALID ((((USE_THM_THEN (ARITH_RULE `1 <= i /\ i <= 2 <=> i = 1 \/ i = 2`))(new_rewrite [] [])) THEN (case THEN (DISCH_THEN(new_rewrite [2; 4] [])) THEN (simp_tac)) THEN (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN ((TRY done_tac)))))));;
166 refine (by (VALID (((((USE_THM_THEN (ARITH_RULE `~(2 = 1)`))(new_rewrite [] [])) THEN (simp_tac)) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac)))));;
167 let has_derivative_vector2 = end_section_proof();;
168 (start_section_proof ["f";"g";"f'";"g'";"y"](`(lift o f has_derivative lift o f') (at y) ==>
169         (lift o g has_derivative lift o g') (at y) ==>
170         (lift o (\x. f x * g x) has_derivative lift o (\x. f' x * g y + f y * g' x)) (at y)`));;
171 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dg"])))));;
172 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`lift o (\x. f x * g x) = (lift o (\p. p$1 * p$2)) o (\x. vector [f x; g x]:real^2)`)))));;
173 refine (by (VALID ((((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac)) THEN (move ["x"])) THEN repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL VECTOR_2))(new_rewrite [] []))) THEN (done_tac)))));;
174 refine (by (VALID ((set_tac "q" (`vector [f y; g y]:real^2`)))));;
175 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`lift o (\x. f' x * g y + f y * g' x) = 
176         (lift o (\x:real^2. q$2 * x$1 + q$1 * x$2)) o (\x. vector [f' x; g' x])`)))));;
177 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "q_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL VECTOR_2))(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_MUL_SYM)(new_rewrite [] []))) THEN (done_tac)))));;
178 refine (by (VALID (((((USE_THM_THEN DIFF_CHAIN_AT) apply_tac) THEN (simp_tac)) THEN (((USE_THEN "q_def")(new_rewrite [] [])) THEN ((USE_THM_THEN has_derivative_x12)(new_rewrite [] [])) THEN ((USE_THM_THEN has_derivative_vector2)(new_rewrite [] []))) THEN (done_tac)))));;
179 let has_derivative_mul = end_section_proof();;
180 (start_section_proof ["f"](`f = lift o (drop o f)`));;
181 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] []))) THEN (done_tac)))));;
182 let f_eq_lift_drop = end_section_proof();;
183 (start_section_proof ["f";"g";"y"](`lift o f differentiable (at y) ==>
184         lift o g differentiable (at y) ==>
185         lift o (\x. f x * g x) differentiable (at y)`));;
186 refine (by (VALID ((repeat_tactic 2 0 (((USE_THM_THEN differentiable)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["f'"])) THEN (move ["df"]) THEN (case THEN (move ["g'"])) THEN (move ["dg"])))));;
187 refine (by (VALID (((((USE_THEN "dg")MP_TAC) THEN (clear_assumption "dg") THEN ((USE_THEN "df")MP_TAC) THEN (clear_assumption "df") THEN BETA_TAC) THEN ((((fun thm_tac -> (USE_THM_THEN f_eq_lift_drop)(ISPEC_THEN (mk_var("f'",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1451210"]);mk_type("cart",[mk_type("real",[]);mk_type("1",[])])]))) thm_tac))(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN f_eq_lift_drop)(ISPEC_THEN (mk_var("g'",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1451210"]);mk_type("cart",[mk_type("real",[]);mk_type("1",[])])]))) thm_tac))(new_rewrite [] []))) THEN (move ["df"]) THEN (move ["dg"]))))));;
188 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN has_derivative_mul)(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "dg")(fun th -> MATCH_MP_THEN th thm_tac fst_th))) MP_TAC) THEN ALL_TAC))));;
189 refine (by (VALID ((((USE_THM_THEN HAS_DERIVATIVE_IMP_DIFFERENTIABLE) apply_tac) THEN (done_tac)))));;
190 let differentiable_mul = end_section_proof();;
191 (start_section_proof ["f";"g";"y"](`lift o f differentiable at y ==>
192         lift o g differentiable at y ==>
193         frechet_derivative (lift o (\x. f x * g x)) (at y) =
194                 (\x. g y % frechet_derivative (lift o f) (at y) x + 
195                      f y % frechet_derivative (lift o g) (at y) x)`));;
196 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(new_rewrite [] []))) THEN ((USE_THM_THEN f_eq_lift_drop)(new_rewrite [] [(`frechet_derivative _1 _2`)]))) THEN (move ["df"])))));;
197 refine (by (VALID ((((USE_THM_THEN f_eq_lift_drop)(new_rewrite [] [(`frechet_derivative _1 _2`)])) THEN (move ["dg"])))));;
198 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN has_derivative_mul)(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "dg")(fun th -> MATCH_MP_THEN th thm_tac fst_th))) MP_TAC) THEN ALL_TAC) THEN ((DISCH_THEN (fun snd_th -> (USE_THM_THEN FRECHET_DERIVATIVE_AT)(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC THEN (DISCH_THEN(GSYM_THEN (new_rewrite [] []))))))));;
199 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_DROP)(new_rewrite [] [])))) THEN (move ["x"])))));;
200 refine (by (VALID (((((USE_THM_THEN LIFT_ADD)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_SYM)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_CMUL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_DROP)(new_rewrite [] [])))) THEN (done_tac)))));;
201 let frechet_mul = end_section_proof();;
202 let frechet_mul = finalize_theorem frechet_mul;;
203 let differentiable_mul = finalize_theorem differentiable_mul;;
204 let f_eq_lift_drop = finalize_theorem f_eq_lift_drop;;
205 let has_derivative_mul = finalize_theorem has_derivative_mul;;
206 let has_derivative_vector2 = finalize_theorem has_derivative_vector2;;
207 let vector2_eq_lambda = finalize_theorem vector2_eq_lambda;;
208 let has_derivative_lambda = finalize_theorem has_derivative_lambda;;
209 let lambda_eq_vsum = finalize_theorem lambda_eq_vsum;;
210 let has_derivative_x12 = finalize_theorem has_derivative_x12;;
211 let REAL_LET_MUL2 = finalize_theorem REAL_LET_MUL2;;
212 (end_section "Product");;
213 let frechet_mul = finalize_theorem frechet_mul;;
214 let differentiable_mul = finalize_theorem differentiable_mul;;
215 let f_eq_lift_drop = finalize_theorem f_eq_lift_drop;;
216 let has_derivative_mul = finalize_theorem has_derivative_mul;;
217 let has_derivative_vector2 = finalize_theorem has_derivative_vector2;;
218 let vector2_eq_lambda = finalize_theorem vector2_eq_lambda;;
219 let has_derivative_lambda = finalize_theorem has_derivative_lambda;;
220 let lambda_eq_vsum = finalize_theorem lambda_eq_vsum;;
221 let has_derivative_x12 = finalize_theorem has_derivative_x12;;
222 let REAL_LET_MUL2 = finalize_theorem REAL_LET_MUL2;;
223 let frechet_eq_jacobian = finalize_theorem frechet_eq_jacobian;;
224 let jacobian_compose = finalize_theorem jacobian_compose;;
225 let differentiable_compose_at = finalize_theorem differentiable_compose_at;;
226 let frechet_sub = finalize_theorem frechet_sub;;
227 let frechet_add = finalize_theorem frechet_add;;
228 let frechet_scale = finalize_theorem frechet_scale;;
229 let frechet_neg = finalize_theorem frechet_neg;;
230 let frechet_vmul = finalize_theorem frechet_vmul;;
231 let frechet_id = finalize_theorem frechet_id;;
232 let frechet_const = finalize_theorem frechet_const;;
233 let frechet_compose = finalize_theorem frechet_compose;;
234 let f_unary_drop = finalize_theorem f_unary_drop;;
235 let f_binary_drop = finalize_theorem f_binary_drop;;
236 let f_lift_sub = finalize_theorem f_lift_sub;;
237 let f_lift_add = finalize_theorem f_lift_add;;
238 let f_lift_scale = finalize_theorem f_lift_scale;;
239 let f_lift_neg = finalize_theorem f_lift_neg;;
240 (end_section "Misc");;
241 (begin_section "Partial");;
242 (start_section_proof ["f";"h";"t"](`(lift o f) differentiable at (h t) ==>
243         (h o drop) differentiable at (lift t) ==>
244         ((f o h) has_real_derivative (drop o (frechet_derivative (lift o f) (at (h t)) o 
245                         frechet_derivative (h o drop) (at (lift t))) o lift) (&1)) (atreal t)`));;
246 refine (by (VALID ((BETA_TAC THEN (move ["diff_f"]) THEN (move ["diff_h"])))));;
247 refine (by (VALID (((((USE_THEN "diff_h")MP_TAC) THEN ((USE_THEN "diff_f")MP_TAC) THEN BETA_TAC) THEN repeat_tactic 1 9 (((USE_THM_THEN FRECHET_DERIVATIVE_WORKS)(new_rewrite [] [])))))));;
248 refine (by (VALID ((set_tac "f'" (`frechet_derivative _1 _2`)))));;
249 refine (by (VALID ((set_tac "h'" (`frechet_derivative _1 _2`)))));;
250 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dh"])))));;
251 refine (by (VALID (((USE_THM_THEN (GEN_ALL HAS_REAL_FRECHET_DERIVATIVE_AT))(new_rewrite [] [])))));;
252 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`lift o (f o h) o drop = (lift o f) o (h o drop)`)) (repeat_tactic 1 9 (((USE_THM_THEN o_ASSOC)(new_rewrite [] []))) THEN (done_tac))))));;
253 refine (by (VALID ((((THENL_ROT 1)) (have_tac (DISCH_THEN(new_rewrite [] [])) (`(\x. (drop o (f' o h') o lift) (&1) % x) = f' o h'`))))));;
254 refine (by (VALID (((((USE_THM_THEN DIFF_CHAIN_AT)(new_rewrite [] [])) THEN ((USE_THEN "dh")(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
255 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] [])))) THEN (move ["x"]) THEN (simp_tac)))));;
256 refine (by (VALID ((have_tac (move ["lin"]) (`linear f' /\ linear h'`)))));;
257 refine (by (VALID (((((USE_THEN "h'_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "f'_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN LINEAR_FRECHET_DERIVATIVE)(new_rewrite [] [])))) THEN (done_tac)))));;
258 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [2] [])) (`x = drop x % lift (&1)`)))));;
259 refine (by (VALID (((((USE_THM_THEN DROP_EQ)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN DROP_CMUL)(new_rewrite [] [])) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] []))) THEN (done_tac)))));;
260 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN LINEAR_CMUL)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN DROP_EQ)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN DROP_CMUL)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_MUL_SYM)(new_rewrite [] []))) THEN (done_tac)))));;
261 let real_derivative_compose_frechet = end_section_proof();;
262 (start_section_proof ["f";"h";"t"](`(lift o f) differentiable at (h t) ==>
263         (h o drop) differentiable at (lift t) ==>
264         ((f o h) has_real_derivative (jacobian (lift o f) (at (h t)) ** 
265                                 jacobian (h o drop) (at (lift t)))$1$1) (atreal t)`));;
266 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dh"])))));;
267 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_derivative_compose_frechet)(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "dh")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
268 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN frechet_eq_jacobian)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac)))));;
269 refine (by (VALID ((((USE_THM_THEN MATRIX_VECTOR_MUL_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN matrix_vector_mul)(new_rewrite [] [])) THEN ((USE_THM_THEN DROP_LAMBDA)(new_rewrite [] [])) THEN ((USE_THM_THEN DIMINDEX_1)(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_SING_NUMSEG)(new_rewrite [] [])) THEN (simp_tac)))));;
270 refine (by (VALID (((((USE_THM_THEN LIFT_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] []))) THEN (done_tac)))));;
271 let real_derivative_compose_jacobian = end_section_proof();;
272 (start_section_proof ["f";"h";"t"](`(lift o f) differentiable at (h t) ==> 
273         (h o drop) differentiable at (lift t) ==>
274         (f o h) real_differentiable atreal t`));;
275 refine (by (VALID ((BETA_TAC THEN (move ["diff_f"]) THEN (move ["diff_h"])))));;
276 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_derivative_compose_frechet)(fun fst_th ->(USE_THEN "diff_f")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "diff_h")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
277 refine (by (VALID ((set_tac "fh'" (`(drop o _ o lift) (&1)`)))));;
278 refine (by (VALID (((((USE_THM_THEN real_differentiable)(new_rewrite [] [])) THEN (move ["dfh"])) THEN (exists_tac (mk_var("fh'",mk_type("real",[])))) THEN (done_tac)))));;
279 let diff_imp_real_diff = end_section_proof();;
280 (start_section_proof ["y";"e";"net"](`((\t. y + t % e) o drop) differentiable net`));;
281 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`(\t. y + t % e) o drop = (\x. y + drop x % e)`)) ((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac))))));;
282 refine (by (VALID ((((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
283 refine (by (VALID (((USE_THM_THEN HAS_DERIVATIVE_IMP_DIFFERENTIABLE) apply_tac))));;
284 refine (by (VALID (((exists_tac (`\x. drop x % e`)) THEN ((USE_THM_THEN HAS_DERIVATIVE_VMUL_DROP) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_ID)(new_rewrite [] [])) THEN (done_tac)))));;
285 let diff_direction = end_section_proof();;
286 (start_section_proof ["y";"e";"t"](`frechet_derivative ((\t. y + t % e) o drop) (at (lift t)) = (\x. drop x % e)`));;
287 refine (by (VALID ((((USE_THM_THEN f_unary_drop)(new_rewrite [] [])) THEN ((USE_THM_THEN frechet_add)(new_rewrite [] []))))));;
288 refine (by (VALID (((((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN ((USE_THM_THEN HAS_DERIVATIVE_IMP_DIFFERENTIABLE) apply_tac)))));;
289 refine (by (VALID (((exists_tac (`\x. drop x % e`)) THEN ((USE_THM_THEN HAS_DERIVATIVE_VMUL_DROP) apply_tac) THEN ((USE_THM_THEN HAS_DERIVATIVE_ID)(new_rewrite [] []))))));;
290 refine (by (VALID (((((USE_THM_THEN frechet_vmul)(new_rewrite [] [])) THEN ((USE_THM_THEN frechet_const)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_ADD_LID)(new_rewrite [] []))) THEN (done_tac)))));;
291 let frechet_direction = end_section_proof();;
292 (start_section_proof ["f";"y";"e";"t"](`(lift o f) differentiable at (y + t % e) ==>
293         ((f o (\t. y + t % e)) has_real_derivative 
294                 (drop (frechet_derivative (lift o f) (at (y + t % e)) e))) (atreal t)`));;
295 refine (by (VALID ((BETA_TAC THEN (move ["df"])))));;
296 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_derivative_compose_frechet)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1451778"]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`\t. y + t % e`) thm_tac))(ISPEC_THEN (mk_var("t",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC))));;
297 refine (by (VALID (((((USE_THEN "df")(new_rewrite [] [])) THEN ((USE_THM_THEN diff_direction)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN frechet_direction)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_MUL_LID)(new_rewrite [] []))) THEN (done_tac)))));;
298 let real_dir_derivative_frechet = end_section_proof();;
299 (start_section_proof ["f";"y";"e";"t"](`(lift o f) differentiable at (y + t % e) ==>
300         ((f o (\t. y + t % e)) has_real_derivative 
301                 drop (jacobian (lift o f) (at (y + t % e)) ** e)) (atreal t)`));;
302 refine (by (VALID ((BETA_TAC THEN (move ["df"])))));;
303 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_dir_derivative_frechet)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1451859"]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (mk_var("e",mk_type("cart",[mk_type("real",[]);mk_vartype "?1451859"]))) thm_tac))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
304 refine (by (VALID ((((USE_THM_THEN frechet_eq_jacobian)(new_rewrite [] [])) THEN (done_tac)))));;
305 let real_dir_derivative_jacobian = end_section_proof();;
306 (start_section_proof ["f";"y";"i"](`(lift o f) differentiable at (y:real^N) ==>
307         partial i f y = drop (frechet_derivative (lift o f) (at y) (basis i))`));;
308 refine (by (VALID (((BETA_TAC THEN (move ["df"])) THEN ((USE_THM_THEN partial)(new_rewrite [] []))))));;
309 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_dir_derivative_frechet)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (mk_var("y",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(ISPEC_THEN (`basis i:real^N`) thm_tac))(ISPEC_THEN (`&0`) thm_tac))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])))))));;
310 refine (by (VALID (((BETA_TAC THEN ((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (DISCH_THEN (fun snd_th -> (USE_THM_THEN derivative_unique)(MATCH_MP_THEN snd_th MP_TAC)))) THEN (done_tac)))));;
311 let partial_eq_frechet = end_section_proof();;
312 (start_section_proof ["f";"y";"i"](`(lift o f) differentiable at y ==>
313         partial i f y = drop (jacobian (lift o f) (at y) ** basis i)`));;
314 refine (by (VALID ((BETA_TAC THEN (move ["df"])))));;
315 refine (by (VALID (((((USE_THEN "df")MP_TAC) THEN BETA_TAC) THEN ((((USE_THM_THEN partial_eq_frechet)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN JACOBIAN_WORKS)(new_rewrite [] []))) THEN (DISCH_THEN (fun snd_th -> (USE_THM_THEN FRECHET_DERIVATIVE_AT)(MATCH_MP_THEN snd_th MP_TAC))) THEN (DISCH_THEN(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
316 let partial_eq_jacobian = end_section_proof();;
317 (start_section_proof ["f";"y";"i"](`(lift o (f:real^N->real)) differentiable at y ==>
318         i IN 1..dimindex (:N) ==>
319         partial i f y = drop (column i (jacobian (lift o f) (at y)))`));;
320 refine (by (VALID ((((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (move ["df"]) THEN (move ["ineq"])))));;
321 refine (by (VALID (((((USE_THM_THEN partial_eq_jacobian)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN MATRIX_VECTOR_MUL_BASIS)(new_rewrite [] []))) THEN (done_tac)))));;
322 let partial_eq_jacobian_column = end_section_proof();;
323 (start_section_proof ["f";"y";"i"](`(lift o (f:real^N->real)) differentiable at y ==>
324         i IN 1..dimindex (:N) ==>
325         partial i f y = (jacobian (lift o f) (at y))$1$i`));;
326 refine (by (VALID (((BETA_TAC THEN (move ["df"]) THEN (move ["ineq"])) THEN (((USE_THM_THEN partial_eq_jacobian_column)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN column)(new_rewrite [] [])) THEN ((USE_THM_THEN DROP_LAMBDA)(new_rewrite [] []))) THEN (done_tac)))));;
327 let partial_eq_jacobian_entry = end_section_proof();;
328 (add_section_var (mk_var ("y", (`:real^N`))));;
329 (add_section_var (mk_var ("i", (`:num`))));;
330 (start_section_proof ["f"](`~(i IN 1..dimindex (:N)) ==>
331         partial i f y = &0`));;
332 refine (by (VALID (((BETA_TAC THEN (move ["ineq"])) THEN ((USE_THM_THEN partial)(new_rewrite [] []))))));;
333 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`basis i = (vec 0):real^N`)) (((USE_THM_THEN BASIS_EQ_0)(new_rewrite [] [])) THEN (done_tac))))));;
334 refine (by (VALID ((((USE_THM_THEN VECTOR_MUL_RZERO)(fun th -> ONCE_REWRITE_TAC[th])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(fun th -> ONCE_REWRITE_TAC[th]))))));;
335 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`derivative (f o (\t. y)) = derivative (\t. f y)`)))));;
336 refine (by (VALID (((AP_TERM_TAC) THEN (((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
337 refine (by (VALID ((((USE_THM_THEN derivative_const)(new_rewrite [] [])) THEN (done_tac)))));;
338 let partial_eq0 = end_section_proof();;
339 (start_section_proof ["f";"g";"x"](`f real_differentiable atreal (g x) ==>
340         g real_differentiable atreal x ==>
341         derivative (f o g) x = derivative f (g x) * derivative g x`));;
342 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dg"])))));;
343 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`f o g = \x. f (g x)`)) ((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac))))));;
344 refine (by (VALID (((((USE_THM_THEN derivative_composition)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_MUL_SYM)(new_rewrite [] []))) THEN (done_tac)))));;
345 let derivative_compose = end_section_proof();;
346 (start_section_proof ["i";"net"](`i IN 1..dimindex (:N) ==>
347         (lift o (\x:real^N. x$i) has_derivative lift o (\x. x$i)) net`));;
348 refine (by (VALID ((((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (move ["ineq"])))));;
349 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`lift o (\x:real^N. x$i) = (\x. x$i % vec 1)`)))));;
350 refine (by (VALID ((((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac)) THEN (move ["x"])) THEN (((USE_THM_THEN DROP_EQ)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] [])) THEN ((USE_THM_THEN DROP_CMUL)(new_rewrite [] [])) THEN ((USE_THM_THEN DROP_VEC)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] []))) THEN (done_tac)))));;
351 refine (by (VALID (((((USE_THM_THEN (GEN_ALL HAS_DERIVATIVE_VMUL_COMPONENT))(new_rewrite [] [])) THEN ((USE_THM_THEN HAS_DERIVATIVE_ID)(new_rewrite [] []))) THEN (done_tac)))));;
352 let projection_has_derivative = end_section_proof();;
353 (start_section_proof ["i";"net"](`i IN 1..dimindex (:N) ==>
354         (lift o (\x:real^N. x$i)) differentiable net`));;
355 refine (by (VALID ((((USE_THM_THEN differentiable)(new_rewrite [] [])) THEN (DISCH_THEN (fun snd_th -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN projection_has_derivative)(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("net",mk_type("net",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"])]))) thm_tac))(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["h"])))));;
356 refine (by (VALID (((exists_tac (`lift o \x:real^N. x$i`)) THEN (done_tac)))));;
357 let projection_diff = end_section_proof();;
358 (start_section_proof ["i";"x"](`i IN 1..dimindex (:N) ==>
359         frechet_derivative (lift o (\x:real^N. x$i)) (at x)  = lift o (\x:real^N. x$i)`));;
360 refine (by (VALID (((BETA_TAC THEN (move ["ineq"])) THEN ((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])) THEN ((USE_THM_THEN FRECHET_DERIVATIVE_AT) apply_tac)))));;
361 refine (by (VALID ((((USE_THM_THEN projection_has_derivative)(new_rewrite [] [])) THEN (done_tac)))));;
362 let frechet_projection = end_section_proof();;
363 (start_section_proof ["h";"t";"i"](`i IN 1..dimindex (:N) ==>
364         (h o drop) differentiable at (lift t) ==>
365         ((\s. (h:real->real^N) s$i) has_real_derivative
366                 (frechet_derivative (h o drop) (at (lift t)) (lift (&1)))$i) (atreal t)`));;
367 refine (by (VALID ((BETA_TAC THEN (move ["ineq"]) THEN (move ["dh"])))));;
368 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`(\s. h s$i) = (\x. x$i) o h`)) ((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac))))));;
369 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_derivative_compose_frechet)(ISPEC_THEN (`\x:real^N. x$i`) thm_tac))(ISPEC_THEN (mk_var("h",mk_type("fun",[mk_type("real",[]);mk_type("cart",[mk_type("real",[]);mk_vartype "N"])]))) thm_tac))(ISPEC_THEN (mk_var("t",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC))));;
370 refine (by (VALID ((((USE_THEN "dh")(new_rewrite [] [])) THEN ((USE_THM_THEN projection_diff)(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))))));;
371 refine (by (VALID ((set_tac "lhs" (`(drop o _ o lift) (&1)`)))));;
372 refine (by (VALID ((set_tac "rhs" (`(frechet_derivative _1 _2 _3)$i`)))));;
373 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac (DISCH_THEN(new_rewrite [] [])) (`lhs = rhs`))) ((done_tac) THEN (done_tac))))));;
374 refine (by (VALID (((((USE_THEN "lhs_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN frechet_projection)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "rhs_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] []))) THEN (done_tac)))));;
375 let has_derivative_vector_frechet = end_section_proof();;
376 (start_section_proof ["h";"t";"i"](`i IN 1..dimindex (:N) ==>
377         (h o drop) differentiable at (lift t) ==>
378         ((\s. (h:real->real^N) s$i) has_real_derivative (jacobian (h o drop) (at (lift t)))$i$1) (atreal t)`));;
379 refine (by (VALID ((BETA_TAC THEN (move ["ineq"]) THEN (move ["dh"])))));;
380 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN has_derivative_vector_frechet)(fun fst_th ->(USE_THEN "ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "dh")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
381 refine (by (VALID ((set_tac "lhs" (`(frechet_derivative _1 _2 _3)$i`)))));;
382 refine (by (VALID ((set_tac "rhs" (`jacobian _1 _2$i$1`)))));;
383 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac (DISCH_THEN(new_rewrite [] [])) (`lhs = rhs`))) ((done_tac) THEN (done_tac))))));;
384 refine (by (VALID ((((USE_THEN "lhs_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN frechet_eq_jacobian)(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))))));;
385 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`lift (&1) = basis 1`)))));;
386 refine (by (VALID (((((USE_THM_THEN DROP_EQ)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] [])) THEN ((USE_THM_THEN basis)(new_rewrite [] [])) THEN ((USE_THM_THEN DROP_LAMBDA)(new_rewrite [] []))) THEN (done_tac)))));;
387 refine (by (VALID (((((USE_THM_THEN MATRIX_VECTOR_MUL_BASIS)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN DIMINDEX_GE_1)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN leqnn)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN column)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN IN_NUMSEG)(GSYM_THEN (new_rewrite [] []))))) THEN (done_tac)))));;
388 let has_derivative_vector_jacobian = end_section_proof();;
389 (start_section_proof ["h";"t";"i"](`i IN 1..dimindex (:N) ==>
390         ((h:real->real^N) o drop) differentiable at (lift t) ==>
391         derivative (\s. h s$i) t = jacobian (h o drop) (at (lift t))$i$1`));;
392 refine (by (VALID (((BETA_TAC THEN (move ["ineq"]) THEN (move ["dh"])) THEN ((USE_THM_THEN derivative_unique) apply_tac) THEN ((USE_THM_THEN has_derivative_vector_jacobian)(new_rewrite [] [])) THEN (done_tac)))));;
393 let derivative_vector_jacobian = end_section_proof();;
394 (start_section_proof ["f";"h";"t"](`(lift o (f:real^N -> real)) differentiable at (h t) ==>
395         (h o drop) differentiable at (lift t) ==>
396         ((f o h) has_real_derivative
397                 sum (1..dimindex (:N)) (\i. partial i f (h t) * derivative (\s. h s$i) t)) (atreal t)`));;
398 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dh"])))));;
399 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_derivative_compose_jacobian)(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "dh")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
400 refine (by (VALID (((set_tac "lhs" (`_$1$1`)) THEN (set_tac "rhs" (`sum _ _2`))))));;
401 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac (DISCH_THEN(new_rewrite [] [])) (`lhs = rhs`))) ((done_tac) THEN (done_tac))))));;
402 refine (by (VALID (((USE_THEN "lhs_def")(GSYM_THEN (new_rewrite [] []))))));;
403 refine (by (VALID ((((USE_THM_THEN matrix_mul)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN DIMINDEX_GE_1)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN leqnn)(new_rewrite [] []))) THEN ((simp_tac THEN TRY done_tac))))));;
404 refine (by (VALID ((((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN DIMINDEX_GE_1)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN leqnn)(new_rewrite [] []))) THEN ((simp_tac THEN TRY done_tac)) THEN ((USE_THEN "rhs_def")(GSYM_THEN (new_rewrite [] [])))))));;
405 refine (by (VALID ((((USE_THM_THEN SUM_EQ) apply_tac) THEN (move ["i"]) THEN (move ["ineq"]) THEN (simp_tac)))));;
406 refine (by (VALID (((((USE_THM_THEN partial_eq_jacobian_entry)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_EQ_MUL_LCANCEL)(new_rewrite [] [])) THEN ((USE_THM_THEN derivative_vector_jacobian)(new_rewrite [] []))) THEN (done_tac)))));;
407 let real_derivative_compose_partial = end_section_proof();;
408 (start_section_proof ["f";"e";"t"](`(lift o f) differentiable at (y + t % e) ==>
409         ((f o (\t. y + t % e)) has_real_derivative
410                 sum (1..dimindex (:N)) (\i. e$i * (partial i f o (\t. y + t % e)) t)) (atreal t)`));;
411 refine (by (VALID ((BETA_TAC THEN (move ["df"])))));;
412 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_dir_derivative_jacobian)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (mk_var("y",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(ISPEC_THEN (mk_var("e",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
413 refine (by (VALID ((((USE_THM_THEN matrix_vector_mul)(new_rewrite [] [])) THEN ((USE_THM_THEN DROP_LAMBDA)(new_rewrite [] []))))));;
414 refine (by (VALID (((set_tac "lhs" (`sum _1 _2`)) THEN (set_tac "rhs" (`sum _1 _2`))))));;
415 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac (DISCH_THEN(new_rewrite [] [])) (`lhs = rhs`))) ((done_tac) THEN (done_tac))))));;
416 refine (by (VALID (((((USE_THEN "lhs_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "rhs_def")(GSYM_THEN (new_rewrite [] [])))) THEN (((USE_THM_THEN SUM_EQ) apply_tac) THEN (move ["i"]) THEN (move ["ineq"]) THEN (simp_tac))))));;
417 refine (by (VALID (((((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN partial_eq_jacobian_entry)(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac)) THEN ((USE_THM_THEN REAL_MUL_SYM)(new_rewrite [] []))) THEN (done_tac)))));;
418 let real_dir_derivative_partial = end_section_proof();;
419 (add_section_var (mk_var ("f", (`:real^N -> real`))); add_section_var (mk_var ("g", (`:real^N -> real`))));;
420 (add_section_hyp "df" (`(lift o f) differentiable at y`));;
421 (start_section_proof ["u"](`u real_differentiable atreal (f y) ==>
422         partial i (u o f) y = derivative u (f y) * partial i f y`));;
423 refine (by (VALID (((BETA_TAC THEN (move ["du"])) THEN (repeat_tactic 1 9 (((USE_THM_THEN partial)(new_rewrite [] []))) THEN ((USE_THM_THEN o_ASSOC)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN derivative_compose)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac))))));;
424 refine (by (VALID (((((USE_THM_THEN diff_imp_real_diff)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN ((USE_THM_THEN diff_direction)(new_rewrite [] []))) THEN (done_tac)))));;
425 refine (by (VALID (((((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] []))) THEN (done_tac)))));;
426 let partial_uni_compose = end_section_proof();;
427 (start_section_proof [](`partial i (\x. --f x) y = --partial i f y`));;
428 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN partial_eq_frechet)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN f_lift_neg)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_NEG)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 0 10 (((USE_THM_THEN frechet_neg)(new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN DROP_NEG)(fun th -> ONCE_REWRITE_TAC[th]))) THEN (done_tac)))));;
429 let partial_neg = end_section_proof();;
430 (start_section_proof ["c"](`partial i (\x. c * f x) y = c * partial i f y`));;
431 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN partial_eq_frechet)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN f_lift_scale)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_CMUL)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 0 10 (((USE_THM_THEN frechet_scale)(new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN ((TRY done_tac)))))));;
432 refine (by (VALID ((((USE_THM_THEN DROP_CMUL)(new_rewrite [] [])) THEN (done_tac)))));;
433 let partial_scale = end_section_proof();;
434 (add_section_hyp "dg" (`(lift o g) differentiable at y`));;
435 (start_section_proof [](`partial i (\x. f x + g x) y = partial i f y + partial i g y`));;
436 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN partial_eq_frechet)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN f_lift_add)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 0 10 (((USE_THM_THEN frechet_add)(new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN ((TRY done_tac)))))));;
437 refine (by (VALID ((((USE_THM_THEN DROP_ADD)(new_rewrite [] [])) THEN (done_tac)))));;
438 let partial_add = end_section_proof();;
439 (start_section_proof [](`partial i (\x. f x - g x) y = partial i f y - partial i g y`));;
440 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN partial_eq_frechet)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN f_lift_sub)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_SUB)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 0 10 (((USE_THM_THEN frechet_sub)(new_rewrite [] [])))) THEN (repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN ((TRY done_tac)))))));;
441 refine (by (VALID ((((USE_THM_THEN DROP_SUB)(new_rewrite [] [])) THEN (done_tac)))));;
442 let partial_sub = end_section_proof();;
443 (start_section_proof [](`partial i (\x. f x * g x) y = partial i f y * g y + f y * partial i g y`));;
444 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN partial)(new_rewrite [] []))) THEN (set_tac "h" (`\t. y + t % basis i`))))));;
445 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`(\x. f x * g x) o h = (\t. (f o h) t * (g o h) t)`)))));;
446 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] [])))) THEN (done_tac)))));;
447 refine (by (VALID (((THENL_ROT (-1)) ((USE_THM_THEN derivative_mul)(new_rewrite [] []))))));;
448 refine (by (VALID ((((USE_THEN "h_def")(GSYM_THEN (new_rewrite [1; 4] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN o_THM)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])]))) thm_tac))(GSYM_THEN (new_rewrite [] []))) THEN ((fun thm_tac -> (USE_THM_THEN o_THM)(ISPEC_THEN (mk_var("g",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])]))) thm_tac))(GSYM_THEN (new_rewrite [] [])))))));;
449 refine (by (VALID ((((USE_THM_THEN REAL_ADD_SYM)(new_rewrite [] [])) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac)))));;
450 refine (by (VALID (((THENL_FIRST) (have_tac (move ["h0"]) (`h (&0) = y`)) ((((USE_THEN "h_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] []))) THEN (done_tac))))));;
451 refine (by (VALID (((THENL_FIRST) (have_tac (move ["dh"]) (`(h o drop) differentiable at (lift (&0))`)) ((((USE_THEN "h_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN diff_direction)(new_rewrite [] []))) THEN (done_tac))))));;
452 refine (by (VALID ((((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff_imp_real_diff)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "h0")(new_rewrite [] [])))) THEN (done_tac)))));;
453 let partial_mul = end_section_proof();;
454 let partial_mul = finalize_theorem partial_mul;;
455 let partial_sub = finalize_theorem partial_sub;;
456 let partial_add = finalize_theorem partial_add;;
457 let partial_scale = finalize_theorem partial_scale;;
458 let partial_neg = finalize_theorem partial_neg;;
459 let partial_uni_compose = finalize_theorem partial_uni_compose;;
460 let real_dir_derivative_partial = finalize_theorem real_dir_derivative_partial;;
461 let real_derivative_compose_partial = finalize_theorem real_derivative_compose_partial;;
462 let derivative_vector_jacobian = finalize_theorem derivative_vector_jacobian;;
463 let has_derivative_vector_jacobian = finalize_theorem has_derivative_vector_jacobian;;
464 let has_derivative_vector_frechet = finalize_theorem has_derivative_vector_frechet;;
465 let frechet_projection = finalize_theorem frechet_projection;;
466 let projection_diff = finalize_theorem projection_diff;;
467 let projection_has_derivative = finalize_theorem projection_has_derivative;;
468 let derivative_compose = finalize_theorem derivative_compose;;
469 let partial_eq0 = finalize_theorem partial_eq0;;
470 let partial_eq_jacobian_entry = finalize_theorem partial_eq_jacobian_entry;;
471 let partial_eq_jacobian_column = finalize_theorem partial_eq_jacobian_column;;
472 let partial_eq_jacobian = finalize_theorem partial_eq_jacobian;;
473 let partial_eq_frechet = finalize_theorem partial_eq_frechet;;
474 let real_dir_derivative_jacobian = finalize_theorem real_dir_derivative_jacobian;;
475 let real_dir_derivative_frechet = finalize_theorem real_dir_derivative_frechet;;
476 let frechet_direction = finalize_theorem frechet_direction;;
477 let diff_direction = finalize_theorem diff_direction;;
478 let diff_imp_real_diff = finalize_theorem diff_imp_real_diff;;
479 let real_derivative_compose_jacobian = finalize_theorem real_derivative_compose_jacobian;;
480 let real_derivative_compose_frechet = finalize_theorem real_derivative_compose_frechet;;
481 (end_section "Partial");;
482 (begin_section "PartialMonotone");;
483 (start_section_proof ["f";"x"](`f real_differentiable atreal x ==>
484         derivative f x = derivative (f o (\t. x + t)) (&0)`));;
485 refine (by (VALID ((BETA_TAC THEN (move ["diff_f"])))));;
486 refine (by (VALID ((((USE_THM_THEN derivative_compose)(new_rewrite [] [])) THEN (simp_tac) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_ADD_RID)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "diff_f")(new_rewrite [] [])))))));;
487 refine (by (VALID (((((USE_THM_THEN REAL_DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_ID)(new_rewrite [] [])))) THEN (done_tac)))));;
488 refine (by (VALID ((((USE_THM_THEN derivative_add)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_ID)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
489 refine (by (VALID (((((USE_THM_THEN derivative_const)(new_rewrite [] [])) THEN ((USE_THM_THEN derivative_x)(new_rewrite [] [])) THEN (simp_tac)) THEN (arith_tac) THEN (done_tac)))));;
490 let derivative_translation = end_section_proof();;
491 (add_section_type (mk_var ("f", (`:real^N->real`))));;
492 (start_section_proof ["f";"j";"u";"x";"z";"lo"](`(!i. i IN 1..dimindex (:N) ==> ~(i = j) ==> u$i = z$i) ==>
493         u$j = x$j ==>
494         (!y. y IN interval [x,z] ==> (lift o f) differentiable at y) ==>
495         (!y. y IN interval [x,z] ==> &0 <= partial j f y) ==>
496         (!y. y IN interval [x,u] ==> lo <= f y) ==>
497         (!y. y IN interval [x,z] ==> lo <= f y)`));;
498 refine (by (VALID (((((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] [])))) THEN (move ["uz_eq"]) THEN (move ["ux_eq"]) THEN (move ["diff_f"]) THEN (move ["partial_pos"]) THEN (move ["f_bound"]) THEN (move ["y"]) THEN (move ["y_in"])))));;
499 refine (by (VALID (((((USE_THEN "partial_pos")MP_TAC) THEN (clear_assumption "partial_pos") THEN ((USE_THEN "diff_f")MP_TAC) THEN (clear_assumption "diff_f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL IN_INTERVAL))(GSYM_THEN (new_rewrite [] [])))) THEN (move ["diff_f"]) THEN (move ["partial_pos"]))))));;
500 refine (by (VALID ((set_tac "y'" (`(lambda i. if i = j then x$j else y$i):real^N`)))));;
501 refine (by (VALID ((((THENL_ROT 1)) (have_tac ALL_TAC (`f y' <= f y`))))));;
502 refine (by (VALID (((((USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))MP_TAC) THEN (DISCH_THEN apply_tac)) THEN (((USE_THEN "f_bound")MP_TAC) THEN (clear_assumption "f_bound") THEN (DISCH_THEN apply_tac) THEN (move ["i"]) THEN (move ["i_in"]))))));;
503 refine (by (VALID ((((USE_THEN "y'_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))))));;
504 refine (by (VALID (((THENL_FIRST) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`i = j`) thm_tac))MP_TAC) THEN case THEN (simp_tac) THEN (move ["ij"])) ((((USE_THEN "ux_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN (done_tac))))));;
505 refine (by (VALID (((((USE_THEN "uz_eq")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THEN "y_in")(new_rewrite [] [])))) THEN (done_tac)))));;
506 refine (by (VALID ((((THENL_ROT (-1)) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`j IN 1..dimindex (:N)`) thm_tac))MP_TAC) THEN case)) THEN (((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (move ["j_in"]))))));;
507 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac ALL_TAC (`y' = y`))) ((BETA_TAC THEN (DISCH_THEN(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] [])) THEN (done_tac))))));;
508 refine (by (VALID ((((USE_THM_THEN CART_EQ)(new_rewrite [] [])) THEN (move ["i"]) THEN (move ["i_in"])))));;
509 refine (by (VALID (((THENL_FIRST) (have_tac (move ["inj"]) (`~(i = j)`)) ((((USE_THEN "i_in")MP_TAC) THEN (clear_assumption "i_in") THEN ((USE_THEN "j_in")MP_TAC) THEN (clear_assumption "j_in") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
510 refine (by (VALID (((((USE_THEN "y'_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] []))) THEN (done_tac)))));;
511 refine (by (VALID ((set_tac "g" (`f o (\t. y' + t % basis j)`)))));;
512 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`f y' = g (&0)`)))));;
513 refine (by (VALID (((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] []))) THEN (done_tac)))));;
514 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`f y = g (y$j - x$j)`)))));;
515 refine (by (VALID (((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac)) THEN (AP_TERM_TAC)))));;
516 refine (by (VALID ((((USE_THM_THEN CART_EQ)(new_rewrite [] [])) THEN (move ["i"]) THEN (move ["i_in"])))));;
517 refine (by (VALID ((((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN ((TRY done_tac))))));;
518 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`i = j`) thm_tac))MP_TAC) THEN case THEN (simp_tac) THEN (move ["ij"])) THEN (((USE_THEN "y'_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN ((TRY done_tac)))))));;
519 refine (by (VALID (((arith_tac) THEN (done_tac)))));;
520 refine (by (VALID ((((simp_tac) THEN ((USE_THEN "ij")(new_rewrite [] [])) THEN (simp_tac)) THEN (arith_tac) THEN (done_tac)))));;
521 refine (by (VALID ((set_tac "s" (`real_interval [&0, y$j - x$j]`)))));;
522 refine (by (VALID ((have_tac (move ["in_s"]) (`!t. t IN s ==> y' + t % basis j IN interval [x,z]`)))));;
523 refine (by (VALID (((((USE_THEN "s_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] []))) THEN (move ["t"]) THEN (move ["t_ineq"]) THEN (move ["i"]) THEN (move ["i_ineq"])))));;
524 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] []))) THEN ((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN ((TRY done_tac))))));;
525 refine (by (VALID ((((USE_THEN "y'_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))))));;
526 refine (by (VALID (((THENL_ROT (-1)) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`i = j`) thm_tac))MP_TAC) THEN case THEN (simp_tac) THEN (move ["ij"]))))));;
527 refine (by (VALID (((((USE_THM_THEN REAL_MUL_RZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ADD_RID)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THEN "y_in")(new_rewrite [] [])))) THEN (done_tac)))));;
528 refine (by (VALID (((((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN ((fun thm_tac -> (USE_THEN "y_in")(fun fst_th ->(USE_THEN "i_ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN ((USE_THEN "ij")(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac)))));;
529 refine (by (VALID ((have_tac (move ["ds"]) (`!t. t IN s ==> (g has_real_derivative (partial j f (y' + t % basis j))) (atreal t within s)`)))));;
530 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "in_s")(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["p_in"])) THEN (((USE_THM_THEN HAS_REAL_DERIVATIVE_ATREAL_WITHIN)MP_TAC) THEN (clear_assumption "HAS_REAL_DERIVATIVE_ATREAL_WITHIN") THEN (DISCH_THEN apply_tac)) THEN ((USE_THM_THEN partial)(new_rewrite [] []))))));;
531 refine (by (VALID ((set_tac "h" (`f o _`)))));;
532 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`h = g o (\t'. t + t')`)))));;
533 refine (by (VALID ((((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "h_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] [])))) THEN (move ["r"])) THEN (repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac))))));;
534 refine (by (VALID (((((USE_THM_THEN (GEN_ALL VECTOR_ADD_RDISTRIB))(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_ASSOC))(new_rewrite [] []))) THEN (done_tac)))));;
535 refine (by (VALID (((((USE_THM_THEN derivative_translation)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN has_derivative_alt)(new_rewrite [] []))) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN diff_imp_real_diff)(new_rewrite [] []))) THEN (((USE_THEN "diff_f")(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac)) THEN ((USE_THM_THEN diff_direction)(new_rewrite [] []))) THEN (done_tac)))));;
536 refine (by (VALID (((THENL_FIRST) (have_tac (move ["pos"]) (`&0 <= y$j - x$j`)) ((((fun thm_tac -> (USE_THEN "y_in")(fun fst_th ->(USE_THEN "j_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
537 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN HAS_REAL_DERIVATIVE_INCREASING_IMP)(ISPEC_THEN (mk_var("g",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`\t. partial j f (y' + t % basis j)`) thm_tac))(ISPEC_THEN (mk_var("s",mk_type("fun",[mk_type("real",[]);mk_type("bool",[])]))) thm_tac))(ISPEC_THEN (`&0`) thm_tac))(ISPEC_THEN (`y$j - x$j`) thm_tac)) MP_TAC) THEN ALL_TAC))));;
538 refine (by (VALID (((((USE_THEN "s_def")(GSYM_THEN (new_rewrite [1] []))) THEN ((USE_THM_THEN IS_REALINTERVAL_INTERVAL)(new_rewrite [] [])) THEN (simp_tac)) THEN (((USE_THEN "ds")(fun th -> ONCE_REWRITE_TAC[th])) THEN (simp_tac)) THEN (DISCH_THEN apply_tac)))));;
539 refine (by (VALID ((((USE_THEN "s_def")(GSYM_THEN (new_rewrite [2; 3] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN ((USE_THEN "pos")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN (simp_tac)))));;
540 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "in_s")(MATCH_MP_THEN snd_th MP_TAC))) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "partial_pos")(MATCH_MP_THEN snd_th MP_TAC)))) THEN (done_tac)))));;
541 let partial_increasing_left = end_section_proof();;
542 (start_section_proof ["f";"j";"u";"x";"z";"hi"](`(!i. i IN 1..dimindex (:N) ==> ~(i = j) ==> u$i = z$i) ==>
543         u$j = x$j ==>
544         (!y. y IN interval [x,z] ==> (lift o f) differentiable at y) ==>
545         (!y. y IN interval [x,z] ==> partial j f y <= &0) ==>
546         (!y. y IN interval [x,u] ==> f y <= hi) ==>
547         (!y. y IN interval [x,z] ==> f y <= hi)`));;
548 refine (by (VALID ((BETA_TAC THEN (move ["u_eq_i"]) THEN (move ["u_eq_j"]) THEN (move ["diff_f"]) THEN (move ["partial_f"]) THEN (move ["f_bound"]) THEN (move ["y"]) THEN (move ["y_in"])))));;
549 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN partial_increasing_left)(ISPEC_THEN (`(\p. -- f p)`) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("u",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(ISPEC_THEN (mk_var("x",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(ISPEC_THEN (mk_var("z",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(ISPEC_THEN (`--hi`) thm_tac))(fun fst_th ->(USE_THEN "u_eq_i")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "u_eq_j")(fun th -> MATCH_MP_THEN th thm_tac fst_th))) MP_TAC) THEN ALL_TAC))));;
550 refine (by (VALID (((THENL_FIRST) (ANTS_TAC) ((BETA_TAC THEN (move ["p"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "diff_f")(MATCH_MP_THEN snd_th MP_TAC))) THEN (DISCH_THEN (fun snd_th -> (USE_THM_THEN DIFFERENTIABLE_NEG)(MATCH_MP_THEN snd_th MP_TAC)))) THEN ((USE_THM_THEN f_lift_neg)(new_rewrite [] [])) THEN (done_tac))))));;
551 refine (by (VALID ((ANTS_TAC))));;
552 refine (by (VALID (((BETA_TAC THEN (move ["p"]) THEN (move ["p_in"])) THEN (((USE_THM_THEN partial_neg)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "diff_f")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_NEG_GE0)(new_rewrite [] [])) THEN ((USE_THEN "partial_f")(new_rewrite [] []))) THEN (done_tac)))));;
553 refine (by (VALID (((THENL_FIRST) (ANTS_TAC) ((BETA_TAC THEN (move ["p"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "f_bound")(MATCH_MP_THEN snd_th MP_TAC)))) THEN (arith_tac) THEN (done_tac))))));;
554 refine (by (VALID (((((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "y_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
555 let partial_decreasing_left = end_section_proof();;
556 (start_section_proof ["f";"i";"p";"y"](`lift o f differentiable at (p + y) ==>
557         partial i (f o (\x. p + x)) y = partial i f (p + y)`));;
558 refine (by (VALID ((BETA_TAC THEN (move ["diff"])))));;
559 refine (by (VALID ((have_tac (move ["diff_p"]) (`!net. (\x. p + x) differentiable net`)))));;
560 refine (by (VALID (((BETA_TAC THEN (move ["net"])) THEN (((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ID)(new_rewrite [] []))) THEN (done_tac)))));;
561 refine (by (VALID ((((USE_THM_THEN partial_eq_frechet)(new_rewrite [] [])) THEN repeat_tactic 0 1 (((USE_THM_THEN o_ASSOC)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_CHAIN_AT)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
562 refine (by (VALID ((((USE_THM_THEN frechet_compose)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN frechet_add)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_ID)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
563 refine (by (VALID ((((USE_THM_THEN frechet_const)(new_rewrite [] [])) THEN ((USE_THM_THEN frechet_id)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_ADD_LID)(new_rewrite [] [])) THEN ((USE_THM_THEN I_DEF)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN I_O_ID)(new_rewrite [] []))))));;
564 refine (by (VALID ((((USE_THM_THEN partial_eq_frechet)(new_rewrite [] [])) THEN (done_tac)))));;
565 let partial_translation = end_section_proof();;
566 (start_section_proof ["f";"i";"p";"y"](`lift o f differentiable at (p - y) ==>
567         partial i (f o (\x. p - x)) y = --partial i f (p - y)`));;
568 refine (by (VALID ((BETA_TAC THEN (move ["diff"])))));;
569 refine (by (VALID ((have_tac (move ["diff_p"]) (`!net. (\x. p - x) differentiable net`)))));;
570 refine (by (VALID (((BETA_TAC THEN (move ["net"])) THEN (((USE_THM_THEN DIFFERENTIABLE_SUB)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ID)(new_rewrite [] []))) THEN (done_tac)))));;
571 refine (by (VALID ((((USE_THM_THEN partial_eq_frechet)(new_rewrite [] [])) THEN repeat_tactic 0 1 (((USE_THM_THEN o_ASSOC)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_CHAIN_AT)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
572 refine (by (VALID ((((USE_THM_THEN frechet_compose)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN frechet_sub)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_ID)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
573 refine (by (VALID ((((USE_THM_THEN frechet_const)(new_rewrite [] [])) THEN ((USE_THM_THEN frechet_id)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN (GEN_ALL VECTOR_SUB_LZERO))(new_rewrite [] []))))));;
574 refine (by (VALID ((((USE_THM_THEN partial_eq_frechet)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac)))));;
575 refine (by (VALID (((((USE_THM_THEN LINEAR_NEG)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN LINEAR_FRECHET_DERIVATIVE)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN DROP_NEG)(new_rewrite [] []))) THEN (done_tac)))));;
576 let partial_rev_translation = end_section_proof();;
577 (start_section_proof ["f";"j";"u";"x";"z";"hi"](`(!i. i IN 1..dimindex (:N) ==> ~(i = j) ==> u$i = x$i) ==>
578         u$j = z$j ==>
579         (!y. y IN interval [x,z] ==> (lift o f) differentiable at y) ==>
580         (!y. y IN interval [x,z] ==> &0 <= partial j f y) ==>
581         (!y. y IN interval [u,z] ==> f y <= hi) ==>
582         (!y. y IN interval [x,z] ==> f y <= hi)`));;
583 refine (by (VALID ((BETA_TAC THEN (move ["u_eq_i"]) THEN (move ["u_eq_j"]) THEN (move ["diff_f"]) THEN (move ["partial_f"]) THEN (move ["f_bound"]) THEN (move ["y"]) THEN (move ["y_in"])))));;
584 refine (by (VALID ((((THENL_ROT (-1)) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`j IN 1..dimindex (:N)`) thm_tac))MP_TAC) THEN case)) THEN (((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (move ["j_in"]))))));;
585 refine (by (VALID (((((USE_THEN "f_bound")MP_TAC) THEN (clear_assumption "f_bound") THEN (DISCH_THEN apply_tac)) THEN (((USE_THEN "y_in")MP_TAC) THEN (clear_assumption "y_in") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] []))) THEN (move ["y_ineq"]) THEN (move ["i"]) THEN (move ["i_in"]))))));;
586 refine (by (VALID (((THENL_FIRST) (have_tac (move ["inj"]) (`~(i = j)`)) ((((USE_THEN "i_in")MP_TAC) THEN (clear_assumption "i_in") THEN ((USE_THEN "j_in")MP_TAC) THEN (clear_assumption "j_in") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
587 refine (by (VALID (((((USE_THEN "u_eq_i")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN IN_NUMSEG)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THEN "y_ineq")(new_rewrite [] [])))) THEN (done_tac)))));;
588 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN partial_decreasing_left)(ISPEC_THEN (`f o (\p:real^N. x + (z - p))`) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))(ISPEC_THEN (`x + (z - u):real^N`) thm_tac))(ISPEC_THEN (mk_var("x",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(ISPEC_THEN (mk_var("z",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(ISPEC_THEN (mk_var("hi",mk_type("real",[]))) thm_tac)) MP_TAC) THEN ALL_TAC))));;
589 refine (by (VALID ((ANTS_TAC))));;
590 refine (by (VALID (((BETA_TAC THEN (move ["i"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "u_eq_i")(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["eq1"]) THEN (move ["inj"])) THEN (((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] [])))))));;
591 refine (by (VALID (((((USE_THEN "eq1")(new_rewrite [] [])) THEN ((TRY done_tac))) THEN (arith_tac) THEN (done_tac)))));;
592 refine (by (VALID (((THENL_FIRST) (ANTS_TAC) ((((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] [])) THEN ((USE_THEN "u_eq_j")(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac))))));;
593 refine (by (VALID ((have_tac (move ["Hp"]) (`!p. p IN interval [x,z] ==> x + (z - p) IN interval [x,z]`)))));;
594 refine (by (VALID (((BETA_TAC THEN (move ["p"])) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] []))) THEN (move ["p_in"]) THEN (move ["i"]) THEN (move ["ineq"]))))));;
595 refine (by (VALID (((((fun thm_tac -> (USE_THEN "p_in")(fun fst_th ->(USE_THEN "ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
596 refine (by (VALID ((set_tac "dP" (`!y. _ y`)))));;
597 refine (by (VALID ((have_tac (move ["P"]) (mk_var("dP",mk_type("bool",[])))))));;
598 refine (by (VALID ((((USE_THEN "dP_def")(GSYM_THEN (new_rewrite [] []))) THEN (BETA_TAC THEN (move ["p"]) THEN (move ["p_in"]))))));;
599 refine (by (VALID (((((USE_THM_THEN o_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CHAIN_AT)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_SUB)(new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_ID)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THEN "diff_f")(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac)) THEN ((USE_THEN "Hp")(new_rewrite [] []))) THEN (done_tac)))));;
600 refine (by (VALID (((((USE_THEN "P")MP_TAC) THEN (clear_assumption "P") THEN BETA_TAC THEN (simp_tac)) THEN (((USE_THEN "dP_def")(GSYM_THEN (new_rewrite [] []))) THEN (move ["diff"]))))));;
601 refine (by (VALID ((ANTS_TAC))));;
602 refine (by (VALID ((BETA_TAC THEN (move ["p"]) THEN (move ["p_in"])))));;
603 refine (by (VALID ((((USE_THM_THEN (VECTOR_ARITH `!x z p. x + z - p = (x + z) - p:real^N`)) MP_TAC) THEN (move ["assoc"])))));;
604 refine (by (VALID ((((USE_THEN "assoc")(new_rewrite [] [])) THEN ((USE_THM_THEN partial_rev_translation)(new_rewrite [] [])) THEN ((USE_THEN "assoc")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "diff_f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "Hp")(new_rewrite [] []))) THEN ((TRY done_tac))))));;
605 refine (by (VALID (((((USE_THM_THEN REAL_NEG_LE0)(new_rewrite [] [])) THEN ((USE_THEN "partial_f")(new_rewrite [] [])) THEN ((USE_THEN "Hp")(new_rewrite [] []))) THEN (done_tac)))));;
606 refine (by (VALID ((ANTS_TAC))));;
607 refine (by (VALID (((BETA_TAC THEN (move ["p"]) THEN (move ["p_in"])) THEN (((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "f_bound")(new_rewrite [] [])))))));;
608 refine (by (VALID (((((USE_THEN "p_in")MP_TAC) THEN (clear_assumption "p_in") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] []))) THEN (move ["ineq"]) THEN (move ["i"]) THEN (move ["i_ineq"]))))));;
609 refine (by (VALID (((((fun thm_tac -> (USE_THEN "ineq")(fun fst_th ->(USE_THEN "i_ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] [])))) THEN (arith_tac) THEN (done_tac)))));;
610 refine (by (VALID (((((fun thm_tac -> DISCH_THEN (ISPEC_THEN (`x + z - y:real^N`) thm_tac))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac))))));;
611 refine (by (VALID ((((USE_THM_THEN (VECTOR_ARITH `!x z y:real^N. x + z - (x + z - y) = y`))(new_rewrite [] [])) THEN (DISCH_THEN apply_tac)))));;
612 refine (by (VALID ((((USE_THEN "Hp")(new_rewrite [] [])) THEN (done_tac)))));;
613 let partial_increasing_right = end_section_proof();;
614 let partial_increasing_right = finalize_theorem partial_increasing_right;;
615 let partial_rev_translation = finalize_theorem partial_rev_translation;;
616 let partial_translation = finalize_theorem partial_translation;;
617 let partial_decreasing_left = finalize_theorem partial_decreasing_left;;
618 let partial_increasing_left = finalize_theorem partial_increasing_left;;
619 let derivative_translation = finalize_theorem derivative_translation;;
620 (end_section "PartialMonotone");;
621 (begin_section "Taylor");;
622 (start_section_proof ["f";"dd_bound"](`nth_diff_strong_int 2 (&0, &1) f ==>
623         (!t. interval_arith t (&0, &1) ==> abs (nth_derivative 2 f t) <= dd_bound) ==>
624         abs (f (&1) - (f (&0) + derivative f (&0))) <= dd_bound / &2`));;
625 refine (by (VALID (((((USE_THM_THEN nth_diff_strong_int)(new_rewrite [] [])) THEN ((USE_THM_THEN nth_diff_strong2_eq_alt)(new_rewrite [] []))) THEN (move ["df"]) THEN (move ["dd"])))));;
626 refine (by (VALID ((set_tac "R" (`\i. if i = 0 then f else if i = 1 then derivative f else nth_derivative 2 f`)))));;
627 refine (by (VALID ((((USE_THM_THEN (ARITH_RULE `0 + 1 = 1 /\ ~(1 = 0) /\ 1 + 1 = 2 /\ ~(2 = 1) /\ ~(2 = 0)`)) MP_TAC) THEN (move ["arithH"])))));;
628 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN REAL_TAYLOR)(ISPEC_THEN (mk_var("R",mk_type("fun",[mk_type("num",[]);mk_type("fun",[mk_type("real",[]);mk_type("real",[])])]))) thm_tac))(ISPEC_THEN (`1`) thm_tac))(ISPEC_THEN (`real_interval [&0, &1]`) thm_tac))(ISPEC_THEN (mk_var("dd_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN (ANTS_TAC)))));;
629 refine (by (VALID (((((USE_THM_THEN IS_REALINTERVAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (split_tac)))));;
630 refine (by (VALID (((BETA_TAC THEN (move ["i"]) THEN (move ["x"])) THEN (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (ARITH_RULE `i <= 1 <=> i = 0 \/ i = 1`))(new_rewrite [] [])))))));;
631 refine (by (VALID ((BETA_TAC THEN (case THEN ALL_TAC) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "df")(MATCH_MP_THEN snd_th MP_TAC))) THEN (case THEN (move ["s"])) THEN (move ["d_f"])))));;
632 refine (by (VALID (((case THEN (DISCH_THEN(new_rewrite [] []))) THEN (((USE_THEN "R_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THEN "arithH")(new_rewrite [] []))) THEN (simp_tac)) THEN ((USE_THM_THEN HAS_REAL_DERIVATIVE_ATREAL_WITHIN) apply_tac) THEN ((USE_THEN "d_f")(new_rewrite [] [])) THEN (done_tac)))));;
633 refine (by (VALID (((BETA_TAC THEN (move ["x"])) THEN ((((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "arithH")(new_rewrite [] []))) THEN (move ["ineq"]))))));;
634 refine (by (VALID (((((fun thm_tac -> (USE_THEN "df")(fun fst_th ->(USE_THEN "ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["s"])) THEN (move ["d_f"])) THEN (((USE_THEN "R_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THEN "arithH")(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "dd")(new_rewrite [] []))) THEN (done_tac)))));;
635 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> DISCH_THEN (ISPEC_THEN (`&0`) thm_tac))(ISPEC_THEN (`&1`) thm_tac))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_01)(new_rewrite [] [])) THEN (simp_tac))))));;
636 refine (by (VALID ((((USE_THM_THEN REAL_SUB_RZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ABS_1)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_POW_ONE)(new_rewrite [] []))) THEN ((USE_THM_THEN (ARITH_RULE `FACT (1 + 1) = 2`))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN real_div)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_LID)(new_rewrite [] [])))))));;
637 refine (by (VALID ((((USE_THM_THEN ONE)(new_rewrite [2] [])) THEN ((USE_THM_THEN (GEN_ALL SUM_CLAUSES_NUMSEG))(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_SING_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN ONE)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (ARITH_RULE `0 <= 1`))(new_rewrite [] [])) THEN (simp_tac)))));;
638 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN (ARITH_RULE `FACT 0 = 1 /\ FACT 1 = 1`))(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_INV_1)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])))))));;
639 refine (by (VALID (((((USE_THEN "R_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THEN "arithH")(new_rewrite [] [])))) THEN (done_tac)))));;
640 let real_taylor2_bound = end_section_proof();;
641 (start_section_proof ["f";"d_bound"](`(!t. interval_arith t (&0, &1) ==> f real_differentiable atreal t /\ 
642                         abs (derivative f t) <= d_bound) ==>
643         abs (f (&1) - f (&0)) <= d_bound`));;
644 refine (by (VALID ((BETA_TAC THEN (move ["df"])))));;
645 refine (by (VALID ((set_tac "R" (`\i. if i = 0 then f else derivative f`)))));;
646 refine (by (VALID ((((USE_THM_THEN (ARITH_RULE `0 + 1 = 1 /\ ~(1 = 0)`)) MP_TAC) THEN (move ["arithH"])))));;
647 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN REAL_TAYLOR)(ISPEC_THEN (mk_var("R",mk_type("fun",[mk_type("num",[]);mk_type("fun",[mk_type("real",[]);mk_type("real",[])])]))) thm_tac))(ISPEC_THEN (`0`) thm_tac))(ISPEC_THEN (`real_interval [&0, &1]`) thm_tac))(ISPEC_THEN (mk_var("d_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN (ANTS_TAC)))));;
648 refine (by (VALID (((((USE_THM_THEN IS_REALINTERVAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (split_tac)))));;
649 refine (by (VALID (((BETA_TAC THEN (move ["i"]) THEN (move ["x"])) THEN (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN leqn0)(new_rewrite [] [])))))));;
650 refine (by (VALID ((BETA_TAC THEN (case THEN ALL_TAC) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "df")(MATCH_MP_THEN snd_th MP_TAC))) THEN (case THEN ((move ["diff_f"]) THEN (move ["df_bound"]))) THEN (DISCH_THEN(new_rewrite [] []))))));;
651 refine (by (VALID (((((USE_THEN "R_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THEN "arithH")(new_rewrite [] []))) THEN (simp_tac)) THEN ((USE_THM_THEN HAS_REAL_DERIVATIVE_ATREAL_WITHIN) apply_tac) THEN ((USE_THM_THEN has_derivative_alt)(new_rewrite [] [])) THEN (done_tac)))));;
652 refine (by (VALID (((BETA_TAC THEN (move ["x"])) THEN ((((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "arithH")(new_rewrite [] []))) THEN (move ["ineq"]))))));;
653 refine (by (VALID (((((fun thm_tac -> (USE_THEN "df")(fun fst_th ->(USE_THEN "ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["s"])) THEN (move ["d_f"])) THEN (((USE_THEN "R_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THEN "arithH")(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
654 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> DISCH_THEN (ISPEC_THEN (`&0`) thm_tac))(ISPEC_THEN (`&1`) thm_tac))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_01)(new_rewrite [] [])) THEN (simp_tac))))));;
655 refine (by (VALID ((((USE_THM_THEN SUM_SING_NUMSEG)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN REAL_SUB_RZERO)(new_rewrite [] [])) THEN ((USE_THEN "arithH")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ABS_1)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_POW_ONE)(new_rewrite [] [])))))));;
656 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN (ARITH_RULE `FACT 1 = 1 /\ FACT 0 = 1`))(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_DIV_1)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])))))));;
657 refine (by (VALID (((((USE_THEN "R_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THEN "arithH")(new_rewrite [] [])))) THEN (done_tac)))));;
658 let real_taylor1_bound = end_section_proof();;
659 let m_taylor_error = new_definition `m_taylor_error f domain (w:real^N) error <=>
660         !x:real^N. x IN interval [domain] ==> sum (1..dimindex (:N)) (\i. w$i * sum (1..dimindex (:N))
661                 (\j. w$j * abs (partial j (partial i f) x))) <= error`;;
662 let m_taylor_partial_error = new_definition `m_taylor_partial_error f i domain (w:real^N) error <=>
663         (!x:real^N. x IN interval[domain] ==>
664                 sum (1..dimindex (:N)) (\j. w$j * abs (partial j (partial i f) x)) <= error)`;;
665 (start_section_proof ["f";"domain";"w";"p_error";"error"](`(!i. i IN 1..dimindex (:N) ==> m_taylor_partial_error f i domain w (p_error i) /\ &0 <= w$i) ==>
666         sum (1..dimindex (:N)) (\i. w$i * p_error i) <= error ==>
667         m_taylor_error f domain (w:real^N) error`));;
668 refine (by (VALID (((((USE_THM_THEN m_taylor_partial_error)(new_rewrite [] [])) THEN ((USE_THM_THEN m_taylor_error)(new_rewrite [] []))) THEN (move ["partialH"]) THEN (move ["ineq"]) THEN (move ["p"]) THEN (move ["p_in"])))));;
669 refine (by (VALID ((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
670 refine (by (VALID ((((USE_THM_THEN SUM_LE) apply_tac) THEN ((((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["i_ineq"]) THEN (simp_tac))))));;
671 refine (by (VALID (((((USE_THM_THEN REAL_LE_LMUL)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((fun thm_tac -> (USE_THEN "partialH")(fun fst_th ->(USE_THEN "i_ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])))) THEN (done_tac)))));;
672 let taylor_error_eq_sum_partial_errors = end_section_proof();;
673 let partial2 = new_definition `partial2 j i f = partial j (partial i f)`;;
674 let diff2 = new_definition `diff2 f x <=>
675         ?s. open s /\ x IN s /\ (!y. y IN s ==> (lift o f) differentiable at y /\
676                 (!i. (lift o partial i f) differentiable at y))`;;
677 let diff2c = new_definition `diff2c f x <=> diff2 f x /\
678         (!i j. (lift o partial2 j i f) continuous at x)`;;
679 (start_section_proof ["f";"x"](`diff2c f x ==> diff2 f x`));;
680 refine (by (VALID (((((USE_THM_THEN diff2c)(new_rewrite [] [])) THEN (simp_tac)) THEN (done_tac)))));;
681 let diff2c_imp_diff2 = end_section_proof();;
682 (start_section_proof ["f";"x"](`diff2 f x <=>
683         ?s. open s /\ x IN s /\ (!y. y IN s ==> diff2 f y)`));;
684 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ((split_tac) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]))))));;
685 refine (by (VALID (((exists_tac (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1454959"]);mk_type("bool",[])])))) THEN ((((USE_THEN "open_s")(new_rewrite [1] [])) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["y"]) THEN (move ["ys"])) THEN (exists_tac (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1454959"]);mk_type("bool",[])])))) THEN (done_tac)))));;
686 refine (by (VALID (((((fun thm_tac -> (USE_THEN "df")(fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["xt"])) THEN (move ["df2"])) THEN (((USE_THEN "df")MP_TAC) THEN (clear_assumption "df") THEN BETA_TAC THEN (move ["_"]))))));;
687 refine (by (VALID (((exists_tac (mk_var("t",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1454959"]);mk_type("bool",[])])))) THEN (done_tac)))));;
688 let diff2_eq_diff2_on_open = end_section_proof();;
689 (start_section_proof ["f";"x";"e";"t"](`diff2 f (x + t % e) ==>
690         f o (\t. x + t % e) real_differentiable atreal t`));;
691 refine (by (VALID ((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
692 refine (by (VALID ((((USE_THM_THEN diff_imp_real_diff) apply_tac) THEN ((simp_tac) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN diff_direction)(new_rewrite [] []))) THEN (done_tac)))));;
693 let diff2_imp_real_diff = end_section_proof();;
694 (start_section_proof ["f";"x";"e";"t"](`diff2 f (x + t % e:real^N) ==>
695         derivative (f o (\t. x + t % e)) t =
696         sum (1..dimindex (:N)) (\i. e$i * (partial i f o (\t. x + t % e)) t)`));;
697 refine (by (VALID ((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
698 refine (by (VALID (((((USE_THM_THEN derivative_unique)MP_TAC) THEN (clear_assumption "derivative_unique") THEN (DISCH_THEN apply_tac)) THEN (((USE_THM_THEN real_dir_derivative_partial)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
699 let diff2_dir_derivative = end_section_proof();;
700 (start_section_proof ["f";"i";"x";"e";"t"](`diff2 f (x + t % e:real^N) ==>
701         partial i f o (\t. x + t % e) real_differentiable atreal t`));;
702 refine (by (VALID ((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
703 refine (by (VALID (((((USE_THM_THEN diff_imp_real_diff)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN diff_direction)(new_rewrite [] []))) THEN (done_tac)))));;
704 let diff2_partial_real_diff = end_section_proof();;
705 (start_section_proof ["x";"s";"t"](`t SUBSET s ==> x IN t ==> x IN s`));;
706 refine (by (VALID ((((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN (move ["sub"]) THEN (move ["xt"])))));;
707 refine (by (VALID ((((USE_THEN "sub")MP_TAC) THEN (clear_assumption "sub") THEN (exact_tac)))));;
708 let in_trans = end_section_proof();;
709 (start_section_proof ["e";"s";"x"](`open s ==> x IN s ==>
710         ?a b. &0 IN real_interval (a, b) /\ IMAGE (\t. x + t % e) (real_interval (a, b)) SUBSET s`));;
711 refine (by (VALID ((((USE_THM_THEN OPEN_CONTAINS_BALL)(new_rewrite [] [])) THEN (move ["open_s"])))));;
712 refine (by (VALID ((((DISCH_THEN (fun snd_th -> (USE_THEN "open_s")(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC THEN (case THEN (move ["d"])) THEN (case THEN (move ["d0"])) THEN (move ["ball_s"])) THEN (((USE_THEN "open_s")MP_TAC) THEN (clear_assumption "open_s") THEN BETA_TAC THEN (move ["_"]))))));;
713 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`norm e = &0`) thm_tac))MP_TAC) THEN case THENL [ALL_TAC; (move ["n0"])]))));;
714 refine (by (VALID (((((USE_THM_THEN NORM_EQ_0)(new_rewrite [] [])) THEN (DISCH_THEN(new_rewrite [] []))) THEN ((exists_tac (`--d`)) THEN (exists_tac (mk_var("d",mk_type("real",[])))))))));;
715 refine (by (VALID (((THENL_FIRST) (split_tac) (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN (((USE_THEN "d0")MP_TAC) THEN (clear_assumption "d0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
716 refine (by (VALID ((((((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_IMAGE)(new_rewrite [] []))) THEN (move ["y"]) THEN (case THEN (move ["t"])) THEN (DISCH_THEN(new_rewrite [] [])) THEN (simp_tac)) THEN (((USE_THM_THEN (GEN_ALL VECTOR_MUL_RZERO))(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])))))));;
717 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN in_trans)(fun fst_th ->(USE_THEN "ball_s")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THM_THEN CENTRE_IN_BALL)(new_rewrite [] []))) THEN (done_tac)))));;
718 refine (by (VALID ((set_tac "y" (`((d / &2) * inv(norm e)) % e`)))));;
719 refine (by (VALID ((have_tac (move ["norm_y"]) (`norm y = d / &2`)))));;
720 refine (by (VALID ((((USE_THEN "y_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN VECTOR_MUL_ASSOC)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN NORM_MUL)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_ABS_INV)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ABS_NORM)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_LINV)(new_rewrite [] [])) THEN ((TRY done_tac))))));;
721 refine (by (VALID (((((USE_THEN "d0")MP_TAC) THEN (clear_assumption "d0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
722 refine (by (VALID ((((exists_tac (`-- (d / &2 * inv (norm e))`)) THEN (exists_tac (`d / &2 * inv (norm e)`))) THEN (split_tac)))));;
723 refine (by (VALID ((((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_NEG_LT0)(new_rewrite [] [])) THEN ((USE_THM_THEN andbb)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LT_MUL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LT_INV)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN NORM_POS_LT)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN NORM_EQ_0)(GSYM_THEN (new_rewrite [] [])))) THEN ((TRY done_tac))))));;
724 refine (by (VALID (((((USE_THEN "d0")MP_TAC) THEN (clear_assumption "d0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
725 refine (by (VALID ((((USE_THM_THEN SUBSET_TRANS) apply_tac) THEN (exists_tac (`ball (x, d)`)) THEN ((((USE_THEN "ball_s")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_IMAGE)(new_rewrite [] []))) THEN (move ["p"]) THEN (case THEN (move ["t"])) THEN (case THEN (DISCH_THEN(new_rewrite [] []))) THEN (move ["t_in"]) THEN (simp_tac))))));;
726 refine (by (VALID ((((USE_THM_THEN IN_BALL)(new_rewrite [] [])) THEN ((USE_THM_THEN dist)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_SUB_RADD)(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_NEG)(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_MUL)(new_rewrite [] []))))));;
727 refine (by (VALID (((THENL_LAST) ((((USE_THM_THEN REAL_LET_TRANS)MP_TAC) THEN (clear_assumption "REAL_LET_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`d / &2`)) THEN (split_tac)) ((((USE_THEN "d0")MP_TAC) THEN (clear_assumption "d0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
728 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN REAL_MUL_RID)(ISPEC_THEN (`d / &2`) thm_tac))(GSYM_THEN (new_rewrite [] []))) THEN ((fun thm_tac -> (USE_THM_THEN REAL_MUL_LINV)(fun fst_th ->(USE_THEN "n0")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_MUL_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_RMUL)(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_POS_LE)(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] []))))));;
729 refine (by (VALID (((((USE_THEN "t_in")MP_TAC) THEN (clear_assumption "t_in") THEN BETA_TAC) THEN ((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac)))));;
730 let open_contains_open_interval = end_section_proof();;
731 (start_section_proof ["f";"x";"e";"t"](`diff2 f (x + t % e:real^N) ==> 
732         nth_diff_strong 2 (f o (\t. x + t % e)) t`));;
733 refine (by (VALID (((((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ((USE_THM_THEN nth_diff_strong2_eq)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
734 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN open_contains_open_interval)(ISPEC_THEN (mk_var("e",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(fun fst_th ->(USE_THEN "open_s")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["a"])) THEN (case THEN (move ["b"])) THEN (case THEN (move ["in0"])) THEN (move ["sub"])))));;
735 refine (by (VALID (((exists_tac (`real_interval (a + t, b + t)`)) THEN (((USE_THM_THEN REAL_OPEN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (split_tac)))));;
736 refine (by (VALID (((((USE_THEN "in0")MP_TAC) THEN (clear_assumption "in0") THEN BETA_TAC) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
737 refine (by (VALID ((BETA_TAC THEN (move ["p"]) THEN (move ["p_int"])))));;
738 refine (by (VALID ((have_tac (move ["xp_in"]) (`x + p % e IN s`)))));;
739 refine (by (VALID (((((USE_THEN "sub")MP_TAC) THEN (clear_assumption "sub") THEN BETA_TAC) THEN ((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN (DISCH_THEN apply_tac) THEN (((USE_THM_THEN IN_IMAGE)(new_rewrite [] [])) THEN (simp_tac)) THEN (exists_tac (`p - t`))))));;
740 refine (by (VALID (((split_tac) THENL [(VECTOR_ARITH_TAC); ((((USE_THEN "p_int")MP_TAC) THEN (clear_assumption "p_int") THEN BETA_TAC) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN (arith_tac))] THEN (done_tac)))));;
741 refine (by (VALID ((((USE_THM_THEN diff2_imp_real_diff)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
742 refine (by (VALID (((USE_THM_THEN differentiable_local) apply_tac))));;
743 refine (by (VALID ((exists_tac (`\t. sum (1..dimindex(:N)) (\i. e$i * (partial i f o (\t. x + t % e)) t)`)))));;
744 refine (by (VALID ((set_tac "d" (`min (p - (a + t)) (b + t - p)`)))));;
745 refine (by (VALID (((THENL_FIRST) (have_tac (move ["d0"]) (`&0 < d`)) ((((USE_THEN "p_int")MP_TAC) THEN (clear_assumption "p_int") THEN BETA_TAC) THEN (((USE_THEN "d_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac))))));;
746 refine (by (VALID (((exists_tac (`real_interval (p - d, p + d)`)) THEN (split_tac)))));;
747 refine (by (VALID ((((USE_THM_THEN differentiable_sum_numseg)(new_rewrite [] [])) THEN (move ["i"]) THEN (move ["ineq"]) THEN (simp_tac)))));;
748 refine (by (VALID (((((USE_THM_THEN REAL_DIFFERENTIABLE_MUL_ATREAL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_DIFFERENTIABLE_CONST)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
749 refine (by (VALID (((((USE_THM_THEN diff2_partial_real_diff)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
750 refine (by (VALID (((((USE_THM_THEN REAL_OPEN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (split_tac)))));;
751 refine (by (VALID ((((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN (((USE_THEN "d0")MP_TAC) THEN (clear_assumption "d0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
752 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (move ["y_in"])) THEN (((USE_THM_THEN diff2_dir_derivative)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "df")(new_rewrite [] [])))))));;
753 refine (by (VALID (((((USE_THEN "sub")MP_TAC) THEN (clear_assumption "sub") THEN BETA_TAC) THEN ((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN (DISCH_THEN apply_tac) THEN (((USE_THM_THEN IN_IMAGE)(new_rewrite [] [])) THEN (simp_tac)) THEN (exists_tac (`y - t`))))));;
754 refine (by (VALID (((THENL_FIRST) (split_tac) ((VECTOR_ARITH_TAC) THEN (done_tac))))));;
755 refine (by (VALID (((((USE_THEN "p_int")MP_TAC) THEN (clear_assumption "p_int") THEN ((USE_THEN "d_def")MP_TAC) THEN (clear_assumption "d_def") THEN ((USE_THEN "y_in")MP_TAC) THEN (clear_assumption "y_in") THEN BETA_TAC) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
756 let diff2_dir = end_section_proof();;
757 (start_section_proof ["f";"x";"e";"t"](`diff2 f (x + t % e:real^N) ==>
758         nth_derivative 2 (f o (\t. x + t % e)) t =
759         sum (1..dimindex (:N)) (\i. sum (1..dimindex (:N)) 
760                 (\j. e$i * e$j * (partial j (partial i f) o (\t. x + t % e)) t))`));;
761 refine (by (VALID ((((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
762 refine (by (VALID ((((USE_THM_THEN nth_derivative2)(new_rewrite [] [])) THEN (((USE_THM_THEN derivative_unique)MP_TAC) THEN (clear_assumption "derivative_unique") THEN (DISCH_THEN apply_tac))))));;
763 refine (by (VALID ((((USE_THM_THEN Arc_properties.HAS_REAL_DERIVATIVE_LOCAL)MP_TAC) THEN (clear_assumption "Arc_properties.HAS_REAL_DERIVATIVE_LOCAL") THEN (DISCH_THEN apply_tac)))));;
764 refine (by (VALID (((exists_tac (`\t. sum (1..dimindex(:N)) (\i. e$i * (partial i f o (\t. x + t % e)) t)`)) THEN (split_tac)))));;
765 refine (by (VALID ((((USE_THM_THEN HAS_REAL_DERIVATIVE_SUM) apply_tac) THEN ((((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["ineq"]) THEN (simp_tac))))));;
766 refine (by (VALID (((((USE_THM_THEN SUM_LMUL)(new_rewrite [] [])) THEN ((USE_THM_THEN HAS_REAL_DERIVATIVE_LMUL_ATREAL)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
767 refine (by (VALID (((USE_THM_THEN real_dir_derivative_partial)(new_rewrite [] [])))));;
768 refine (by (VALID (((((fun thm_tac -> (USE_THEN "df")(fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["r"])) THEN (case THEN (move ["_"])) THEN (case THEN (move ["xr"])) THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
769 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN open_contains_open_interval)(ISPEC_THEN (mk_var("e",mk_type("cart",[mk_type("real",[]);mk_vartype "N"]))) thm_tac))(fun fst_th ->(USE_THEN "open_s")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["a"])) THEN (case THEN (move ["b"])) THEN (case THEN (move ["in0"])) THEN (move ["sub"])))));;
770 refine (by (VALID (((exists_tac (`real_interval (a + t, b + t)`)) THEN (((USE_THM_THEN REAL_OPEN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (split_tac)))));;
771 refine (by (VALID (((((USE_THEN "in0")MP_TAC) THEN (clear_assumption "in0") THEN BETA_TAC) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
772 refine (by (VALID (((BETA_TAC THEN (move ["p"]) THEN (move ["p_in"])) THEN (((USE_THM_THEN diff2_dir_derivative)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "df")(new_rewrite [] [])))))));;
773 refine (by (VALID (((((USE_THEN "sub")MP_TAC) THEN (clear_assumption "sub") THEN BETA_TAC) THEN ((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN (DISCH_THEN apply_tac) THEN (((USE_THM_THEN IN_IMAGE)(new_rewrite [] [])) THEN (simp_tac)) THEN (exists_tac (`p - t`))))));;
774 refine (by (VALID (((THENL_FIRST) (split_tac) ((VECTOR_ARITH_TAC) THEN (done_tac))))));;
775 refine (by (VALID (((((USE_THEN "p_in")MP_TAC) THEN (clear_assumption "p_in") THEN BETA_TAC) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
776 let diff2_dir_derivative2 = end_section_proof();;
777 (start_section_proof ["f";"i";"x";"e";"t"](`diff2 f (x + t % e:real^N) ==>
778         (partial i f o (\t. x + t % e) has_real_derivative 
779         sum (1..dimindex (:N)) (\j. e$j * (partial j (partial i f) o (\t. x + t % e)) t)) (atreal t)`));;
780 refine (by (VALID ((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
781 refine (by (VALID (((((USE_THM_THEN real_dir_derivative_partial)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
782 let diff2_has_derivative_partial = end_section_proof();;
783 (start_section_proof ["f";"i";"x";"e";"t"](`diff2 f (x + t % e:real^N) ==>
784         derivative (partial i f o (\t. x + t % e)) t = 
785                 sum (1..dimindex (:N)) (\j. e$j * (partial j (partial i f) o (\t. x + t % e)) t)`));;
786 refine (by (VALID (((BETA_TAC THEN (move ["df"])) THEN (((USE_THM_THEN derivative_unique)MP_TAC) THEN (clear_assumption "derivative_unique") THEN (DISCH_THEN apply_tac)) THEN (((USE_THM_THEN diff2_has_derivative_partial)MP_TAC) THEN (clear_assumption "diff2_has_derivative_partial") THEN (exact_tac)) THEN (done_tac)))));;
787 let diff2_derivative_partial = end_section_proof();;
788 (start_section_proof ["f";"i";"x";"e";"t"](`diff2 f (x + t % e:real^N) ==>
789         partial i f o (\t. x + t % e) real_differentiable atreal t`));;
790 refine (by (VALID ((BETA_TAC THEN (move ["df2"])))));;
791 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN diff2_has_derivative_partial)(fun fst_th ->(USE_THEN "df2")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN (set_tac "s" (`sum _1 _2`))))));;
792 refine (by (VALID (((((USE_THM_THEN real_differentiable)(new_rewrite [] [])) THEN (move ["df"])) THEN (exists_tac (mk_var("s",mk_type("real",[])))) THEN (done_tac)))));;
793 let diff2_real_diff_partial = end_section_proof();;
794 (start_section_proof ["i";"c"](`partial i (\x:real^N. c) = (\x. &0)`));;
795 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN partial)(new_rewrite [] []))) THEN (move ["x"]) THEN (simp_tac)))));;
796 refine (by (VALID ((((THENL_ROT 1)) (have_tac (DISCH_THEN(new_rewrite [] [])) (`(\x. c) o (\t. x + t % basis i) = (\x. c)`))))));;
797 refine (by (VALID ((((USE_THM_THEN derivative_const)(new_rewrite [] [])) THEN (done_tac)))));;
798 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
799 let partial_const = end_section_proof();;
800 (start_section_proof ["i";"f"](`~(i IN 1..dimindex (:N)) ==> partial i f = (\x:real^N. &0)`));;
801 refine (by (VALID (((BETA_TAC THEN (move ["ih"])) THEN (((USE_THM_THEN FUN_EQ_THM)(new_rewrite [] [])) THEN (move ["x"])) THEN ((USE_THM_THEN partial_eq0)(new_rewrite [] [])) THEN (done_tac)))));;
802 let partial_eq0_alt = end_section_proof();;
803 (start_section_proof [](`!f f' a. (!x. abs x <= abs a ==> (f has_real_derivative f' x) (atreal x)) ==>
804         (?t. abs t <= abs a /\ f a - f (&0) = f' t * a)`));;
805 refine (by (VALID ((BETA_TAC THEN (move ["f"]) THEN (move ["f'"]) THEN (move ["a"]) THEN (move ["h"])))));;
806 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`&0 <= a`) thm_tac))MP_TAC) THEN case THEN (move ["a_ineq"])))));;
807 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN REAL_MVT_VERY_SIMPLE)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (mk_var("f'",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`&0`) thm_tac))(ISPEC_THEN (mk_var("a",mk_type("real",[]))) thm_tac)) MP_TAC) THEN ALL_TAC))));;
808 refine (by (VALID (((((USE_THEN "a_ineq")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])))) THEN (ANTS_TAC)))));;
809 refine (by (VALID ((BETA_TAC THEN (move ["x"]) THEN (move ["x_ineq"])))));;
810 refine (by (VALID (((((USE_THM_THEN HAS_REAL_DERIVATIVE_ATREAL_WITHIN)(new_rewrite [] [])) THEN ((USE_THEN "h")(new_rewrite [] []))) THEN (((USE_THEN "x_ineq")MP_TAC) THEN (clear_assumption "x_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
811 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["t_ineq"])) THEN (move ["eq"])))));;
812 refine (by (VALID (((exists_tac (mk_var("t",mk_type("real",[])))) THEN ((USE_THEN "eq")(new_rewrite [] [])) THEN (((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
813 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN REAL_MVT_VERY_SIMPLE)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (mk_var("f'",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (mk_var("a",mk_type("real",[]))) thm_tac))(ISPEC_THEN (`&0`) thm_tac)) MP_TAC) THEN ALL_TAC))));;
814 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN (ANTS_TAC)))));;
815 refine (by (VALID (((THENL_FIRST) (split_tac) ((((USE_THEN "a_ineq")MP_TAC) THEN (clear_assumption "a_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
816 refine (by (VALID (((BETA_TAC THEN (move ["x"]) THEN (move ["x_ineq"])) THEN (((USE_THM_THEN HAS_REAL_DERIVATIVE_ATREAL_WITHIN)(new_rewrite [] [])) THEN ((USE_THEN "h")(new_rewrite [] [])))))));;
817 refine (by (VALID (((((USE_THEN "x_ineq")MP_TAC) THEN (clear_assumption "x_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
818 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["t_ineq"])) THEN (move ["eq"])))));;
819 refine (by (VALID (((exists_tac (mk_var("t",mk_type("real",[])))) THEN (((USE_THM_THEN REAL_NEG_SUB)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "eq")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_NEG_RMUL)(new_rewrite [] []))) THEN (((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
820 let real_mvt0 = end_section_proof();;
821 (start_section_proof ["f";"x";"i";"j"](`diff2c f x ==> partial2 i j f x = partial2 j i f (x:real^N)`));;
822 refine (by (VALID (((((USE_THM_THEN diff2c)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN partial2)(new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN ((move ["d2f"]) THEN (move ["pc"])))))));;
823 refine (by (VALID (((THENL_ROT (-1)) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`i IN 1..dimindex (:N)`) thm_tac))MP_TAC) THEN case THEN (move ["ih"]))))));;
824 refine (by (VALID (((repeat_tactic 1 9 (((fun thm_tac -> (USE_THM_THEN partial_eq0_alt)(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN partial_const)(new_rewrite [] []))) THEN (done_tac)))));;
825 refine (by (VALID (((THENL_ROT (-1)) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`j IN 1..dimindex (:N)`) thm_tac))MP_TAC) THEN case THEN (move ["jh"]))))));;
826 refine (by (VALID (((repeat_tactic 1 9 (((fun thm_tac -> (USE_THM_THEN partial_eq0_alt)(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN partial_const)(new_rewrite [] []))) THEN (done_tac)))));;
827 refine (by (VALID (((((USE_THEN "jh")MP_TAC) THEN (clear_assumption "jh") THEN ((USE_THEN "ih")MP_TAC) THEN (clear_assumption "ih") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN IN_NUMSEG)(new_rewrite [] []))) THEN (move ["ih"]) THEN (move ["jh"]))))));;
828 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["d2f"]))))));;
829 refine (by (VALID ((set_tac "F1" (`\h k. f ((x + k % basis j) + h % basis i) - f (x + k % basis j)`)))));;
830 refine (by (VALID ((set_tac "F2" (`\k h. f ((x + h % basis i) + k % basis j) - f (x + h % basis i)`)))));;
831 refine (by (VALID ((set_tac "G" (`\h k. F1 h k - F1 h (&0)`)))));;
832 refine (by (VALID (((THENL_FIRST) (have_tac (move ["v_eq"]) (`!h k. (x + k % basis j) + h % basis i = (x + h % basis i) + k % basis j`)) ((VECTOR_ARITH_TAC) THEN (done_tac))))));;
833 refine (by (VALID ((have_tac (move ["G_eq"]) (`G = \h k. F2 k h - F2 k (&0)`)))));;
834 refine (by (VALID ((repeat_tactic 2 0 (((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] [])))) THEN (move ["h"]) THEN (move ["k"])))));;
835 refine (by (VALID (((((USE_THEN "G_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "F2_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "F1_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] []))) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THEN "v_eq")(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
836 refine (by (VALID ((have_tac (ALL_TAC THEN (case THEN ((move ["r"]) THEN (case THEN ((move ["r0"]) THEN (move ["rs"])))))) (`?r. &0 < r /\ (!h k. abs h <= r /\ abs k <= r ==> (x + h % basis i) + k % basis j IN s)`)))));;
837 refine (by (VALID (((((USE_THEN "open_s")MP_TAC) THEN (clear_assumption "open_s") THEN BETA_TAC) THEN ((((USE_THM_THEN OPEN_CONTAINS_BALL)(new_rewrite [] [])) THEN ((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_BALL)(new_rewrite [] [])) THEN ((USE_THM_THEN dist)(new_rewrite [] []))) THEN ((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (case THEN (move ["e"])) THEN (case THEN ((move ["e0"]) THEN (move ["de"]))))))));;
838 refine (by (VALID (((THENL_FIRST) ((exists_tac (`e / &3`)) THEN (split_tac)) ((((USE_THEN "e0")MP_TAC) THEN (clear_assumption "e0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
839 refine (by (VALID ((BETA_TAC THEN (move ["h"]) THEN (move ["k"]) THEN (move ["ineq"])))));;
840 refine (by (VALID ((((USE_THEN "de")(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_ASSOC))(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN VECTOR_SUB_RADD)(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_NEG)(new_rewrite [] []))))));;
841 refine (by (VALID (((THENL_LAST) ((((USE_THM_THEN REAL_LET_TRANS)MP_TAC) THEN (clear_assumption "REAL_LET_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`e / &3 + e / &3`)) THEN (split_tac)) ((((USE_THEN "e0")MP_TAC) THEN (clear_assumption "e0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
842 refine (by (VALID (((THENL_LAST) ((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`abs h + abs k`)) THEN (split_tac)) ((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
843 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN NORM_TRIANGLE)(ISPEC_THEN (`h % basis i:real^N`) thm_tac))(ISPEC_THEN (`k % basis j:real^N`) thm_tac)) MP_TAC) THEN ALL_TAC))));;
844 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN NORM_MUL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN NORM_BASIS)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])))) THEN (done_tac)))));;
845 refine (by (VALID ((have_tac (move ["in_s"]) (`(!h. abs h <= r ==> x + h % basis i IN s) /\ (!k. abs k <= r ==> x + k % basis j IN s)`)))));;
846 refine (by (VALID (((split_tac) THENL [((move ["h"]) THEN (move ["h_ineq"])); ((move ["k"]) THEN (move ["k_ineq"]))]))));;
847 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "rs")(ISPEC_THEN (mk_var("h",mk_type("real",[]))) thm_tac))(ISPEC_THEN (`&0`) thm_tac))MP_TAC) THEN BETA_TAC) THEN ((((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THEN "h_ineq")(new_rewrite [] []))) THEN (DISCH_THEN(new_rewrite [] []))) THEN (((USE_THEN "r0")MP_TAC) THEN (clear_assumption "r0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
848 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "rs")(ISPEC_THEN (`&0`) thm_tac))(ISPEC_THEN (mk_var("k",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN ((((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THEN "k_ineq")(new_rewrite [] []))) THEN (DISCH_THEN(new_rewrite [] []))) THEN (((USE_THEN "r0")MP_TAC) THEN (clear_assumption "r0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
849 refine (by (VALID ((have_tac (move ["F1h"]) (`!h. F1 h = (\k. (f o (\k. (x + h % basis i) + k % basis j)) k - (f o (\k. x + k % basis j)) k)`)))));;
850 refine (by (VALID (((((USE_THEN "F1_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "v_eq")(new_rewrite [] []))) THEN (done_tac)))));;
851 refine (by (VALID ((have_tac (move ["dF1"]) (`!h. abs h <= r ==> !k. abs k <= r ==> (F1 h) real_differentiable atreal k`)))));;
852 refine (by (VALID ((BETA_TAC THEN (move ["h"]) THEN (move ["h_ineq"]) THEN (move ["k"]) THEN (move ["k_ineq"])))));;
853 refine (by (VALID (((((USE_THEN "F1h")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_DIFFERENTIABLE_SUB)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
854 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN diff2_imp_real_diff)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "rs")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "in_s")(new_rewrite [] [])))) THEN (done_tac)))));;
855 refine (by (VALID ((have_tac (move ["F1_der"]) (`!h k. abs h <= r /\ abs k <= r ==>
856         derivative (F1 h) k = partial j f ((x + h % basis i) + k % basis j) - partial j f (x + k % basis j)`)))));;
857 refine (by (VALID (((BETA_TAC THEN (move ["h"]) THEN (move ["k"]) THEN (move ["ineq"])) THEN (((USE_THEN "F1h")(new_rewrite [] [])) THEN ((USE_THM_THEN derivative_sub)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (repeat_tactic 0 10 (((USE_THM_THEN diff2_imp_real_diff)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "rs")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "in_s")(new_rewrite [] []))) THEN ((TRY done_tac)))))));;
858 refine (by (VALID (((((USE_THM_THEN derivative_translation)(new_rewrite [] [(`derivative (f o (\k. x + k % basis j)) k`)])) THEN repeat_tactic 0 1 (((USE_THM_THEN derivative_translation)(new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((USE_THM_THEN diff2_imp_real_diff)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "rs")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "in_s")(new_rewrite [] []))) THEN ((TRY done_tac)))))));;
859 refine (by (VALID ((have_tac (move ["eq"]) (`!y e. (f o (\k. y + k % e)) o (\t. k + t) = f o (\t. (y + k % e) + t % e)`)))));;
860 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_RDISTRIB))(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_ASSOC))(new_rewrite [] []))) THEN (done_tac)))));;
861 refine (by (VALID (((repeat_tactic 1 9 (((USE_THEN "eq")(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN partial)(GSYM_THEN (new_rewrite [] []))))) THEN (done_tac)))));;
862 refine (by (VALID ((have_tac (move ["Gh"]) (`!h k. abs h <= r /\ abs k <= r ==> 
863                 (?t1. G h k = k * derivative (F1 h) t1 /\ abs t1 <= abs k)`)))));;
864 refine (by (VALID (((BETA_TAC THEN (move ["h"]) THEN (move ["k"]) THEN (move ["ineq"])) THEN (((USE_THEN "G_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac))))));;
865 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_mvt0)(ISPEC_THEN (`F1 h`) thm_tac))(ISPEC_THEN (`derivative (F1 h)`) thm_tac))(ISPEC_THEN (mk_var("k",mk_type("real",[]))) thm_tac)) MP_TAC) THEN ALL_TAC))));;
866 refine (by (VALID ((ANTS_TAC))));;
867 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["t_ineq"])) THEN (((USE_THM_THEN has_derivative_alt)(new_rewrite [] [])) THEN ((USE_THEN "dF1")(new_rewrite [] [])))))));;
868 refine (by (VALID (((((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN ((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
869 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["t1"])) THEN (case THEN (move ["t1_ineq"])) THEN (move ["eq"])))));;
870 refine (by (VALID (((exists_tac (mk_var("t1",mk_type("real",[])))) THEN ((USE_THEN "eq")(new_rewrite [] [])) THEN (((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t1_ineq")MP_TAC) THEN (clear_assumption "t1_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
871 refine (by (VALID ((have_tac (move ["Ghk"]) (`!h k. abs h <= r /\ abs k <= r ==>
872         (?t1 t2. G h k = h * k * partial i (partial j f) (x + t1 % basis j + t2 % basis i) 
873                 /\ abs t1 <= abs k /\ abs t2 <= abs h)`)))));;
874 refine (by (VALID ((BETA_TAC THEN (move ["h"]) THEN (move ["k"]) THEN (move ["ineq"])))));;
875 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "Gh")(ISPEC_THEN (mk_var("h",mk_type("real",[]))) thm_tac))(ISPEC_THEN (mk_var("k",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN ((repeat_tactic 1 9 (((USE_THEN "ineq")(new_rewrite [] []))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["t1"])) THEN (case THEN ((move ["eq"]) THEN (move ["t1k"]))))))));;
876 refine (by (VALID (((((USE_THEN "eq")MP_TAC) THEN (clear_assumption "eq") THEN BETA_TAC) THEN ((USE_THEN "F1_der")(new_rewrite [] [])) THENL [((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t1k")MP_TAC) THEN (clear_assumption "t1k") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)); (BETA_TAC THEN (move ["eq"]))]))));;
877 refine (by (VALID ((set_tac "g" (`partial j f o (\h. (x + t1 % basis j) + h % basis i)`)))));;
878 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_mvt0)(ISPEC_THEN (mk_var("g",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`derivative g`) thm_tac))(ISPEC_THEN (mk_var("h",mk_type("real",[]))) thm_tac)) MP_TAC) THEN ALL_TAC))));;
879 refine (by (VALID ((ANTS_TAC))));;
880 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["t_ineq"])) THEN ((USE_THM_THEN has_derivative_alt)(new_rewrite [] []))))));;
881 refine (by (VALID ((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN diff2_partial_real_diff)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((USE_THEN "v_eq")(new_rewrite [] [])) THEN ((USE_THEN "rs")(new_rewrite [] []))))));;
882 refine (by (VALID (((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN ((USE_THEN "t1k")MP_TAC) THEN (clear_assumption "t1k") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
883 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["t2"])) THEN (case THEN (move ["t2_ineq"])) THEN (move ["g_eq"])))));;
884 refine (by (VALID (((THENL_LAST) (((exists_tac (mk_var("t1",mk_type("real",[])))) THEN (exists_tac (mk_var("t2",mk_type("real",[]))))) THEN ((USE_THEN "eq")(new_rewrite [] [])) THEN (split_tac)) ((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t2_ineq")MP_TAC) THEN (clear_assumption "t2_ineq") THEN ((USE_THEN "t1k")MP_TAC) THEN (clear_assumption "t1k") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
885 refine (by (VALID ((set_tac "p" (`_1 - _2`)))));;
886 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`p = g h - g (&0)`)))));;
887 refine (by (VALID (((((USE_THEN "p_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THEN "v_eq")(new_rewrite [] []))) THEN (done_tac)))));;
888 refine (by (VALID ((((USE_THEN "g_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN (REAL_ARITH `!a. k * a * h = h * k * a`))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_ASSOC)(new_rewrite [] [])))))));;
889 refine (by (VALID (((((USE_THM_THEN REAL_EQ_MUL_LCANCEL)(new_rewrite [] [])) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] [])))) THEN (DISJ2_TAC)))));;
890 refine (by (VALID (((USE_THM_THEN derivative_translation)(new_rewrite [] [])))));;
891 refine (by (VALID (((((USE_THM_THEN diff2_partial_real_diff)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((USE_THEN "v_eq")(new_rewrite [] [])) THEN ((USE_THEN "rs")(new_rewrite [] []))) THEN (((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t2_ineq")MP_TAC) THEN (clear_assumption "t2_ineq") THEN ((USE_THEN "t1k")MP_TAC) THEN (clear_assumption "t1k") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
892 refine (by (VALID ((((USE_THM_THEN partial)(new_rewrite [] [])) THEN (AP_THM_TAC) THEN (AP_TERM_TAC)))));;
893 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_RDISTRIB))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL VECTOR_ADD_ASSOC))(GSYM_THEN (new_rewrite [] []))))) THEN (done_tac)))));;
894 refine (by (VALID ((((USE_THEN "F1_def")MP_TAC) THEN (clear_assumption "F1_def") THEN ((USE_THEN "G_def")MP_TAC) THEN (clear_assumption "G_def") THEN ((USE_THEN "F1h")MP_TAC) THEN (clear_assumption "F1h") THEN ((USE_THEN "dF1")MP_TAC) THEN (clear_assumption "dF1") THEN ((USE_THEN "F1_der")MP_TAC) THEN (clear_assumption "F1_der") THEN ((USE_THEN "Gh")MP_TAC) THEN (clear_assumption "Gh") THEN BETA_TAC THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"])))));;
895 refine (by (VALID ((have_tac (move ["F2h"]) (`!k. F2 k = (\h. (f o (\h. (x + k % basis j) + h % basis i)) h - (f o (\h. x + h % basis i)) h)`)))));;
896 refine (by (VALID (((((USE_THEN "F2_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "v_eq")(new_rewrite [] []))) THEN (done_tac)))));;
897 refine (by (VALID ((have_tac (move ["dF2"]) (`!k. abs k <= r ==> !h. abs h <= r ==> (F2 k) real_differentiable atreal h`)))));;
898 refine (by (VALID ((BETA_TAC THEN (move ["k"]) THEN (move ["k_ineq"]) THEN (move ["h"]) THEN (move ["h_ineq"])))));;
899 refine (by (VALID (((((USE_THEN "F2h")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_DIFFERENTIABLE_SUB)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
900 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN diff2_imp_real_diff)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "v_eq")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "rs")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "in_s")(new_rewrite [] [])))) THEN (done_tac)))));;
901 refine (by (VALID ((have_tac (move ["F2_der"]) (`!h k. abs h <= r /\ abs k <= r ==>
902         derivative (F2 k) h = partial i f ((x + k % basis j) + h % basis i) - partial i f (x + h % basis i)`)))));;
903 refine (by (VALID (((BETA_TAC THEN (move ["h"]) THEN (move ["k"]) THEN (move ["ineq"])) THEN (((USE_THEN "F2h")(new_rewrite [] [])) THEN ((USE_THM_THEN derivative_sub)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (repeat_tactic 0 10 (((USE_THM_THEN diff2_imp_real_diff)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "v_eq")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "rs")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "in_s")(new_rewrite [] []))) THEN ((TRY done_tac)))))));;
904 refine (by (VALID (((((USE_THEN "v_eq")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN derivative_translation)(new_rewrite [] [(`derivative (f o (\h. x + h % basis i)) h`)])) THEN repeat_tactic 0 1 (((USE_THM_THEN derivative_translation)(new_rewrite [] [])))) THEN (repeat_tactic 0 10 (((USE_THM_THEN diff2_imp_real_diff)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "v_eq")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "rs")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "in_s")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THEN "v_eq")(GSYM_THEN (new_rewrite [] []))))))));;
905 refine (by (VALID ((have_tac (move ["eq"]) (`!y e. (f o (\h. y + h % e)) o (\t. h + t) = f o (\t. (y + h % e) + t % e)`)))));;
906 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_RDISTRIB))(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_ASSOC))(new_rewrite [] []))) THEN (done_tac)))));;
907 refine (by (VALID (((repeat_tactic 1 9 (((USE_THEN "eq")(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN partial)(GSYM_THEN (new_rewrite [] []))))) THEN (done_tac)))));;
908 refine (by (VALID ((have_tac (move ["Gk"]) (`!h k. abs h <= r /\ abs k <= r ==> 
909                 (?t3. G h k = h * derivative (F2 k) t3 /\ abs t3 <= abs h)`)))));;
910 refine (by (VALID (((BETA_TAC THEN (move ["h"]) THEN (move ["k"]) THEN (move ["ineq"])) THEN (((USE_THEN "G_eq")(new_rewrite [] [])) THEN (simp_tac))))));;
911 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_mvt0)(ISPEC_THEN (`F2 k`) thm_tac))(ISPEC_THEN (`derivative (F2 k)`) thm_tac))(ISPEC_THEN (mk_var("h",mk_type("real",[]))) thm_tac)) MP_TAC) THEN ALL_TAC))));;
912 refine (by (VALID ((ANTS_TAC))));;
913 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["t_ineq"])) THEN (((USE_THM_THEN has_derivative_alt)(new_rewrite [] [])) THEN ((USE_THEN "dF2")(new_rewrite [] [])))))));;
914 refine (by (VALID (((((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN ((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
915 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["t3"])) THEN (case THEN (move ["t3_ineq"])) THEN (move ["eq"])))));;
916 refine (by (VALID (((exists_tac (mk_var("t3",mk_type("real",[])))) THEN ((USE_THEN "eq")(new_rewrite [] [])) THEN (((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t3_ineq")MP_TAC) THEN (clear_assumption "t3_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
917 refine (by (VALID ((have_tac (move ["Gkh"]) (`!h k. abs h <= r /\ abs k <= r ==>
918         (?t3 t4. G h k = h * k * partial j (partial i f) (x + t4 % basis j + t3 % basis i) 
919                 /\ abs t3 <= abs h /\ abs t4 <= abs k)`)))));;
920 refine (by (VALID ((BETA_TAC THEN (move ["h"]) THEN (move ["k"]) THEN (move ["ineq"])))));;
921 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "Gk")(ISPEC_THEN (mk_var("h",mk_type("real",[]))) thm_tac))(ISPEC_THEN (mk_var("k",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN ((repeat_tactic 1 9 (((USE_THEN "ineq")(new_rewrite [] []))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["t3"])) THEN (case THEN ((move ["eq"]) THEN (move ["t3h"]))))))));;
922 refine (by (VALID (((((USE_THEN "eq")MP_TAC) THEN (clear_assumption "eq") THEN BETA_TAC) THEN ((USE_THEN "F2_der")(new_rewrite [] [])) THENL [((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t3h")MP_TAC) THEN (clear_assumption "t3h") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)); (BETA_TAC THEN (move ["eq"]))]))));;
923 refine (by (VALID ((set_tac "g" (`partial i f o (\k. (x + t3 % basis i) + k % basis j)`)))));;
924 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_mvt0)(ISPEC_THEN (mk_var("g",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`derivative g`) thm_tac))(ISPEC_THEN (mk_var("k",mk_type("real",[]))) thm_tac)) MP_TAC) THEN ALL_TAC))));;
925 refine (by (VALID ((ANTS_TAC))));;
926 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["t_ineq"])) THEN ((USE_THM_THEN has_derivative_alt)(new_rewrite [] []))))));;
927 refine (by (VALID ((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN diff2_partial_real_diff)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((USE_THEN "rs")(new_rewrite [] []))))));;
928 refine (by (VALID (((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN ((USE_THEN "t3h")MP_TAC) THEN (clear_assumption "t3h") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
929 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["t4"])) THEN (case THEN (move ["t4_ineq"])) THEN (move ["g_eq"])))));;
930 refine (by (VALID (((THENL_LAST) (((exists_tac (mk_var("t3",mk_type("real",[])))) THEN (exists_tac (mk_var("t4",mk_type("real",[]))))) THEN ((USE_THEN "eq")(new_rewrite [] [])) THEN (split_tac)) ((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t4_ineq")MP_TAC) THEN (clear_assumption "t4_ineq") THEN ((USE_THEN "t3h")MP_TAC) THEN (clear_assumption "t3h") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
931 refine (by (VALID ((set_tac "p" (`_1 - _2`)))));;
932 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`p = g k - g (&0)`)))));;
933 refine (by (VALID (((((USE_THEN "p_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THEN "v_eq")(new_rewrite [] []))) THEN (done_tac)))));;
934 refine (by (VALID ((((USE_THEN "g_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN (REAL_ARITH `!a. h * a * k = h * k * a`))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_ASSOC)(new_rewrite [] [])))))));;
935 refine (by (VALID (((((USE_THM_THEN REAL_EQ_MUL_LCANCEL)(new_rewrite [] [])) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] [])))) THEN (DISJ2_TAC)))));;
936 refine (by (VALID (((USE_THM_THEN derivative_translation)(new_rewrite [] [])))));;
937 refine (by (VALID (((((USE_THM_THEN diff2_partial_real_diff)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((USE_THEN "rs")(new_rewrite [] []))) THEN (((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THEN "t4_ineq")MP_TAC) THEN (clear_assumption "t4_ineq") THEN ((USE_THEN "t3h")MP_TAC) THEN (clear_assumption "t3h") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
938 refine (by (VALID ((((USE_THM_THEN partial)(new_rewrite [] [])) THEN (AP_THM_TAC) THEN (AP_TERM_TAC)))));;
939 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_RDISTRIB))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL VECTOR_ADD_ASSOC))(GSYM_THEN (new_rewrite [] []))))) THEN (move ["y"])))));;
940 refine (by (VALID (((AP_TERM_TAC) THEN (VECTOR_ARITH_TAC) THEN (done_tac)))));;
941 refine (by (VALID ((((USE_THEN "F2_def")MP_TAC) THEN (clear_assumption "F2_def") THEN ((USE_THEN "G_eq")MP_TAC) THEN (clear_assumption "G_eq") THEN ((USE_THEN "F2h")MP_TAC) THEN (clear_assumption "F2h") THEN ((USE_THEN "dF2")MP_TAC) THEN (clear_assumption "dF2") THEN ((USE_THEN "F2_der")MP_TAC) THEN (clear_assumption "F2_der") THEN ((USE_THEN "Gk")MP_TAC) THEN (clear_assumption "Gk") THEN BETA_TAC THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"])))));;
942 refine (by (VALID ((have_tac (move ["lim0"]) (`(vec 0:real^2) limit_point_of {y | &0 < y$1 /\ &0 < y$2}`)))));;
943 refine (by (VALID (((((USE_THM_THEN limit_point_of)(new_rewrite [] [])) THEN ((USE_THM_THEN OPEN_CONTAINS_BALL)(new_rewrite [] [])) THEN ((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_BALL)(new_rewrite [] [])) THEN ((USE_THM_THEN dist)(new_rewrite [] []))) THEN (move ["t"]) THEN (case THEN (move ["v0t"]))))));;
944 refine (by (VALID ((((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "v0t")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["e"])) THEN (case THEN (move ["e0"])) THEN (move ["in_t"])))));;
945 refine (by (VALID ((set_tac "y" (`e / &2 % (vec 1:real^2)`)))));;
946 refine (by (VALID (((THENL_FIRST) (have_tac (move ["yc"]) (`!i. y$i = e / (&2)`)) ((((USE_THEN "y_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN VEC_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] []))) THEN (done_tac))))));;
947 refine (by (VALID (((THENL_FIRST) (have_tac (move ["ineq"]) (`&0 < e / (&2)`)) ((((USE_THM_THEN REAL_LT_DIV)(new_rewrite [] [])) THEN ((USE_THEN "e0")(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac))))));;
948 refine (by (VALID ((have_tac (move ["inf_y"]) (`infnorm y = e / &2`)))));;
949 refine (by (VALID (((((USE_THM_THEN (GEN_ALL INFNORM_2))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THEN "yc")(new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL (CONJUNCT2 REAL_MAX_ACI)))(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ABS_REFL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_LT)(new_rewrite [] [])) THEN ((USE_THEN "ineq")(new_rewrite [] []))) THEN (done_tac)))));;
950 refine (by (VALID (((THENL_FIRST) ((exists_tac (mk_var("y",mk_type("cart",[mk_type("real",[]);mk_type("2",[])])))) THEN (split_tac)) ((((USE_THM_THEN INFNORM_EQ_0)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "inf_y")(new_rewrite [] []))) THEN (((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
951 refine (by (VALID (((THENL_FIRST) (split_tac) ((((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] [])) THEN (simp_tac)) THEN (exists_tac (mk_var("y",mk_type("cart",[mk_type("real",[]);mk_type("2",[])])))) THEN (repeat_tactic 1 9 (((USE_THEN "yc")(new_rewrite [] []))) THEN ((USE_THEN "ineq")(new_rewrite [] []))) THEN (done_tac))))));;
952 refine (by (VALID ((((USE_THEN "in_t")(new_rewrite [] [])) THEN (((USE_THM_THEN REAL_LET_TRANS)MP_TAC) THEN (clear_assumption "REAL_LET_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`e * inv(&2) * sqrt(&2)`)) THEN (split_tac)))));;
953 refine (by (VALID (((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`infnorm y * sqrt (&2)`)) THEN (split_tac)))));;
954 refine (by (VALID (((((USE_THM_THEN (GEN_ALL REAL_MUL_AC))(new_rewrite [] [])) THEN ((USE_THM_THEN NORM_SUB)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_SUB_RZERO))(new_rewrite [] [])) THEN ((USE_THM_THEN DIMINDEX_2)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN NORM_LE_INFNORM)(new_rewrite [] []))) THEN (done_tac)))));;
955 refine (by (VALID (((((USE_THEN "inf_y")(new_rewrite [] [])) THEN ((USE_THM_THEN real_div)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_ASSOC)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN (done_tac)))));;
956 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN REAL_MUL_RID)(ISPEC_THEN (mk_var("e",mk_type("real",[]))) thm_tac))(GSYM_THEN (new_rewrite [2] []))) THEN ((USE_THM_THEN REAL_LT_LMUL)(new_rewrite [] [])) THEN ((USE_THEN "e0")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
957 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN REAL_MUL_LINV)(ISPEC_THEN (`&2`) thm_tac))(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_LT_LMUL)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_LT_INV)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN ((TRY) (arith_tac))))));;
958 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [2] [])) (`&2 = sqrt (&2 * &2)`)) ((((USE_THM_THEN REAL_POW_2)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN POW_2_SQRT_ABS)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac))))));;
959 refine (by (VALID ((((USE_THM_THEN SQRT_MONO_LT)(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac)))));;
960 refine (by (VALID ((have_tac (move ["lim_ji"]) (`((\y:real^2. lift (G (y$1) (y$2) / (y$1 * y$2))) --> lift (partial j (partial i f) x)) 
961                 (at (vec 0) within {y | &0 < y$1 /\ &0 < y$2})`)))));;
962 refine (by (VALID ((((USE_THM_THEN LIM_WITHIN)(new_rewrite [] [])) THEN (move ["e"]) THEN (move ["e_gt0"])))));;
963 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "pc")(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN ((((USE_THM_THEN (GEN_ALL continuous_at))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN dist)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] [])))) THEN ((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "e_gt0")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (case THEN (move ["d"])) THEN (case THEN (move ["d0"])) THEN (move ["e_ineq"]))))));;
964 refine (by (VALID (((THENL_FIRST) ((exists_tac (`min r (d / &2)`)) THEN ((USE_THM_THEN REAL_LT_MIN)(new_rewrite [] [])) THEN (split_tac)) ((((USE_THEN "d0")MP_TAC) THEN (clear_assumption "d0") THEN ((USE_THEN "r0")MP_TAC) THEN (clear_assumption "r0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
965 refine (by (VALID ((((simp_tac) THEN ((USE_THM_THEN (GEN_ALL VECTOR_SUB_RZERO))(new_rewrite [] []))) THEN (move ["y"]) THEN (move ["ineq"])))));;
966 refine (by (VALID ((have_tac (move ["y0"]) (`&0 < abs (y$1) /\ &0 < abs (y$2)`)))));;
967 refine (by (VALID (((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN ((((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] [])) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["z"])) THEN (case THEN (move ["z_ineq"])) THEN (DISCH_THEN(new_rewrite [] [])) THEN (move ["_"]))))));;
968 refine (by (VALID (((((USE_THEN "z_ineq")MP_TAC) THEN (clear_assumption "z_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
969 refine (by (VALID ((have_tac (move ["yr"]) (`abs (y$1) <= r /\ abs (y$2) <= r /\ abs (y$1) < d / &2 /\ abs (y$2) < d / &2`)))));;
970 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac ALL_TAC (`infnorm y < min r (d / &2)`))) (((USE_THM_THEN (GEN_ALL INFNORM_2))(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac))))));;
971 refine (by (VALID (((((USE_THM_THEN REAL_LET_TRANS)MP_TAC) THEN (clear_assumption "REAL_LET_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`norm y`)) THEN ((USE_THM_THEN INFNORM_LE_NORM)(new_rewrite [] [])) THEN (done_tac)))));;
972 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THEN "Gkh")(ISPEC_THEN (`y$1`) thm_tac))(ISPEC_THEN (`y$2`) thm_tac)) MP_TAC) THEN ALL_TAC))));;
973 refine (by (VALID (((repeat_tactic 1 9 (((USE_THEN "yr")(new_rewrite [] []))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["t1"])) THEN (case THEN (move ["t2"])) THEN (case THEN (move ["G_eq"])) THEN (move ["t_ineq"])))));;
974 refine (by (VALID ((((USE_THEN "G_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL REAL_MUL_AC))(new_rewrite [] [])) THEN ((USE_THM_THEN real_div)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_ASSOC)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_MUL_RINV)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])))))));;
975 refine (by (VALID ((((USE_THM_THEN REAL_ENTIRE)(new_rewrite [] [])) THEN (((USE_THEN "y0")MP_TAC) THEN (clear_assumption "y0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
976 refine (by (VALID (((((USE_THEN "e_ineq")MP_TAC) THEN (clear_assumption "e_ineq") THEN (DISCH_THEN apply_tac)) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_SUB))(new_rewrite [] []))))));;
977 refine (by (VALID (((((USE_THM_THEN REAL_LET_TRANS)MP_TAC) THEN (clear_assumption "REAL_LET_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`norm (t2 % basis j:real^N) + norm (t1 % basis i:real^N)`))))));;
978 refine (by (VALID ((((USE_THM_THEN NORM_TRIANGLE)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN NORM_MUL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN NORM_BASIS)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])))))));;
979 refine (by (VALID (((((USE_THEN "yr")MP_TAC) THEN (clear_assumption "yr") THEN ((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
980 refine (by (VALID ((have_tac (move ["lim_ij"]) (`((\y:real^2. lift (G (y$1) (y$2) / (y$1 * y$2))) --> lift (partial i (partial j f) x)) 
981                 (at (vec 0) within {y | &0 < y$1 /\ &0 < y$2})`)))));;
982 refine (by (VALID ((((USE_THM_THEN LIM_WITHIN)(new_rewrite [] [])) THEN (move ["e"]) THEN (move ["e_gt0"])))));;
983 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "pc")(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN ((((USE_THM_THEN (GEN_ALL continuous_at))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN dist)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] [])))) THEN ((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "e_gt0")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (case THEN (move ["d"])) THEN (case THEN (move ["d0"])) THEN (move ["e_ineq"]))))));;
984 refine (by (VALID (((THENL_FIRST) ((exists_tac (`min r (d / &2)`)) THEN ((USE_THM_THEN REAL_LT_MIN)(new_rewrite [] [])) THEN (split_tac)) ((((USE_THEN "d0")MP_TAC) THEN (clear_assumption "d0") THEN ((USE_THEN "r0")MP_TAC) THEN (clear_assumption "r0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
985 refine (by (VALID ((((simp_tac) THEN ((USE_THM_THEN (GEN_ALL VECTOR_SUB_RZERO))(new_rewrite [] []))) THEN (move ["y"]) THEN (move ["ineq"])))));;
986 refine (by (VALID ((have_tac (move ["y0"]) (`&0 < abs (y$1) /\ &0 < abs (y$2)`)))));;
987 refine (by (VALID (((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN ((((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] [])) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN ALL_TAC) THEN (case THEN (move ["z"])) THEN (case THEN (move ["z_ineq"])) THEN (DISCH_THEN(new_rewrite [] [])) THEN (move ["_"]))))));;
988 refine (by (VALID (((((USE_THEN "z_ineq")MP_TAC) THEN (clear_assumption "z_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
989 refine (by (VALID ((have_tac (move ["yr"]) (`abs (y$1) <= r /\ abs (y$2) <= r /\ abs (y$1) < d / &2 /\ abs (y$2) < d / &2`)))));;
990 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac ALL_TAC (`infnorm y < min r (d / &2)`))) (((USE_THM_THEN (GEN_ALL INFNORM_2))(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac))))));;
991 refine (by (VALID (((((USE_THM_THEN REAL_LET_TRANS)MP_TAC) THEN (clear_assumption "REAL_LET_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`norm y`)) THEN ((USE_THM_THEN INFNORM_LE_NORM)(new_rewrite [] [])) THEN (done_tac)))));;
992 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THEN "Ghk")(ISPEC_THEN (`y$1`) thm_tac))(ISPEC_THEN (`y$2`) thm_tac)) MP_TAC) THEN ALL_TAC))));;
993 refine (by (VALID (((repeat_tactic 1 9 (((USE_THEN "yr")(new_rewrite [] []))) THEN (simp_tac)) THEN ALL_TAC THEN (case THEN (move ["t1"])) THEN (case THEN (move ["t2"])) THEN (case THEN (move ["G_eq"])) THEN (move ["t_ineq"])))));;
994 refine (by (VALID ((((USE_THEN "G_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL REAL_MUL_AC))(new_rewrite [] [])) THEN ((USE_THM_THEN real_div)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_MUL_ASSOC)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_MUL_RINV)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])))))));;
995 refine (by (VALID ((((USE_THM_THEN REAL_ENTIRE)(new_rewrite [] [])) THEN (((USE_THEN "y0")MP_TAC) THEN (clear_assumption "y0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
996 refine (by (VALID (((((USE_THEN "e_ineq")MP_TAC) THEN (clear_assumption "e_ineq") THEN (DISCH_THEN apply_tac)) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_SUB))(new_rewrite [] []))))));;
997 refine (by (VALID (((((USE_THM_THEN REAL_LET_TRANS)MP_TAC) THEN (clear_assumption "REAL_LET_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`norm (t1 % basis j:real^N) + norm (t2 % basis i:real^N)`))))));;
998 refine (by (VALID ((((USE_THM_THEN NORM_TRIANGLE)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN NORM_MUL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN NORM_BASIS)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])))))));;
999 refine (by (VALID (((((USE_THEN "yr")MP_TAC) THEN (clear_assumption "yr") THEN ((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1000 refine (by (VALID ((((USE_THM_THEN LIFT_EQ)(GSYM_THEN (new_rewrite [] []))) THEN ((fun thm_tac -> (USE_THM_THEN LIM_UNIQUE)(ISPEC_THEN (`at (vec 0:real^2) within {y:real^2 | &0 < y$1 /\ &0 < y$2}`) thm_tac)) apply_tac)))));;
1001 refine (by (VALID ((exists_tac (`\y:real^2. lift (G (y$1) (y$2) / (y$1 * y$2))`)))));;
1002 refine (by (VALID (((((USE_THM_THEN (GEN_ALL TRIVIAL_LIMIT_WITHIN))(new_rewrite [] [])) THEN ((USE_THM_THEN negbK)(new_rewrite [] [])) THEN ((USE_THEN "lim0")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (done_tac)))));;
1003 let mixed_second_partials = end_section_proof();;
1004 let m_cell_domain = new_definition `m_cell_domain (x:real^N, z:real^N) (y:real^N) (w:real^N) <=>
1005         !i. i IN 1..dimindex (:N) ==> x$i <= y$i /\ y$i <= z$i /\ max (y$i - x$i) (z$i - y$i) <= w$i`;;
1006 let m_bounded_on_int = new_definition `m_bounded_on_int (f:real^N->real) domain f_bounds <=>
1007         !x. x IN interval [domain] ==> interval_arith (f x) f_bounds`;;
1008 let diff2_domain = new_definition `diff2_domain domain f <=>
1009         !x. x IN interval [domain] ==> diff2 f x`;;
1010 let diff2c_domain = new_definition `diff2c_domain domain f <=>
1011         !x. x IN interval [domain] ==> diff2c f x`;;
1012 (start_section_proof ["f";"domain"](`diff2c_domain domain f <=> diff2_domain domain f /\
1013         (!x. x IN interval [domain] ==> !i j. (lift o partial2 j i f) continuous at x)`));;
1014 refine (by (VALID (((((USE_THM_THEN diff2c_domain)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_domain)(new_rewrite [] []))) THEN ((split_tac) THENL [(move ["h1"]); ((case THEN ((move ["h1"]) THEN (move ["h2"]))) THEN (move ["x"]) THEN (move ["h3"]))])))));;
1015 refine (by (VALID ((((split_tac) THEN (move ["x"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "h1")(MATCH_MP_THEN snd_th MP_TAC))) THEN (simp_tac)) THEN (done_tac)))));;
1016 refine (by (VALID (((((fun thm_tac -> (USE_THEN "h1")(fun fst_th ->(USE_THEN "h3")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN ((fun thm_tac -> (USE_THEN "h2")(fun fst_th ->(USE_THEN "h3")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (simp_tac)) THEN (done_tac)))));;
1017 let diff2c_domain_alt = end_section_proof();;
1018 (start_section_proof ["domain";"y";"w"](`m_cell_domain domain y w ==> y IN interval [domain]`));;
1019 refine (by (VALID ((((disch_tm_tac [](mk_var("domain",mk_type("prod",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1457984"]);mk_type("cart",[mk_type("real",[]);mk_vartype "?1457984"])])))) THEN (clear_assumption "domain") THEN case THEN (move ["x"]) THEN (move ["z"])) THEN ((((USE_THM_THEN m_cell_domain)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] [])) THEN ((USE_THM_THEN IN_NUMSEG)(new_rewrite [] []))) THEN (move ["ineqs"]) THEN (move ["i"]))))));;
1020 refine (by (VALID ((((DISCH_THEN (fun snd_th -> (USE_THEN "ineqs")(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC THEN (simp_tac)) THEN (done_tac)))));;
1021 let y_in_domain = end_section_proof();;
1022 (start_section_proof ["p";"domain";"y";"w"](`m_cell_domain domain y (w:real^N) ==> 
1023         p IN interval [domain] ==>
1024         !i. i IN 1..dimindex (:N) ==> abs (p$i - y$i) <= w$i`));;
1025 refine (by (VALID ((((disch_tm_tac [](mk_var("domain",mk_type("prod",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("cart",[mk_type("real",[]);mk_vartype "N"])])))) THEN (clear_assumption "domain") THEN case THEN (move ["x"]) THEN (move ["z"])) THEN (((USE_THM_THEN m_cell_domain)(new_rewrite [] [])) THEN (move ["ineqs"]) THEN (move ["p_in"]) THEN (move ["i"]) THEN (move ["i_in"]))))));;
1026 refine (by (VALID (((((fun thm_tac -> (USE_THEN "ineqs")(fun fst_th ->(USE_THEN "i_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN ((USE_THEN "p_in")MP_TAC) THEN (clear_assumption "p_in") THEN BETA_TAC) THEN ((((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] [])) THEN ((USE_THM_THEN IN_NUMSEG)(GSYM_THEN (new_rewrite [] [])))) THEN ((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "i_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC)) THEN (arith_tac) THEN (done_tac)))));;
1027 let domain_width = end_section_proof();;
1028 (start_section_proof ["g";"n"](`sum (1..n) (\i. sum (i + 1..n) (\j. g i j)) = 
1029                         sum (1..n) (\i. sum (1..i - 1) (\j. g j i))`));;
1030 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN SUM_SUM_PRODUCT)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] []))) THEN ((simp_tac THEN TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])))))));;
1031 refine (by (VALID ((set_tac "s1" (`{i, j | (1 <= i /\ i <= n) /\ i + 1 <= j /\ j <= n}`)))));;
1032 refine (by (VALID ((set_tac "s2" (`{i, j | (1 <= i /\ i <= n) /\ 1 <= j /\ j <= i - 1}`)))));;
1033 refine (by (VALID ((set_tac "f" (`\(i,j):num#num. j, i`)))));;
1034 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`s1 = IMAGE f s2`)))));;
1035 refine (by (VALID ((((((USE_THEN "s1_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "s2_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "f_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN EXTENSION)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_IMAGE)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac)) THEN (move ["p"])) THEN (split_tac)))));;
1036 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["i"])) THEN (case THEN (move ["j"])) THEN (case THEN (move ["ineq"])) THEN (move ["p_eq"])))));;
1037 refine (by (VALID (((exists_tac (`j, i`)) THEN (((USE_THEN "p_eq")(new_rewrite [] [])) THEN (simp_tac)) THEN ((exists_tac (mk_var("j",mk_type("num",[])))) THEN (exists_tac (mk_var("i",mk_type("num",[]))))) THEN (((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1038 refine (by (VALID ((BETA_TAC THEN (case THEN (move ["p1"])) THEN (case THEN (move ["p_eq"])) THEN (case THEN (move ["i"])) THEN (case THEN (move ["j"])) THEN (case THEN (move ["ineq"])) THEN (move ["p1_eq"])))));;
1039 refine (by (VALID ((((exists_tac (mk_var("j",mk_type("num",[])))) THEN (exists_tac (mk_var("i",mk_type("num",[]))))) THEN (((USE_THEN "p_eq")(new_rewrite [] [])) THEN ((USE_THEN "p1_eq")(new_rewrite [] [])) THEN (simp_tac)) THEN (((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1040 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`(\(i,j). g j i) = (\(i,j). g i j) o f`)))));;
1041 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THEN "f_def")(GSYM_THEN (new_rewrite [] [])))) THEN case THEN (done_tac)))));;
1042 refine (by (VALID ((((USE_THM_THEN SUM_IMAGE) apply_tac) THEN (case THEN (move ["i1"]) THEN (move ["j1"])) THEN (case THEN (move ["i2"]) THEN (move ["j2"]))))));;
1043 refine (by (VALID ((((((USE_THEN "f_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN PAIR_EQ)(new_rewrite [] [])))) THEN ALL_TAC THEN (case THEN (move ["_"])) THEN (case THEN (move ["_"])) THEN (case THEN ((DISCH_THEN(new_rewrite [] [])) THEN (DISCH_THEN(new_rewrite [] []))))) THEN (done_tac)))));;
1044 let sum_swap1 = end_section_proof();;
1045 (start_section_proof ["f";"domain";"w";"error"](`diff2c_domain domain f ==> 
1046         (m_taylor_error f domain (w:real^N) error <=>
1047         (!x. x IN interval [domain] ==> 
1048         sum (1..dimindex (:N)) (\i. w$i * (w$i * abs (partial2 i i f x)
1049                 + &2 * sum (1..i - 1) (\j. w$j * abs (partial2 j i f x)))) <= error))`));;
1050 refine (by (VALID (((((USE_THM_THEN diff2c_domain)(new_rewrite [] [])) THEN ((USE_THM_THEN m_taylor_error)(new_rewrite [] []))) THEN (move ["d2f"])))));;
1051 refine (by (VALID ((have_tac (move ["eq"]) (`!g1 g2. (!x. x IN interval [domain] ==> g1 x = g2 x) ==> 
1052         ((!x. x IN interval [domain] ==> g1 x <= error) <=> (!x. x IN interval [domain] ==> g2 x <= error))`)))));;
1053 refine (by (VALID (((BETA_TAC THEN (move ["g1"]) THEN (move ["g2"]) THEN (move ["eq"])) THEN ((split_tac) THEN (move ["cond"]) THEN (move ["x"]) THEN (move ["Px"]))))));;
1054 refine (by (VALID (((((USE_THEN "eq")(GSYM_THEN (new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THEN "cond")(new_rewrite [] []))) THEN (done_tac)))));;
1055 refine (by (VALID (((((USE_THEN "eq")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "cond")(new_rewrite [] []))) THEN (done_tac)))));;
1056 refine (by (VALID ((((USE_THEN "eq")MP_TAC) THEN (clear_assumption "eq") THEN (DISCH_THEN apply_tac) THEN (move ["x"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "d2f")(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["d2fx"])))));;
1057 refine (by (VALID ((set_tac "g" (`\i j. w$i * w$j * abs (partial2 j i f x)`)))));;
1058 refine (by (VALID ((set_tac "n" (`dimindex (:N)`)))));;
1059 refine (by (VALID ((set_tac "s1" (`sum _1 _2`)))));;
1060 refine (by (VALID ((have_tac (move ["s1_eq"]) (`s1 = sum (1..n) (\i. sum (1..n) (\j. g i j))`)))));;
1061 refine (by (VALID ((((USE_THEN "s1_def")(GSYM_THEN (new_rewrite [] []))) THEN (((USE_THM_THEN SUM_EQ) apply_tac) THEN (move ["i"]) THEN (simp_tac) THEN (move ["i_in"]))))));;
1062 refine (by (VALID (((((USE_THM_THEN SUM_LMUL)(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN partial2)(new_rewrite [] []))) THEN ((USE_THM_THEN SUM_EQ) apply_tac) THEN (done_tac)))));;
1063 refine (by (VALID ((((USE_THM_THEN REAL_MUL_2)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_ADD_LDISTRIB)(new_rewrite [] []))) THEN ((USE_THM_THEN SUM_LMUL)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_ADD_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_ADD_NUMSEG)(new_rewrite [] [])) THEN (simp_tac)))));;
1064 refine (by (VALID ((set_tac "s2" (`sum _1 _2`)))));;
1065 refine (by (VALID (((THENL_FIRST) (have_tac (move ["s2_eq"]) (`s2 = sum (1..n) (\i. g i i + sum (1..i - 1) (\j. g i j))`)) ((((USE_THEN "s2_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac))))));;
1066 refine (by (VALID ((set_tac "s3" (`sum _1 _2`)))));;
1067 refine (by (VALID (((THENL_FIRST) (have_tac (move ["s3_eq"]) (`s3 = sum (1..n) (\i. sum (1..i - 1) (\j. g i j))`)) ((((USE_THEN "s3_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac))))));;
1068 refine (by (VALID ((((USE_THEN "s3_def")MP_TAC) THEN (clear_assumption "s3_def") THEN ((USE_THEN "s2_def")MP_TAC) THEN (clear_assumption "s2_def") THEN ((USE_THEN "s1_def")MP_TAC) THEN (clear_assumption "s1_def") THEN BETA_TAC THEN (move ["_"]) THEN (move ["_"]) THEN (move ["_"])))));;
1069 refine (by (VALID ((((THENL_ROT 1)) (have_tac (DISCH_THEN(new_rewrite [] [])) (`s3 = sum (1..n) (\i. sum (i + 1..n) (\j. g i j))`))))));;
1070 refine (by (VALID (((((USE_THEN "s2_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_ADD_NUMSEG)(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "s1_eq")(new_rewrite [] []))) THEN (((USE_THM_THEN SUM_EQ) apply_tac) THEN (move ["i"]) THEN (simp_tac)) THEN (((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (move ["i_ineq"]))))));;
1071 refine (by (VALID (((((USE_THM_THEN (REAL_ARITH `!a b c. (a + b) + c = (a + c) + b`))(new_rewrite [] [])) THEN ((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN SUM_SING_NUMSEG)(ISPEC_THEN (`g i`) thm_tac))(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(GSYM_THEN (new_rewrite [] [])))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
1072 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN SUM_COMBINE_R)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "i_ineq")(new_rewrite [] [])))) ((arith_tac) THEN (done_tac))))));;
1073 refine (by (VALID (((((USE_THM_THEN (GEN_ALL REAL_ADD_AC))(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_COMBINE_L)(new_rewrite [] [])) THEN ((TRY done_tac))) THEN (((USE_THEN "i_ineq")MP_TAC) THEN (clear_assumption "i_ineq") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1074 refine (by (VALID (((((USE_THEN "s3_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN sum_swap1)(new_rewrite [] []))) THEN (((USE_THM_THEN SUM_EQ) apply_tac) THEN (move ["i"]) THEN (move ["_"]) THEN (simp_tac)) THEN (((USE_THM_THEN SUM_EQ) apply_tac) THEN (move ["j"]) THEN (move ["_"]) THEN (simp_tac))))));;
1075 refine (by (VALID (((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN (REAL_ARITH `!a b c. a * b * c = b * a * c`))(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_EQ_MUL_LCANCEL)(new_rewrite [] [])))) THEN (DISJ2_TAC) THEN (DISJ2_TAC)))));;
1076 refine (by (VALID ((((USE_THM_THEN mixed_second_partials)(new_rewrite [] [])) THEN (done_tac)))));;
1077 let m_taylor_error_eq = end_section_proof();;
1078 (start_section_proof ["domain";"y";"w";"p";"f";"dd_bound"](`m_cell_domain domain y (w:real^N) ==>
1079         p IN interval [domain] ==>
1080         diff2_domain domain f ==>
1081         m_taylor_error f domain w dd_bound ==>
1082         (!t. interval_arith t (&0, &1) ==> 
1083                 abs (nth_derivative 2 (f o (\t. y + t % (p - y))) t) <= dd_bound)`));;
1084 refine (by (VALID (((((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN ((USE_THM_THEN m_taylor_error)(new_rewrite [] []))) THEN (move ["domainH"]) THEN (move ["p_in"]) THEN (move ["df"]) THEN (move ["boundedH"]) THEN (move ["t"]) THEN (move ["t_in"])))));;
1085 refine (by (VALID ((have_tac (move ["pt_in"]) (`y + t % (p - y) IN interval [domain]`)))));;
1086 refine (by (VALID ((((USE_THM_THEN (VECTOR_ARITH `y + t % (p - y) = (&1 - t) % y + t % p:real^N`))(new_rewrite [] [])) THEN ((USE_THM_THEN IN_CONVEX_SET)(new_rewrite [] []))))));;
1087 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN y_in_domain)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THEN "p_in")(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "t_in")(new_rewrite [] [])) THEN ((USE_THM_THEN pair_eq)(new_rewrite [] [])) THEN ((USE_THM_THEN CONVEX_INTERVAL)(new_rewrite [] []))) THEN (done_tac)))));;
1088 refine (by (VALID ((((USE_THM_THEN diff2_dir_derivative2)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN ((TRY done_tac))))));;
1089 refine (by (VALID (((((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac)) THEN (((fun thm_tac -> (USE_THEN "boundedH")(fun fst_th ->(USE_THEN "pt_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC)))));;
1090 refine (by (VALID (((set_tac "s1" (`sum _1 _2`)) THEN ((set_tac "s2" (`sum _1 _2`)) THEN (move ["i1"]))))));;
1091 refine (by (VALID (((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (mk_var("s1",mk_type("real",[])))) THEN (((USE_THEN "i1")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((USE_THEN "s1_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "s2_def")(GSYM_THEN (new_rewrite [] []))))))));;
1092 refine (by (VALID (((((USE_THM_THEN SUM_ABS_LE)(new_rewrite [] [])) THEN ((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["i_ineq"]) THEN (simp_tac)))));;
1093 refine (by (VALID (((((USE_THM_THEN SUM_LMUL)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN SUM_ABS_LE)(new_rewrite [] [])) THEN ((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["j"]) THEN (move ["j_ineq"]) THEN (simp_tac)))));;
1094 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN REAL_ABS_MUL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_LE_MUL2)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_LE_MUL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_ABS_POS)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] []))) THEN (((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN domain_width)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "p_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN (done_tac)))));;
1095 let diff2_derivative2_bound = end_section_proof();;
1096 (start_section_proof ["domain";"y";"w";"p";"f";"dd_bound"](`m_cell_domain domain y (w:real^N) ==>
1097         p IN interval [domain] ==>
1098         diff2_domain domain f ==>
1099         m_taylor_error f domain w dd_bound ==>
1100         abs (f p - (f y + sum (1..dimindex (:N)) (\i. (p - y)$i * partial i f y))) <= dd_bound / &2`));;
1101 refine (by (VALID ((((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN (BETA_TAC THEN (move ["domainH"]) THEN (move ["p_in"]) THEN (move ["df"]) THEN (move ["taylor_error"]))))));;
1102 refine (by (VALID ((have_tac (move ["pt_in"]) (`!t. interval_arith t (&0, &1) ==> y + t % (p - y) IN interval [domain]`)))));;
1103 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["t_in"])) THEN (((USE_THM_THEN (VECTOR_ARITH `y + t % (p - y) = (&1 - t) % y + t % p:real^N`))(new_rewrite [] [])) THEN ((USE_THM_THEN IN_CONVEX_SET)(new_rewrite [] [])))))));;
1104 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN y_in_domain)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THEN "p_in")(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "t_in")(new_rewrite [] [])) THEN ((USE_THM_THEN pair_eq)(new_rewrite [] [])) THEN ((USE_THM_THEN CONVEX_INTERVAL)(new_rewrite [] []))) THEN (done_tac)))));;
1105 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_taylor2_bound)(ISPEC_THEN (`f o (\t. y + t % (p - y))`) thm_tac))(ISPEC_THEN (mk_var("dd_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC))));;
1106 refine (by (VALID (((THENL_FIRST) (ANTS_TAC) ((((USE_THM_THEN nth_diff_strong_int)(new_rewrite [] [])) THEN (move ["t"]) THEN (move ["t_in"])) THEN (((USE_THM_THEN diff2_dir)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN ((USE_THEN "pt_in")(new_rewrite [] []))) THEN (done_tac))))));;
1107 refine (by (VALID (((THENL_FIRST) (ANTS_TAC) ((((fun thm_tac -> (USE_THM_THEN diff2_derivative2_bound)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (DISCH_THEN apply_tac)) THEN ((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN (done_tac))))));;
1108 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LID)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_SUB_ADD2))(new_rewrite [] []))))));;
1109 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN diff2_dir_derivative)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "pt_in")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN interval_arith)(new_rewrite [] [])))) ((arith_tac) THEN (done_tac))))));;
1110 refine (by (VALID (((((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] []))) THEN (done_tac)))));;
1111 let m_taylor_error_lemma = end_section_proof();;
1112 (start_section_proof ["domain";"y";"w";"f";"dd_bound";"hi";"hi_bound"](`m_cell_domain domain y (w:real^N) ==>
1113         diff2_domain domain f ==>
1114         m_taylor_error f domain w dd_bound ==>
1115         f y <= hi ==>
1116         hi + sum(1..dimindex (:N)) (\i. w$i * abs (partial i f y)) + dd_bound / &2 <= hi_bound ==>
1117         !p. p IN interval [domain] ==> f p <= hi_bound`));;
1118 refine (by (VALID ((BETA_TAC THEN (move ["domainH"]) THEN (move ["df"]) THEN (move ["errorH"]) THEN (move ["f_bound"]) THEN (move ["total_bound"]) THEN (move ["p"]) THEN (move ["p_in"])))));;
1119 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_error_lemma)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "p_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
1120 refine (by (VALID (((DISCH_THEN (fun snd_th -> (USE_THM_THEN (REAL_ARITH `!x y e. abs (x - y) <= e ==> x <= y + e`))(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC))));;
1121 refine (by (VALID (((set_tac "s" (`sum _1 _2`)) THEN (move ["ineq"])))));;
1122 refine (by (VALID (((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`(f y + s) + dd_bound / &2`)) THEN (((USE_THEN "ineq")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1123 refine (by (VALID ((((USE_THEN "total_bound")MP_TAC) THEN (clear_assumption "total_bound") THEN ((USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1124 refine (by (VALID ((((USE_THM_THEN REAL_ADD_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_RADD)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_ADD2)(new_rewrite [] [])) THEN ((USE_THEN "f_bound")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
1125 refine (by (VALID (((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`abs s`)) THEN (((USE_THM_THEN REAL_ABS_LE)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1126 refine (by (VALID (((((USE_THEN "s_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN SUM_ABS_LE)(new_rewrite [] [])) THEN ((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["i_ineq"]) THEN (simp_tac)))));;
1127 refine (by (VALID (((((USE_THM_THEN REAL_ABS_MUL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_MUL2)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_ABS_POS)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN domain_width)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1128 let m_taylor_upper_bound = end_section_proof();;
1129 (start_section_proof ["domain";"y";"w";"f";"dd_bound";"lo";"lo_bound"](`m_cell_domain domain y (w:real^N) ==>
1130         diff2_domain domain f ==>
1131         m_taylor_error f domain w dd_bound ==>
1132         lo <= f y ==>
1133         lo_bound <= lo - (sum(1..dimindex (:N)) (\i. w$i * abs (partial i f y)) + dd_bound / &2) ==>
1134         !p. p IN interval [domain] ==> lo_bound <= f p`));;
1135 refine (by (VALID ((BETA_TAC THEN (move ["domainH"]) THEN (move ["df"]) THEN (move ["errorH"]) THEN (move ["f_bound"]) THEN (move ["total_bound"]) THEN (move ["p"]) THEN (move ["p_in"])))));;
1136 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_error_lemma)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "p_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
1137 refine (by (VALID (((DISCH_THEN (fun snd_th -> (USE_THM_THEN (REAL_ARITH `!x y e. abs (x - y) <= e ==> y - e <= x`))(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC))));;
1138 refine (by (VALID (((set_tac "s" (`sum _1 _2`)) THEN (move ["ineq"])))));;
1139 refine (by (VALID (((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`(f y + s) - dd_bound / &2`)) THEN (((USE_THEN "ineq")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])))))));;
1140 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))(fun fst_th ->(USE_THEN "total_bound")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1141 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN real_sub)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_NEG_ADD)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ADD_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_RADD)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_ADD2)(new_rewrite [] [])) THEN ((USE_THEN "f_bound")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
1142 refine (by (VALID (((THENL_LAST) ((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`--abs s`)) THEN ((USE_THM_THEN REAL_LE_NEG)(new_rewrite [] [])) THEN (split_tac)) ((arith_tac) THEN (done_tac))))));;
1143 refine (by (VALID (((((USE_THEN "s_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN SUM_ABS_LE)(new_rewrite [] [])) THEN ((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["i_ineq"]) THEN (simp_tac)))));;
1144 refine (by (VALID (((((USE_THM_THEN REAL_ABS_MUL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_MUL2)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_ABS_POS)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN domain_width)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1145 let m_taylor_lower_bound = end_section_proof();;
1146 (start_section_proof ["domain";"y";"w";"f";"dd_bound";"lo";"hi";"err_bound";"lo_bound";"hi_bound"](`m_cell_domain domain y (w:real^N) ==>
1147         diff2_domain domain f ==>
1148         m_taylor_error f domain w dd_bound ==>
1149         interval_arith (f y) (lo, hi) ==>
1150         sum(1..dimindex (:N)) (\i. w$i * abs(partial i f y)) + dd_bound / &2 <= err_bound ==>
1151         lo_bound <= lo - err_bound ==>
1152         hi + err_bound <= hi_bound ==>
1153         m_bounded_on_int f domain (lo_bound, hi_bound)`));;
1154 refine (by (VALID (((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN interval_arith)(new_rewrite [] [])))) THEN (move ["domainH"]) THEN (move ["df"]) THEN (move ["errorH"]) THEN (case THEN ((move ["f_lo"]) THEN (move ["f_hi"]))) THEN (move ["err"]) THEN (move ["lo_ineq"]) THEN (move ["hi_ineq"]) THEN (move ["p"]) THEN (move ["p_in"])))));;
1155 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_lower_bound)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "f_lo")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(ISPEC_THEN (mk_var("lo_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC THEN (DISCH_THEN(new_rewrite [] []))))));;
1156 refine (by (VALID (((((USE_THEN "p_in")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] []))) THEN (((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`lo - err_bound`))))));;
1157 refine (by (VALID (((((USE_THEN "lo_ineq")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN real_sub)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_ADD2)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_NEG)(new_rewrite [] []))) THEN (done_tac)))));;
1158 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_upper_bound)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "f_hi")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(ISPEC_THEN (mk_var("hi_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC THEN (DISCH_THEN(new_rewrite [] [])) THEN ((TRY done_tac))))));;
1159 refine (by (VALID (((((USE_THEN "p_in")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] []))) THEN (((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`hi + err_bound`))))));;
1160 refine (by (VALID (((((USE_THEN "hi_ineq")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_LADD)(new_rewrite [] []))) THEN (done_tac)))));;
1161 let m_taylor_bounds = end_section_proof();;
1162 (start_section_proof ["domain";"y";"w";"p";"f";"i";"d_bound"](`m_cell_domain domain y (w:real^N) ==>
1163         p IN interval [domain] ==>
1164         diff2_domain domain f ==>
1165         m_taylor_partial_error f i domain w d_bound ==>
1166         (!t. interval_arith t (&0, &1) ==> 
1167                 abs (derivative (partial i f o (\t. y + t % (p - y))) t) <= d_bound)`));;
1168 refine (by (VALID (((((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN ((USE_THM_THEN m_taylor_partial_error)(new_rewrite [] []))) THEN (move ["domainH"]) THEN (move ["p_in"]) THEN (move ["df"]) THEN (move ["boundedH"]) THEN (move ["t"]) THEN (move ["t_in"])))));;
1169 refine (by (VALID ((have_tac (move ["pt_in"]) (`y + t % (p - y) IN interval [domain]`)))));;
1170 refine (by (VALID ((((USE_THM_THEN (VECTOR_ARITH `y + t % (p - y) = (&1 - t) % y + t % p:real^N`))(new_rewrite [] [])) THEN ((USE_THM_THEN IN_CONVEX_SET)(new_rewrite [] []))))));;
1171 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN y_in_domain)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THEN "p_in")(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "t_in")(new_rewrite [] [])) THEN ((USE_THM_THEN pair_eq)(new_rewrite [] [])) THEN ((USE_THM_THEN CONVEX_INTERVAL)(new_rewrite [] []))) THEN (done_tac)))));;
1172 refine (by (VALID ((((USE_THM_THEN diff2_derivative_partial)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN ((TRY done_tac))))));;
1173 refine (by (VALID ((((fun thm_tac -> (USE_THEN "boundedH")(fun fst_th ->(USE_THEN "pt_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN ((USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1174 refine (by (VALID (((((USE_THM_THEN SUM_ABS_LE)(new_rewrite [] [])) THEN ((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["j"]) THEN (move ["j_ineq"]) THEN (simp_tac)))));;
1175 refine (by (VALID ((((USE_THM_THEN REAL_ABS_MUL)(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN REAL_LE_MUL2)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_ABS_POS)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_SUB_COMPONENT)(new_rewrite [] []))))));;
1176 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN domain_width)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN (done_tac)))));;
1177 let diff2_derivative_partial_bound = end_section_proof();;
1178 (start_section_proof ["domain";"y";"w";"p";"f";"i";"dd_bound"](`m_cell_domain domain y (w:real^N) ==>
1179         p IN interval [domain] ==>
1180         diff2_domain domain f ==>
1181         m_taylor_partial_error f i domain w dd_bound ==>
1182         abs (partial i f p - partial i f y) <= dd_bound`));;
1183 refine (by (VALID ((((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN (BETA_TAC THEN (move ["domainH"]) THEN (move ["p_in"]) THEN (move ["df"]) THEN (move ["partial_error"]))))));;
1184 refine (by (VALID ((have_tac (move ["pt_in"]) (`!t. interval_arith t (&0, &1) ==> y + t % (p - y) IN interval [domain]`)))));;
1185 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["t_in"])) THEN (((USE_THM_THEN (VECTOR_ARITH `y + t % (p - y) = (&1 - t) % y + t % p:real^N`))(new_rewrite [] [])) THEN ((USE_THM_THEN IN_CONVEX_SET)(new_rewrite [] [])))))));;
1186 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN y_in_domain)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THEN "p_in")(new_rewrite [] [])) THEN ((USE_THM_THEN interval_arith)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "t_in")(new_rewrite [] [])) THEN ((USE_THM_THEN pair_eq)(new_rewrite [] [])) THEN ((USE_THM_THEN CONVEX_INTERVAL)(new_rewrite [] []))) THEN (done_tac)))));;
1187 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN real_taylor1_bound)(ISPEC_THEN (`partial i f o (\t. y + t % (p - y))`) thm_tac))(ISPEC_THEN (mk_var("dd_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC))));;
1188 refine (by (VALID ((ANTS_TAC))));;
1189 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["t_in"])) THEN (((USE_THM_THEN diff2_real_diff_partial)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "pt_in")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((fun thm_tac -> (USE_THM_THEN diff2_derivative_partial_bound)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((TRY done_tac)))))));;
1190 refine (by (VALID ((((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN (done_tac)))));;
1191 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LID)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_SUB_ADD2))(new_rewrite [] []))) THEN (done_tac)))));;
1192 let m_taylor_partial_error_lemma = end_section_proof();;
1193 (start_section_proof ["domain";"y";"w";"f";"i";"dd_bound";"hi";"hi_bound"](`m_cell_domain domain y (w:real^N) ==>
1194         diff2_domain domain f ==>
1195         m_taylor_partial_error f i domain w dd_bound ==>
1196         partial i f y <= hi ==>
1197         hi + dd_bound <= hi_bound ==>
1198         !p. p IN interval [domain] ==> partial i f p <= hi_bound`));;
1199 refine (by (VALID ((BETA_TAC THEN (move ["domainH"]) THEN (move ["df"]) THEN (move ["errorH"]) THEN (move ["df_bound"]) THEN (move ["total_bound"]) THEN (move ["p"]) THEN (move ["p_in"])))));;
1200 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_partial_error_lemma)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "p_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
1201 refine (by (VALID (((DISCH_THEN (fun snd_th -> (USE_THM_THEN (REAL_ARITH `!x y e. abs (x - y) <= e ==> x <= y + e`))(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC THEN (move ["ineq"])))));;
1202 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))(fun fst_th ->(USE_THEN "ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1203 refine (by (VALID ((((USE_THEN "total_bound")MP_TAC) THEN (clear_assumption "total_bound") THEN ((USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1204 refine (by (VALID (((((USE_THM_THEN REAL_LE_ADD2)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN (done_tac)))));;
1205 let m_taylor_upper_partial_bound = end_section_proof();;
1206 (start_section_proof ["domain";"y";"w";"f";"i";"dd_bound";"lo";"lo_bound"](`m_cell_domain domain y (w:real^N) ==>
1207         diff2_domain domain f ==>
1208         m_taylor_partial_error f i domain w dd_bound ==>
1209         lo <= partial i f y ==>
1210         lo_bound <= lo - dd_bound ==>
1211         !p. p IN interval [domain] ==> lo_bound <= partial i f p`));;
1212 refine (by (VALID ((BETA_TAC THEN (move ["domainH"]) THEN (move ["df"]) THEN (move ["errorH"]) THEN (move ["df_bound"]) THEN (move ["total_bound"]) THEN (move ["p"]) THEN (move ["p_in"])))));;
1213 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_partial_error_lemma)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "p_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC))));;
1214 refine (by (VALID (((DISCH_THEN (fun snd_th -> (USE_THM_THEN (REAL_ARITH `!x y e. abs (x - y) <= e ==> y - e <= x`))(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC THEN (move ["ineq"])))));;
1215 refine (by (VALID ((((USE_THEN "ineq")MP_TAC) THEN (clear_assumption "ineq") THEN ((USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1216 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))(fun fst_th ->(USE_THEN "total_bound")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1217 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN real_sub)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_ADD2)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN (done_tac)))));;
1218 let m_taylor_lower_partial_bound = end_section_proof();;
1219 (start_section_proof ["domain";"y";"w";"f";"i";"dd_bound";"lo";"hi";"lo_bound";"hi_bound"](`m_cell_domain domain y (w:real^N) ==>
1220         diff2_domain domain f ==>
1221         m_taylor_partial_error f i domain w dd_bound ==>
1222         interval_arith (partial i f y) (lo, hi) ==>
1223         lo_bound <= lo - dd_bound ==>
1224         hi + dd_bound <= hi_bound ==>
1225         m_bounded_on_int (partial i f) domain (lo_bound, hi_bound)`));;
1226 refine (by (VALID (((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN interval_arith)(new_rewrite [] [])))) THEN (move ["domainH"]) THEN (move ["df"]) THEN (move ["errorH"]) THEN (case THEN ((move ["df_lo"]) THEN (move ["df_hi"]))) THEN (move ["lo_ineq"]) THEN (move ["hi_ineq"]) THEN (move ["p"]) THEN (move ["p_in"])))));;
1227 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_lower_partial_bound)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df_lo")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(ISPEC_THEN (mk_var("lo_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC THEN (DISCH_THEN(new_rewrite [] [])) THEN ((TRY done_tac))))));;
1228 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN m_taylor_upper_partial_bound)(fun fst_th ->(USE_THEN "domainH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "errorH")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "df_hi")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(ISPEC_THEN (mk_var("hi_bound",mk_type("real",[]))) thm_tac))MP_TAC) THEN BETA_TAC THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
1229 let m_taylor_partial_bounds = end_section_proof();;
1230 let m_taylor_partial_bounds = finalize_theorem m_taylor_partial_bounds;;
1231 let m_taylor_lower_partial_bound = finalize_theorem m_taylor_lower_partial_bound;;
1232 let m_taylor_upper_partial_bound = finalize_theorem m_taylor_upper_partial_bound;;
1233 let m_taylor_partial_error_lemma = finalize_theorem m_taylor_partial_error_lemma;;
1234 let diff2_derivative_partial_bound = finalize_theorem diff2_derivative_partial_bound;;
1235 let m_taylor_bounds = finalize_theorem m_taylor_bounds;;
1236 let m_taylor_lower_bound = finalize_theorem m_taylor_lower_bound;;
1237 let m_taylor_upper_bound = finalize_theorem m_taylor_upper_bound;;
1238 let m_taylor_error_lemma = finalize_theorem m_taylor_error_lemma;;
1239 let diff2_derivative2_bound = finalize_theorem diff2_derivative2_bound;;
1240 let m_taylor_error_eq = finalize_theorem m_taylor_error_eq;;
1241 let sum_swap1 = finalize_theorem sum_swap1;;
1242 let domain_width = finalize_theorem domain_width;;
1243 let y_in_domain = finalize_theorem y_in_domain;;
1244 let diff2c_domain_alt = finalize_theorem diff2c_domain_alt;;
1245 let mixed_second_partials = finalize_theorem mixed_second_partials;;
1246 let real_mvt0 = finalize_theorem real_mvt0;;
1247 let partial_eq0_alt = finalize_theorem partial_eq0_alt;;
1248 let partial_const = finalize_theorem partial_const;;
1249 let diff2_real_diff_partial = finalize_theorem diff2_real_diff_partial;;
1250 let diff2_derivative_partial = finalize_theorem diff2_derivative_partial;;
1251 let diff2_has_derivative_partial = finalize_theorem diff2_has_derivative_partial;;
1252 let diff2_dir_derivative2 = finalize_theorem diff2_dir_derivative2;;
1253 let diff2_dir = finalize_theorem diff2_dir;;
1254 let open_contains_open_interval = finalize_theorem open_contains_open_interval;;
1255 let in_trans = finalize_theorem in_trans;;
1256 let diff2_partial_real_diff = finalize_theorem diff2_partial_real_diff;;
1257 let diff2_dir_derivative = finalize_theorem diff2_dir_derivative;;
1258 let diff2_imp_real_diff = finalize_theorem diff2_imp_real_diff;;
1259 let diff2_eq_diff2_on_open = finalize_theorem diff2_eq_diff2_on_open;;
1260 let diff2c_imp_diff2 = finalize_theorem diff2c_imp_diff2;;
1261 let taylor_error_eq_sum_partial_errors = finalize_theorem taylor_error_eq_sum_partial_errors;;
1262 let real_taylor1_bound = finalize_theorem real_taylor1_bound;;
1263 let real_taylor2_bound = finalize_theorem real_taylor2_bound;;
1264 (end_section "Taylor");;
1265 (begin_section "Diff2Arith");;
1266 (add_section_var (mk_var ("f", (`:real^N -> real`))); add_section_var (mk_var ("g", (`:real^N -> real`))));;
1267 (add_section_var (mk_var ("x", (`:real^N`))));;
1268 (add_section_var (mk_var ("domain", (`:real^N#real^N`))));;
1269 (start_section_proof ["s";"f";"g";"x"](`f differentiable at x ==>       open s ==> x IN s ==> (!y. y IN s ==> g y = f y) ==>
1270                 g differentiable at x`));;
1271 refine (by (VALID ((((USE_THM_THEN OPEN_CONTAINS_BALL)(new_rewrite [] [])) THEN (move ["df"]) THEN (move ["open_s"]) THEN (move ["xs"]) THEN (move ["eq"])))));;
1272 refine (by (VALID (((((fun thm_tac -> (USE_THEN "open_s")(fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["d"])) THEN (case THEN (move ["d0"]))) THEN ((((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_BALL)(new_rewrite [] []))) THEN (move ["in_ball"]))))));;
1273 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN DIFFERENTIABLE_TRANSFORM_AT)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1459839"]);mk_type("cart",[mk_type("real",[]);mk_vartype "?1459836"])]))) thm_tac))MP_TAC) THEN (DISCH_THEN apply_tac)) THEN (((USE_THEN "df")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])))))));;
1274 refine (by (VALID (((exists_tac (mk_var("d",mk_type("real",[])))) THEN ((((USE_THEN "d0")(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["z"]) THEN (move ["dzx"])) THEN (((USE_THEN "eq")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "in_ball")(new_rewrite [] [])) THEN ((USE_THM_THEN DIST_SYM)(new_rewrite [] []))) THEN (done_tac)))));;
1275 let differentiable_local_at = end_section_proof();;
1276 (begin_section "Point");;
1277 (start_section_proof ["f";"c"](`diff2 f x ==> diff2 (\x. c * f x) x`));;
1278 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
1279 refine (by (VALID (((exists_tac (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])])))) THEN ((((USE_THEN "open_s")(new_rewrite [] [])) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["z"]) THEN (move ["zs"]))))));;
1280 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN f_lift_scale)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CMUL)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))) (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN (done_tac))))));;
1281 refine (by (VALID (((BETA_TAC THEN (move ["i"])) THEN (((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN differentiable_local_at)(ISPEC_THEN (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])]))) thm_tac))(ISPEC_THEN (`lift o (\x. c * partial i f x)`) thm_tac))MP_TAC) THEN (DISCH_THEN apply_tac))))));;
1282 refine (by (VALID (((THENL_FIRST) (((USE_THEN "open_s")(new_rewrite [] [])) THEN ((USE_THEN "zs")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_scale)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CMUL)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))) (repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN (done_tac))))));;
1283 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (move ["ys"])) THEN (repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN ((USE_THM_THEN partial_scale)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN LIFT_CMUL)(new_rewrite [] []))) THEN (done_tac)))));;
1284 let diff2_scale = end_section_proof();;
1285 (start_section_proof ["f"](`diff2 f x ==> diff2 (\x. --f x) x`));;
1286 refine (by (VALID ((((DISCH_THEN (fun snd_th -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN diff2_scale)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`--(&1)`) thm_tac))(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC) THEN ((USE_THM_THEN REAL_NEG_MINUS1)(GSYM_THEN (new_rewrite [] []))) THEN (done_tac)))));;
1287 let diff2_neg = end_section_proof();;
1288 (begin_section "Composite");;
1289 (start_section_proof ["u";"f";"u'";"f'";"x"](`(lift o f has_derivative f') (at x) ==>
1290         (u has_real_derivative u') (atreal (f x)) ==>
1291         (lift o u o f has_derivative (\x. u' % f' x)) (at x)`));;
1292 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["du"])))));;
1293 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`lift o u o f = (lift o u o drop) o (lift o f)`)))));;
1294 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN ((USE_THM_THEN LIFT_DROP)(new_rewrite [] []))) THEN (done_tac)))));;
1295 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`(\x. u' % f' x) = (\x. u' % x) o f'`)) ((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac)) THEN (done_tac))))));;
1296 refine (by (VALID (((((USE_THM_THEN DIFF_CHAIN_AT)(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL HAS_REAL_FRECHET_DERIVATIVE_AT))(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
1297 let has_derivative_uni_compose = end_section_proof();;
1298 (start_section_proof ["u";"f";"x"](`lift o f differentiable at x ==> 
1299         u real_differentiable atreal (f x) ==>
1300         lift o u o f differentiable at x`));;
1301 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN differentiable)(new_rewrite [] []))) THEN ((USE_THM_THEN real_differentiable)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["f'"])) THEN (move ["df"]) THEN (case THEN (move ["u'"])) THEN (move ["du"])))));;
1302 refine (by (VALID (((exists_tac (`\x. u' % f' x`)) THEN ((USE_THM_THEN has_derivative_uni_compose) apply_tac) THEN (done_tac)))));;
1303 let diff_uni_compose = end_section_proof();;
1304 (start_section_proof ["u";"f"](`diff2 f x ==> nth_diff_strong 2 u (f x) ==> diff2 (u o f) x`));;
1305 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ((USE_THM_THEN nth_diff_strong2_eq)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]) THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["fxt"])) THEN (move ["du"])))));;
1306 refine (by (VALID ((set_tac "r" (`{z | z IN s /\ (lift o f) z IN (IMAGE lift t)}`)))));;
1307 refine (by (VALID ((have_tac (move ["open_r"]) (`open r`)))));;
1308 refine (by (VALID ((((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN CONTINUOUS_OPEN_PREIMAGE)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_OPEN)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "open_t")(new_rewrite [] [])) THEN ((USE_THEN "open_s")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andbT)(new_rewrite [] [])))))));;
1309 refine (by (VALID ((((USE_THM_THEN DIFFERENTIABLE_IMP_CONTINUOUS_ON) apply_tac) THEN (((USE_THM_THEN differentiable_on)(new_rewrite [] [])) THEN (move ["y"]) THEN (move ["ys"])) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
1310 refine (by (VALID (((((USE_THM_THEN DIFFERENTIABLE_AT_WITHIN)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
1311 refine (by (VALID (((THENL_FIRST) ((exists_tac (mk_var("r",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])])))) THEN (((USE_THEN "open_r")(new_rewrite [] [])) THEN ((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN LIFT_IN_IMAGE_LIFT)(new_rewrite [] []))) THEN (split_tac)) ((exists_tac (mk_var("x",mk_type("cart",[mk_type("real",[]);mk_vartype "N"])))) THEN (done_tac))))));;
1312 refine (by (VALID ((BETA_TAC THEN (move ["y"]) THEN (case THEN (move ["z"])) THEN (case THEN ((case THEN (move ["zs"])) THEN (move ["fzt"]))) THEN (DISCH_THEN(new_rewrite [] []))))));;
1313 refine (by (VALID (((((USE_THM_THEN diff_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "du")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"])))));;
1314 refine (by (VALID ((((USE_THM_THEN differentiable_local_at) apply_tac) THEN ((exists_tac (mk_var("r",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])])))) THEN (exists_tac (`lift o (\y. derivative u (f y) * partial i f y)`)))))));;
1315 refine (by (VALID ((((USE_THEN "open_r")(new_rewrite [] [])) THEN ((USE_THM_THEN differentiable_mul)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1316 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN o_THM)(ISPEC_THEN (`derivative u`) thm_tac))(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN (((USE_THM_THEN diff_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THEN "du")(new_rewrite [] []))) THEN (done_tac)))));;
1317 refine (by (VALID (((THENL_FIRST) ((((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_IN_IMAGE_LIFT)(new_rewrite [] [])))) THEN (split_tac)) ((exists_tac (mk_var("z",mk_type("cart",[mk_type("real",[]);mk_vartype "N"])))) THEN (done_tac))))));;
1318 refine (by (VALID ((BETA_TAC THEN (move ["y"]) THEN (case THEN (move ["p"])) THEN (case THEN ((case THEN (move ["ps"])) THEN (move ["fpt"]))) THEN (DISCH_THEN(new_rewrite [] []))))));;
1319 refine (by (VALID (((((USE_THM_THEN partial_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "du")(new_rewrite [] [])))) THEN (done_tac)))));;
1320 let diff2_uni_compose = end_section_proof();;
1321 (start_section_proof [](`~(f x = &0) ==> diff2 f x ==> diff2 (inv o f) x`));;
1322 refine (by (VALID (((BETA_TAC THEN (DISCH_THEN (fun snd_th -> (USE_THM_THEN diff2_inv)(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["du"]) THEN (move ["df"])) THEN ((USE_THM_THEN diff2_uni_compose)(new_rewrite [] [])) THEN (done_tac)))));;
1323 let diff2_inv_compose = end_section_proof();;
1324 (start_section_proof [](`&0 < f x ==> diff2 f x ==> diff2 (sqrt o f) x`));;
1325 refine (by (VALID (((BETA_TAC THEN (DISCH_THEN (fun snd_th -> (USE_THM_THEN diff2_sqrt)(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["du"]) THEN (move ["df"])) THEN ((USE_THM_THEN diff2_uni_compose)(new_rewrite [] [])) THEN (done_tac)))));;
1326 let diff2_sqrt_compose = end_section_proof();;
1327 (start_section_proof [](`diff2 f x ==> diff2 (atn o f) x`));;
1328 refine (by (VALID (((BETA_TAC THEN (move ["df"])) THEN (((USE_THM_THEN diff2_uni_compose)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_atn)(new_rewrite [] []))) THEN (done_tac)))));;
1329 let diff2_atn_compose = end_section_proof();;
1330 (start_section_proof [](`abs (f x) < &1 ==> diff2 f x ==> diff2 (acs o f) x`));;
1331 refine (by (VALID (((BETA_TAC THEN (DISCH_THEN (fun snd_th -> (USE_THM_THEN diff2_acs)(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["du"]) THEN (move ["df"])) THEN ((USE_THM_THEN diff2_uni_compose)(new_rewrite [] [])) THEN (done_tac)))));;
1332 let diff2_acs_compose = end_section_proof();;
1333 let diff2_acs_compose = finalize_theorem diff2_acs_compose;;
1334 let diff2_atn_compose = finalize_theorem diff2_atn_compose;;
1335 let diff2_sqrt_compose = finalize_theorem diff2_sqrt_compose;;
1336 let diff2_inv_compose = finalize_theorem diff2_inv_compose;;
1337 let diff2_uni_compose = finalize_theorem diff2_uni_compose;;
1338 let diff_uni_compose = finalize_theorem diff_uni_compose;;
1339 let has_derivative_uni_compose = finalize_theorem has_derivative_uni_compose;;
1340 (end_section "Composite");;
1341 (start_section_proof ["f";"g"](`diff2 f x ==> diff2 g x ==> diff2 (\x. f x + g x) x`));;
1342 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]) THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["ys"])) THEN (move ["dg"])))));;
1343 refine (by (VALID (((exists_tac (`s INTER t`)) THEN ((((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN ((USE_THEN "ys")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["z"]) THEN (case THEN ((move ["zs"]) THEN (move ["zt"]))))))));;
1344 refine (by (VALID ((((USE_THM_THEN f_lift_add)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1345 refine (by (VALID ((((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (((USE_THEN "df")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "dg")(new_rewrite [] []))) THEN (done_tac)))));;
1346 refine (by (VALID (((BETA_TAC THEN (move ["i"])) THEN (((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN differentiable_local_at)(ISPEC_THEN (`s INTER t`) thm_tac))(ISPEC_THEN (`lift o (\x. partial i f x + partial i g x)`) thm_tac))MP_TAC) THEN (DISCH_THEN apply_tac))))));;
1347 refine (by (VALID ((((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "zt")(new_rewrite [] [])) THEN ((USE_THEN "zs")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_add)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1348 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN (((USE_THEN "df")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "dg")(new_rewrite [] []))) THEN (done_tac)))));;
1349 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN ((move ["ys"]) THEN (move ["yt"])))) THEN (repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN ((USE_THM_THEN partial_add)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN LIFT_ADD)(new_rewrite [] []))) THEN (done_tac)))));;
1350 let diff2_add = end_section_proof();;
1351 (start_section_proof ["f";"g"](`diff2 f x ==> diff2 g x ==> diff2 (\x. f x - g x) x`));;
1352 refine (by (VALID (((BETA_TAC THEN (move ["d2f"]) THEN (move ["d2g"])) THEN (((USE_THM_THEN real_sub)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_add)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN diff2_neg)(new_rewrite [] []))) THEN (done_tac)))));;
1353 let diff2_sub = end_section_proof();;
1354 (start_section_proof ["f";"g"](`diff2 f x ==> diff2 g x ==> diff2 (\x. f x * g x) x`));;
1355 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]) THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["ys"])) THEN (move ["dg"])))));;
1356 refine (by (VALID (((exists_tac (`s INTER t`)) THEN ((((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN ((USE_THEN "ys")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["z"]) THEN (case THEN ((move ["zs"]) THEN (move ["zt"]))))))));;
1357 refine (by (VALID (((((USE_THM_THEN differentiable_mul)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"])))));;
1358 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN differentiable_local_at)(ISPEC_THEN (`s INTER t`) thm_tac))(ISPEC_THEN (`lift o (\x. partial i f x * g x + f x * partial i g x)`) thm_tac))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1359 refine (by (VALID ((((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "zt")(new_rewrite [] [])) THEN ((USE_THEN "zs")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_add)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1360 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN repeat_tactic 1 9 (((USE_THM_THEN differentiable_mul)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] [])))) THEN (done_tac)))));;
1361 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN ((move ["ys"]) THEN (move ["yt"])))) THEN (repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN ((USE_THM_THEN partial_mul)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN LIFT_ADD)(new_rewrite [] []))) THEN (done_tac)))));;
1362 let diff2_mul = end_section_proof();;
1363 let diff2_mul = finalize_theorem diff2_mul;;
1364 let diff2_sub = finalize_theorem diff2_sub;;
1365 let diff2_add = finalize_theorem diff2_add;;
1366 let diff2_acs_compose = finalize_theorem diff2_acs_compose;;
1367 let diff2_atn_compose = finalize_theorem diff2_atn_compose;;
1368 let diff2_sqrt_compose = finalize_theorem diff2_sqrt_compose;;
1369 let diff2_inv_compose = finalize_theorem diff2_inv_compose;;
1370 let diff2_uni_compose = finalize_theorem diff2_uni_compose;;
1371 let diff_uni_compose = finalize_theorem diff_uni_compose;;
1372 let has_derivative_uni_compose = finalize_theorem has_derivative_uni_compose;;
1373 let diff2_neg = finalize_theorem diff2_neg;;
1374 let diff2_scale = finalize_theorem diff2_scale;;
1375 (end_section "Point");;
1376 (begin_section "Domain");;
1377 (add_section_hyp "d2f" (`diff2_domain domain f`));;
1378 (start_section_proof ["c"](`diff2_domain domain (\x. c * f x)`));;
1379 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2_scale)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] []))) THEN (done_tac)))));;
1380 let diff2_domain_scale = end_section_proof();;
1381 (start_section_proof [](`diff2_domain domain (\x. --f x)`));;
1382 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2_neg)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] []))) THEN (done_tac)))));;
1383 let diff2_domain_neg = end_section_proof();;
1384 (add_section_var (mk_var ("bounds", (`:real#real`))));;
1385 (start_section_proof [](`m_bounded_on_int f domain bounds ==>
1386         interval_not_zero bounds ==> diff2_domain domain (inv o f)`));;
1387 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN ((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] [])))) THEN (move ["d2f"]) THEN (move ["ineq"]) THEN (move ["n0"]) THEN (move ["x"]) THEN (move ["x_in"]))))));;
1388 refine (by (VALID (((((USE_THM_THEN diff2_inv_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN interval_arith_not_zero)(fun fst_th ->(fun thm_tac -> (USE_THEN "ineq")(fun fst_th ->(USE_THEN "x_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1389 let diff2_domain_inv_compose = end_section_proof();;
1390 (start_section_proof [](`m_bounded_on_int f domain bounds ==>
1391         interval_pos bounds ==> diff2_domain domain (sqrt o f)`));;
1392 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN ((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] [])))) THEN (move ["d2f"]) THEN (move ["ineq"]) THEN (move ["n0"]) THEN (move ["x"]) THEN (move ["x_in"]))))));;
1393 refine (by (VALID (((((USE_THM_THEN diff2_sqrt_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN interval_arith_pos)(fun fst_th ->(fun thm_tac -> (USE_THEN "ineq")(fun fst_th ->(USE_THEN "x_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1394 let diff2_domain_sqrt_compose = end_section_proof();;
1395 (start_section_proof [](`diff2_domain domain (atn o f)`));;
1396 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2_atn_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] []))) THEN (done_tac)))));;
1397 let diff2_domain_atn_compose = end_section_proof();;
1398 (start_section_proof [](`m_bounded_on_int f domain bounds ==>
1399         iabs bounds < &1 ==> diff2_domain domain (acs o f)`));;
1400 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN ((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] [])))) THEN (move ["d2f"]) THEN (move ["ineq"]) THEN (move ["n0"]) THEN (move ["x"]) THEN (move ["x_in"]))))));;
1401 refine (by (VALID (((((USE_THM_THEN diff2_acs_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN interval_arith_abs)(fun fst_th ->(fun thm_tac -> (USE_THEN "ineq")(fun fst_th ->(USE_THEN "x_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1402 let diff2_domain_acs_compose = end_section_proof();;
1403 (add_section_hyp "d2g" (`diff2_domain domain g`));;
1404 (start_section_proof [](`diff2_domain domain (\x. f x + g x)`));;
1405 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["d2g"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2_add)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1406 let diff2_domain_add = end_section_proof();;
1407 (start_section_proof [](`diff2_domain domain (\x. f x - g x)`));;
1408 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["d2g"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2_sub)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1409 let diff2_domain_sub = end_section_proof();;
1410 (start_section_proof [](`diff2_domain domain (\x. f x * g x)`));;
1411 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["d2g"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2_mul)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1412 let diff2_domain_mul = end_section_proof();;
1413 let diff2_domain_mul = finalize_theorem diff2_domain_mul;;
1414 let diff2_domain_sub = finalize_theorem diff2_domain_sub;;
1415 let diff2_domain_add = finalize_theorem diff2_domain_add;;
1416 let diff2_domain_acs_compose = finalize_theorem diff2_domain_acs_compose;;
1417 let diff2_domain_atn_compose = finalize_theorem diff2_domain_atn_compose;;
1418 let diff2_domain_sqrt_compose = finalize_theorem diff2_domain_sqrt_compose;;
1419 let diff2_domain_inv_compose = finalize_theorem diff2_domain_inv_compose;;
1420 let diff2_domain_neg = finalize_theorem diff2_domain_neg;;
1421 let diff2_domain_scale = finalize_theorem diff2_domain_scale;;
1422 (end_section "Domain");;
1423 (begin_section "SecondPartial");;
1424 (start_section_proof ["f";"x"](`diff2 f x ==> (lift o f) differentiable at x`));;
1425 refine (by (VALID (((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
1426 let diff2_imp_diff = end_section_proof();;
1427 (start_section_proof ["f";"i";"x"](`diff2 f x ==> (lift o partial i f) differentiable at x`));;
1428 refine (by (VALID (((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
1429 let diff2_imp_partial_diff = end_section_proof();;
1430 (start_section_proof ["s";"f";"g";"i";"x"](`(lift o f) differentiable at x ==>
1431         open s ==> x IN s ==> (!y:real^N. y IN s ==> f y = g y) ==>
1432         partial i f x = partial i g x`));;
1433 refine (by (VALID (((BETA_TAC THEN (move ["df"]) THEN (move ["open_s"]) THEN (move ["xs"]) THEN (move ["eq"])) THEN repeat_tactic 1 9 (((USE_THM_THEN partial)(new_rewrite [] [])))))));;
1434 refine (by (VALID (((((USE_THM_THEN derivative_unique)MP_TAC) THEN (clear_assumption "derivative_unique") THEN (DISCH_THEN apply_tac)) THEN (((USE_THM_THEN Arc_properties.HAS_REAL_DERIVATIVE_LOCAL)MP_TAC) THEN (clear_assumption "Arc_properties.HAS_REAL_DERIVATIVE_LOCAL") THEN (DISCH_THEN apply_tac))))));;
1435 refine (by (VALID (((exists_tac (`g o (\t. x + t % basis i)`)) THEN (split_tac)))));;
1436 refine (by (VALID (((((USE_THM_THEN has_derivative_alt)MP_TAC) THEN (clear_assumption "has_derivative_alt") THEN (DISCH_THEN apply_tac)) THEN ((USE_THM_THEN diff_imp_real_diff) apply_tac) THEN (((USE_THM_THEN diff_direction)(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])))))));;
1437 refine (by (VALID (((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN differentiable_local_at)(ISPEC_THEN (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])]))) thm_tac))(ISPEC_THEN (`lift o f`) thm_tac)) apply_tac))));;
1438 refine (by (VALID ((((simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN ((USE_THEN "open_s")(new_rewrite [] [])) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["y"]) THEN (move ["ys"])))));;
1439 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN ((USE_THEN "eq")(new_rewrite [] []))) THEN (done_tac)))));;
1440 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN open_contains_open_interval)(fun fst_th ->(USE_THEN "open_s")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(ISPEC_THEN (`basis i:real^N`) thm_tac))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["a"])) THEN (case THEN (move ["b"])) THEN (case THEN (move ["ab0"]))) THEN (((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN (move ["sub"]))))));;
1441 refine (by (VALID (((exists_tac (`real_interval (a, b)`)) THEN ((((USE_THEN "ab0")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_OPEN_REAL_INTERVAL)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["y"]) THEN (move ["y_in"]))))));;
1442 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THEN "eq")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "sub")(new_rewrite [] [])) THEN ((USE_THM_THEN IN_IMAGE)(new_rewrite [] [])) THEN (simp_tac)) THEN (exists_tac (mk_var("y",mk_type("real",[])))) THEN (done_tac)))));;
1443 let partial_local = end_section_proof();;
1444 (add_section_var (mk_var ("i", (`:num`))); add_section_var (mk_var ("j", (`:num`))));;
1445 (start_section_proof ["f";"c"](`diff2 f x ==> partial2 i j (\x. c * f x) x = c * partial2 i j f x`));;
1446 refine (by (VALID (((BETA_TAC THEN (move ["d2f"])) THEN (repeat_tactic 1 9 (((USE_THM_THEN partial2)(new_rewrite [] []))) THEN ((USE_THM_THEN partial_scale)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN diff2_imp_partial_diff)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])))))));;
1447 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]))))));;
1448 refine (by (VALID ((((USE_THM_THEN partial_local) apply_tac) THEN (exists_tac (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])])))) THEN (((USE_THEN "open_s")(new_rewrite [] [])) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_scale)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CMUL)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] []))))))));;
1449 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN ((USE_THEN "df")(new_rewrite [] [])) THEN (done_tac)))));;
1450 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (move ["ys"])) THEN (((USE_THM_THEN partial_scale)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] [])))) THEN (done_tac)))));;
1451 let second_partial_scale = end_section_proof();;
1452 (start_section_proof ["f"](`diff2 f x ==> partial2 i j (\x. --f x) x = --partial2 i j f x`));;
1453 refine (by (VALID ((((DISCH_THEN (fun snd_th -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN second_partial_scale)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`--(&1)`) thm_tac))(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_NEG_MINUS1)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
1454 let second_partial_neg = end_section_proof();;
1455 (start_section_proof ["f";"g"](`diff2 f x ==> diff2 g x ==> 
1456         partial2 i j (\x. f x + g x) x = partial2 i j f x + partial2 i j g x`));;
1457 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]) THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["ys"])) THEN (move ["dg"])))));;
1458 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN partial2)(new_rewrite [] []))) THEN ((USE_THM_THEN partial_add)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] []))) THEN ((USE_THM_THEN partial_local) apply_tac)))));;
1459 refine (by (VALID (((exists_tac (`s INTER t`)) THEN (((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN ((USE_THEN "ys")(new_rewrite [] [])))))));;
1460 refine (by (VALID ((((USE_THM_THEN f_lift_add)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1461 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN (((USE_THEN "df")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] [])))) THEN (done_tac)))));;
1462 refine (by (VALID (((BETA_TAC THEN (move ["z"]) THEN (case THEN ((move ["zs"]) THEN (move ["zt"])))) THEN (((USE_THM_THEN partial_add)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] [])))) THEN (done_tac)))));;
1463 let second_partial_add = end_section_proof();;
1464 (start_section_proof ["f";"g"](`diff2 f x ==> diff2 g x ==> 
1465         partial2 i j (\x. f x - g x) x = partial2 i j f x - partial2 i j g x`));;
1466 refine (by (VALID (((BETA_TAC THEN (move ["d2f"]) THEN (move ["d2g"])) THEN (((USE_THM_THEN real_sub)(new_rewrite [] [])) THEN ((USE_THM_THEN second_partial_add)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN diff2_neg)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN second_partial_neg)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN real_sub)(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac)))));;
1467 let second_partial_sub = end_section_proof();;
1468 (start_section_proof ["f";"g"](`diff2 f x ==> diff2 g x ==> 
1469         partial2 i j (\x. f x * g x) x = (partial2 i j f x * g x + partial j f x * partial i g x) +
1470                 (partial i f x * partial j g x + f x * partial2 i j g x)`));;
1471 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]) THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["ys"])) THEN (move ["dg"])))));;
1472 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN partial2)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN partial_mul)(GSYM_THEN (new_rewrite [] [])))) THEN repeat_tactic 0 10 (((USE_THM_THEN partial_add)(GSYM_THEN (new_rewrite [] [])))) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 0 1 (((USE_THM_THEN EQ_SYM_EQ)(new_rewrite [] [])))))));;
1473 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN differentiable_mul)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] [])))) THEN (done_tac)))));;
1474 refine (by (VALID (((USE_THM_THEN partial_local) apply_tac))));;
1475 refine (by (VALID (((exists_tac (`s INTER t`)) THEN (((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN ((USE_THEN "ys")(new_rewrite [] [])))))));;
1476 refine (by (VALID ((((USE_THM_THEN f_lift_add)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1477 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN repeat_tactic 1 9 (((USE_THM_THEN differentiable_mul)(new_rewrite [] []))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] [])))) THEN (done_tac)))));;
1478 refine (by (VALID (((BETA_TAC THEN (move ["z"]) THEN (case THEN ((move ["zs"]) THEN (move ["zt"])))) THEN (((USE_THM_THEN partial_mul)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "dg")(new_rewrite [] [])))) THEN (done_tac)))));;
1479 let second_partial_mul = end_section_proof();;
1480 (start_section_proof ["f";"u"](`diff2 f x ==> nth_diff_strong 2 u (f x) ==>
1481         partial2 i j (u o f) x = (nth_derivative 2 u (f x) * partial i f x) * partial j f x +
1482                                 derivative u (f x) * partial2 i j f x`));;
1483 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN diff2)(new_rewrite [] []))) THEN ((USE_THM_THEN nth_diff_strong2_eq)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"]) THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["fxt"])) THEN (move ["du"])))));;
1484 refine (by (VALID ((set_tac "r" (`{z | z IN s /\ (lift o f) z IN (IMAGE lift t)}`)))));;
1485 refine (by (VALID ((have_tac (move ["open_r"]) (`open r`)))));;
1486 refine (by (VALID ((((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN CONTINUOUS_OPEN_PREIMAGE)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_OPEN)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "open_t")(new_rewrite [] [])) THEN ((USE_THEN "open_s")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andbT)(new_rewrite [] [])))))));;
1487 refine (by (VALID ((((USE_THM_THEN DIFFERENTIABLE_IMP_CONTINUOUS_ON) apply_tac) THEN (((USE_THM_THEN differentiable_on)(new_rewrite [] [])) THEN (move ["y"]) THEN (move ["ys"])) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
1488 refine (by (VALID (((((USE_THM_THEN DIFFERENTIABLE_AT_WITHIN)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
1489 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN partial2)(new_rewrite [] []))) THEN ((USE_THM_THEN nth_derivative2)(new_rewrite [] []))))));;
1490 refine (by (VALID ((((USE_THM_THEN partial_uni_compose)(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "du")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((fun thm_tac -> (USE_THM_THEN o_THM)(ISPEC_THEN (`derivative u`) thm_tac))(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN partial_mul)(GSYM_THEN (new_rewrite [] [])))))));;
1491 refine (by (VALID (((((USE_THM_THEN diff_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "du")(new_rewrite [] [])))) THEN (done_tac)))));;
1492 refine (by (VALID ((((USE_THM_THEN partial_local) apply_tac) THEN (exists_tac (mk_var("r",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])])))) THEN (((USE_THEN "open_r")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])))))));;
1493 refine (by (VALID (((THENL_ROT (-1)) ((((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN LIFT_IN_IMAGE_LIFT)(new_rewrite [] []))) THEN (split_tac))))));;
1494 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN (move ["z"])) THEN (case THEN ((case THEN (move ["zs"])) THEN (move ["fpz"]))) THEN (DISCH_THEN(new_rewrite [] []))) THEN (((USE_THM_THEN partial_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "du")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
1495 refine (by (VALID (((THENL_LAST) (split_tac) ((exists_tac (mk_var("x",mk_type("cart",[mk_type("real",[]);mk_vartype "N"])))) THEN (done_tac))))));;
1496 refine (by (VALID ((((USE_THM_THEN differentiable_local_at) apply_tac) THEN ((exists_tac (mk_var("r",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])])))) THEN (exists_tac (`lift o (\y. derivative u (f y) * partial j f y)`)))))));;
1497 refine (by (VALID ((((USE_THEN "open_r")(new_rewrite [] [])) THEN ((USE_THM_THEN differentiable_mul)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1498 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN o_THM)(ISPEC_THEN (`derivative u`) thm_tac))(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))) THEN (((USE_THM_THEN diff_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THEN "du")(new_rewrite [] []))) THEN (done_tac)))));;
1499 refine (by (VALID (((THENL_FIRST) ((((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN LIFT_IN_IMAGE_LIFT)(new_rewrite [] [])))) THEN (split_tac)) ((exists_tac (mk_var("x",mk_type("cart",[mk_type("real",[]);mk_vartype "N"])))) THEN (done_tac))))));;
1500 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN (move ["p"])) THEN (case THEN ((case THEN (move ["ps"])) THEN (move ["fpt"]))) THEN (DISCH_THEN(new_rewrite [] []))) THEN (((USE_THM_THEN partial_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "df")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "du")(new_rewrite [] [])))) THEN (done_tac)))));;
1501 let second_partial_uni_compose = end_section_proof();;
1502 let second_partial_uni_compose = finalize_theorem second_partial_uni_compose;;
1503 let second_partial_mul = finalize_theorem second_partial_mul;;
1504 let second_partial_sub = finalize_theorem second_partial_sub;;
1505 let second_partial_add = finalize_theorem second_partial_add;;
1506 let second_partial_neg = finalize_theorem second_partial_neg;;
1507 let second_partial_scale = finalize_theorem second_partial_scale;;
1508 let partial_local = finalize_theorem partial_local;;
1509 let diff2_imp_partial_diff = finalize_theorem diff2_imp_partial_diff;;
1510 let diff2_imp_diff = finalize_theorem diff2_imp_diff;;
1511 (end_section "SecondPartial");;
1512 let second_partial_uni_compose = finalize_theorem second_partial_uni_compose;;
1513 let second_partial_mul = finalize_theorem second_partial_mul;;
1514 let second_partial_sub = finalize_theorem second_partial_sub;;
1515 let second_partial_add = finalize_theorem second_partial_add;;
1516 let second_partial_neg = finalize_theorem second_partial_neg;;
1517 let second_partial_scale = finalize_theorem second_partial_scale;;
1518 let partial_local = finalize_theorem partial_local;;
1519 let diff2_imp_partial_diff = finalize_theorem diff2_imp_partial_diff;;
1520 let diff2_imp_diff = finalize_theorem diff2_imp_diff;;
1521 let diff2_domain_mul = finalize_theorem diff2_domain_mul;;
1522 let diff2_domain_sub = finalize_theorem diff2_domain_sub;;
1523 let diff2_domain_add = finalize_theorem diff2_domain_add;;
1524 let diff2_domain_acs_compose = finalize_theorem diff2_domain_acs_compose;;
1525 let diff2_domain_atn_compose = finalize_theorem diff2_domain_atn_compose;;
1526 let diff2_domain_sqrt_compose = finalize_theorem diff2_domain_sqrt_compose;;
1527 let diff2_domain_inv_compose = finalize_theorem diff2_domain_inv_compose;;
1528 let diff2_domain_neg = finalize_theorem diff2_domain_neg;;
1529 let diff2_domain_scale = finalize_theorem diff2_domain_scale;;
1530 let diff2_mul = finalize_theorem diff2_mul;;
1531 let diff2_sub = finalize_theorem diff2_sub;;
1532 let diff2_add = finalize_theorem diff2_add;;
1533 let diff2_acs_compose = finalize_theorem diff2_acs_compose;;
1534 let diff2_atn_compose = finalize_theorem diff2_atn_compose;;
1535 let diff2_sqrt_compose = finalize_theorem diff2_sqrt_compose;;
1536 let diff2_inv_compose = finalize_theorem diff2_inv_compose;;
1537 let diff2_uni_compose = finalize_theorem diff2_uni_compose;;
1538 let diff_uni_compose = finalize_theorem diff_uni_compose;;
1539 let has_derivative_uni_compose = finalize_theorem has_derivative_uni_compose;;
1540 let diff2_neg = finalize_theorem diff2_neg;;
1541 let diff2_scale = finalize_theorem diff2_scale;;
1542 let differentiable_local_at = finalize_theorem differentiable_local_at;;
1543 (end_section "Diff2Arith");;
1544 (begin_section "Diff2c");;
1545 (start_section_proof ["f";"g";"x";"s"](`g real_continuous at x ==> open s ==> x IN s ==>
1546         (!y. y IN s ==> f y = g y) ==> f real_continuous at x`));;
1547 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL real_continuous_at))(new_rewrite [] []))) THEN (move ["g_cont"]) THEN (move ["open_s"]) THEN (move ["xs"]) THEN (move ["f_eq_g"]) THEN (move ["e"]) THEN (move ["e_gt0"])))));;
1548 refine (by (VALID (((((fun thm_tac -> (USE_THM_THEN OPEN_CONTAINS_BALL)(ISPEC_THEN (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "?1460941"]);mk_type("bool",[])]))) thm_tac)) MP_TAC) THEN ALL_TAC) THEN (((USE_THEN "open_s")(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN ball)(new_rewrite [] [])) THEN ((USE_THM_THEN SUBSET)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] [])) THEN (simp_tac))))));;
1549 refine (by (VALID ((((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "xs")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["d0"])) THEN (case THEN (move ["d0_gt0"])) THEN (move ["sub_s"])))));;
1550 refine (by (VALID ((((fun thm_tac -> (USE_THEN "g_cont")(fun fst_th ->(USE_THEN "e_gt0")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["d1"])) THEN (case THEN (move ["d1_gt0"])) THEN (move ["dist_cond"])))));;
1551 refine (by (VALID ((exists_tac (`min d0 d1`)))));;
1552 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN REAL_LT_MIN)(new_rewrite [] []))) THEN ((USE_THEN "d1_gt0")(new_rewrite [] [])) THEN ((USE_THEN "d0_gt0")(new_rewrite [] [])) THEN (simp_tac)) THEN (move ["y"]) THEN (case THEN ((move ["yd0"]) THEN (move ["yd1"])))))));;
1553 refine (by (VALID ((repeat_tactic 1 9 (((USE_THEN "f_eq_g")(new_rewrite [] []))) THEN ((TRY done_tac))))));;
1554 refine (by (VALID (((((USE_THEN "sub_s")(new_rewrite [] [])) THEN ((USE_THM_THEN DIST_SYM)(new_rewrite [] []))) THEN (exists_tac (mk_var("y",mk_type("cart",[mk_type("real",[]);mk_vartype "?1460941"])))) THEN (done_tac)))));;
1555 refine (by (VALID ((((USE_THEN "dist_cond")MP_TAC) THEN (clear_assumption "dist_cond") THEN (exact_tac)))));;
1556 let real_cont_at_local = end_section_proof();;
1557 (start_section_proof ["v";"u";"t";"x"](`v real_continuous atreal x ==> real_open t ==> x IN t ==>
1558         (!y. y IN t ==> u y = v y) ==> u real_continuous atreal x`));;
1559 refine (by (VALID (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS_ATREAL))(new_rewrite [] []))))));;
1560 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] [])))) THEN ((USE_THM_THEN REAL_OPEN)(new_rewrite [] []))) THEN (move ["vc"]) THEN (move ["open_t"]) THEN (move ["xt"]) THEN (move ["v_eq_u"])))));;
1561 refine (by (VALID (((USE_THM_THEN real_cont_at_local) apply_tac))));;
1562 refine (by (VALID (((exists_tac (`v o drop`)) THEN (exists_tac (`IMAGE lift t`))))));;
1563 refine (by (VALID ((((((USE_THEN "open_t")(new_rewrite [] [])) THEN ((USE_THEN "vc")(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN LIFT_IN_IMAGE_LIFT)(new_rewrite [] [])) THEN ((USE_THEN "xt")(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN IN_IMAGE_LIFT_DROP)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] [])))) THEN (move ["y"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "v_eq_u")(MATCH_MP_THEN snd_th MP_TAC)))) THEN (done_tac)))));;
1564 let real_cont_atreal_local = end_section_proof();;
1565 (add_section_type (mk_var ("f", (`:real^N -> real`))); add_section_type (mk_var ("g", (`:real^N -> real`))));;
1566 (add_section_var (mk_var ("x", (`:real^N`))));;
1567 (add_section_var (mk_var ("domain", (`:real^N#real^N`))));;
1568 (begin_section "Point");;
1569 (start_section_proof ["f";"c"](`diff2c f x ==> diff2c (\x. c * f x) x`));;
1570 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN diff2c)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN ((move ["d2f"]) THEN (move ["p2c"])))) THEN ((((USE_THM_THEN diff2_scale)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["j"]))))));;
1571 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "p2c")(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] [])))) THEN (move ["p2ij"]))))));;
1572 refine (by (VALID (((USE_THM_THEN real_cont_at_local) apply_tac))));;
1573 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["d2s"]))))));;
1574 refine (by (VALID (((exists_tac (`(\x. c * partial2 j i f x)`)) THEN (exists_tac (mk_var("s",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])]))))))));;
1575 refine (by (VALID (((THENL_FIRST) ((USE_THM_THEN REAL_CONTINUOUS_LMUL)(new_rewrite [] [])) (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac))))));;
1576 refine (by (VALID (((((USE_THEN "open_s")(new_rewrite [] [])) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN (simp_tac)) THEN (move ["y"]) THEN (DISCH_THEN (fun snd_th -> (USE_THEN "d2s")(MATCH_MP_THEN snd_th MP_TAC))) THEN (move ["d2y"])))));;
1577 refine (by (VALID ((((USE_THM_THEN second_partial_scale)(new_rewrite [] [])) THEN (done_tac)))));;
1578 let diff2c_scale = end_section_proof();;
1579 (start_section_proof ["f"](`diff2c f x ==> diff2c (\x. --f x) x`));;
1580 refine (by (VALID ((((DISCH_THEN (fun snd_th -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN diff2c_scale)(ISPEC_THEN (mk_var("f",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`--(&1)`) thm_tac))(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC) THEN ((USE_THM_THEN REAL_NEG_MINUS1)(GSYM_THEN (new_rewrite [] []))) THEN (done_tac)))));;
1581 let diff2c_neg = end_section_proof();;
1582 (begin_section "Composite");;
1583 (start_section_proof ["n";"u";"x"](`nth_diff_strong n u x ==>
1584         ?s. real_open s /\ x IN s /\ (!y. y IN s ==> nth_diff_strong n u y)`));;
1585 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN nth_diff_strong)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["xt"])) THEN (move ["dt"])))));;
1586 refine (by (VALID (((exists_tac (mk_var("t",mk_type("fun",[mk_type("real",[]);mk_type("bool",[])])))) THEN ((((USE_THEN "xt")(new_rewrite [] [])) THEN ((USE_THEN "open_t")(new_rewrite [] [])) THEN (simp_tac)) THEN (move ["y"]) THEN (move ["yt"]))))));;
1587 refine (by (VALID (((exists_tac (mk_var("t",mk_type("fun",[mk_type("real",[]);mk_type("bool",[])])))) THEN (done_tac)))));;
1588 let nth_diff_strong_eq_on_open = end_section_proof();;
1589 (start_section_proof ["f";"x"](`diff2 f x ==> f real_continuous at x`));;
1590 refine (by (VALID ((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
1591 refine (by (VALID (((((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_IMP_CONTINUOUS_AT)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
1592 let diff2_imp_cont = end_section_proof();;
1593 (start_section_proof ["f";"i";"x"](`diff2 f x ==> (partial i f) real_continuous at x`));;
1594 refine (by (VALID ((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["df"])))));;
1595 refine (by (VALID (((((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_IMP_CONTINUOUS_AT)(new_rewrite [] [])) THEN ((USE_THEN "df")(new_rewrite [] []))) THEN (done_tac)))));;
1596 let diff2_imp_partial_cont = end_section_proof();;
1597 (start_section_proof ["u";"f";"x"](`diff2c f x ==> nth_diff_strong 2 u (f x) ==>
1598         (nth_derivative 2 u) real_continuous atreal (f x) ==> diff2c (u o f) x`));;
1599 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN diff2c)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["d2f"])) THEN (move ["p2c"]) THEN (move ["d2u"]) THEN (move ["u2c"])))));;
1600 refine (by (VALID (((((USE_THM_THEN diff2_uni_compose)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2u")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["j"])))));;
1601 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "p2c")(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] [])))) THEN (move ["p2ij"]))))));;
1602 refine (by (VALID (((USE_THM_THEN real_cont_at_local) apply_tac))));;
1603 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["d2s"]))))));;
1604 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN nth_diff_strong_eq_on_open)(fun fst_th ->(USE_THEN "d2u")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["fxt"])) THEN (move ["d2t"])))));;
1605 refine (by (VALID ((set_tac "r" (`{z | z IN s /\ (lift o f) z IN (IMAGE lift t)}`)))));;
1606 refine (by (VALID ((have_tac (move ["open_r"]) (`open r`)))));;
1607 refine (by (VALID ((((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN CONTINUOUS_OPEN_PREIMAGE)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_OPEN)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "open_t")(new_rewrite [] [])) THEN ((USE_THEN "open_s")(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andbT)(new_rewrite [] [])))))));;
1608 refine (by (VALID ((((USE_THM_THEN DIFFERENTIABLE_IMP_CONTINUOUS_ON) apply_tac) THEN (((USE_THM_THEN differentiable_on)(new_rewrite [] [])) THEN (move ["y"]) THEN (move ["ys"])) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
1609 refine (by (VALID (((USE_THM_THEN DIFFERENTIABLE_AT_WITHIN)(new_rewrite [] [])))));;
1610 refine (by (VALID (((((fun thm_tac -> (USE_THEN "d2s")(fun fst_th ->(USE_THEN "ys")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN diff2)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s'"])) THEN (case THEN (move ["_"])) THEN (case THEN (move ["ys'"])))))));;
1611 refine (by (VALID (((((fun thm_tac -> DISCH_THEN (fun fst_th ->(USE_THEN "ys'")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (simp_tac)) THEN (done_tac)))));;
1612 refine (by (VALID (((exists_tac (`(\x. (nth_derivative 2 u (f x) * partial j f x) * partial i f x + derivative u (f x) * partial2 j i f x)`)) THEN (exists_tac (mk_var("r",mk_type("fun",[mk_type("cart",[mk_type("real",[]);mk_vartype "N"]);mk_type("bool",[])]))))))));;
1613 refine (by (VALID (((THENL_ROT (-1)) ((((USE_THEN "open_r")(new_rewrite [] [])) THEN ((USE_THEN "r_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN LIFT_IN_IMAGE_LIFT)(new_rewrite [] []))) THEN (split_tac))))));;
1614 refine (by (VALID ((BETA_TAC THEN (move ["y"]) THEN (case THEN (move ["z"])) THEN (case THEN ALL_TAC) THEN (case THEN (move ["zs"])) THEN (move ["fzt"]) THEN (move ["yz"])))));;
1615 refine (by (VALID (((((USE_THM_THEN second_partial_uni_compose)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "yz")(new_rewrite [] [])) THEN ((USE_THEN "d2s")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "d2t")(new_rewrite [] []))) THEN (done_tac)))));;
1616 refine (by (VALID (((THENL_LAST) (split_tac) ((exists_tac (mk_var("x",mk_type("cart",[mk_type("real",[]);mk_vartype "N"])))) THEN (done_tac))))));;
1617 refine (by (VALID (((((USE_THM_THEN REAL_CONTINUOUS_ADD)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_CONTINUOUS_MUL)(new_rewrite [] []))) THEN ((simp_tac THEN TRY done_tac))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (repeat_tactic 0 10 (((fun thm_tac ->(USE_THM_THEN diff2_imp_partial_cont)(fun tmp_th1 -> (USE_THEN "d2s")(fun tmp_th2 -> thm_tac (CONJ tmp_th1 tmp_th2))))(new_rewrite [] []))) THEN ((TRY done_tac)))))));;
1618 refine (by (VALID (((((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(GSYM_THEN (new_rewrite [] [(`nth_derivative 2 u _1`)])))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
1619 refine (by (VALID (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(new_rewrite [] [])))));;
1620 refine (by (VALID ((((USE_THM_THEN o_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN CONTINUOUS_REAL_CONTINUOUS_AT_COMPOSE)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_imp_cont)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2s")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
1621 refine (by (VALID (((((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_CONTINUOUS_ATREAL_WITHINREAL)(new_rewrite [] []))) THEN (done_tac)))));;
1622 refine (by (VALID (((((USE_THEN "p2ij")(new_rewrite [] [])) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(GSYM_THEN (new_rewrite [] [(`derivative u _`)])))) THEN ((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th]))))));;
1623 refine (by (VALID (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(new_rewrite [] [])))));;
1624 refine (by (VALID ((((USE_THM_THEN o_ASSOC)(new_rewrite [] [])) THEN ((USE_THM_THEN CONTINUOUS_REAL_CONTINUOUS_AT_COMPOSE)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_imp_cont)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2s")(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
1625 refine (by (VALID ((((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_CONTINUOUS_ATREAL_WITHINREAL)(new_rewrite [] []))))));;
1626 refine (by (VALID ((((USE_THM_THEN nth_derivative1)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN nth_derivative_continuous) apply_tac)))));;
1627 refine (by (VALID (((THENL_LAST) ((exists_tac (`2`)) THEN (split_tac)) ((arith_tac) THEN (done_tac))))));;
1628 refine (by (VALID (((((fun thm_tac -> (USE_THEN "d2t")(fun fst_th ->(USE_THEN "fxt")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN ((((USE_THM_THEN nth_diff_strong)(new_rewrite [] [])) THEN ((USE_THM_THEN nth_differentiable_on)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN (move ["t'"])) THEN (case THEN (move ["_"])) THEN (case THEN (move ["fxt'"])) THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
1629 let diff2c_uni_compose = end_section_proof();;
1630 (start_section_proof ["s";"x"](`real_open s ==> real_open (s DELETE x)`));;
1631 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN REAL_OPEN)(new_rewrite [] []))) THEN (DISCH_THEN (fun snd_th -> (USE_THM_THEN OPEN_DELETE)(MATCH_MP_THEN snd_th MP_TAC))) THEN ((fun thm_tac -> DISCH_THEN (ISPEC_THEN (`lift x`) thm_tac))MP_TAC)))));;
1632 refine (by (VALID (((((USE_THM_THEN IMAGE_DELETE_INJ)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN LIFT_EQ)(new_rewrite [] [])))) THEN (done_tac)))));;
1633 let real_open_delete = end_section_proof();;
1634 (start_section_proof ["f"](`~(f x = &0) ==> diff2c f x ==> diff2c (inv o f) x`));;
1635 refine (by (VALID (((BETA_TAC THEN (move ["fn0"]) THEN (move ["d2f"])) THEN ((USE_THM_THEN diff2c_uni_compose)(new_rewrite [] []))))));;
1636 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN diff2_inv)(fun fst_th ->(USE_THEN "fn0")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN (simp_tac)))));;
1637 refine (by (VALID ((((USE_THM_THEN real_cont_atreal_local)MP_TAC) THEN (clear_assumption "real_cont_atreal_local") THEN (DISCH_THEN apply_tac)))));;
1638 refine (by (VALID (((exists_tac (`\x. &2 * inv (x pow 3)`)) THEN (exists_tac (`UNIV DELETE (&0)`))))));;
1639 refine (by (VALID (((THENL_ROT (-1)) ((((USE_THM_THEN real_open_delete)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_OPEN_UNIV)(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_DELETE)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_UNIV)(new_rewrite [] []))) THEN ((USE_THEN "fn0")(new_rewrite [] [])) THEN (simp_tac)) THEN (split_tac))))));;
1640 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (move ["yn0"])) THEN ((USE_THM_THEN second_derivative_inv)(new_rewrite [] [])) THEN (done_tac)))));;
1641 refine (by (VALID ((((USE_THM_THEN REAL_CONTINUOUS_LMUL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_INV_ATREAL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_POW)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_CONTINUOUS_AT_ID)(new_rewrite [] [])))))));;
1642 refine (by (VALID ((((USE_THM_THEN REAL_POW_NZ)(new_rewrite [] [])) THEN (done_tac)))));;
1643 let diff2c_inv_compose = end_section_proof();;
1644 (start_section_proof ["f"](`&0 < f x ==> diff2c f x ==> diff2c (sqrt o f) x`));;
1645 refine (by (VALID (((BETA_TAC THEN (move ["fn0"]) THEN (move ["d2f"])) THEN ((USE_THM_THEN diff2c_uni_compose)(new_rewrite [] []))))));;
1646 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN diff2_sqrt)(fun fst_th ->(USE_THEN "fn0")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN (simp_tac)))));;
1647 refine (by (VALID ((((USE_THM_THEN real_cont_atreal_local)MP_TAC) THEN (clear_assumption "real_cont_atreal_local") THEN (DISCH_THEN apply_tac)))));;
1648 refine (by (VALID (((exists_tac (`\x. -- inv (&4 * sqrt (x pow 3))`)) THEN (exists_tac (`{x | x > &0}`))))));;
1649 refine (by (VALID (((THENL_ROT (-1)) ((((USE_THM_THEN REAL_OPEN_HALFSPACE_GT)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN real_gt)(new_rewrite [] [])))) THEN (split_tac))))));;
1650 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN (move ["z"])) THEN (case THEN (move ["z0"])) THEN (DISCH_THEN(new_rewrite [] []))) THEN ((USE_THM_THEN second_derivative_sqrt)(new_rewrite [] [])) THEN (done_tac)))));;
1651 refine (by (VALID (((THENL_LAST) (split_tac) ((exists_tac (`f x`)) THEN (done_tac))))));;
1652 refine (by (VALID (((THENL_ROT (-1)) (((USE_THM_THEN REAL_CONTINUOUS_NEG)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_INV_ATREAL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_LMUL)(new_rewrite [] [])))))));;
1653 refine (by (VALID (((THENL_FIRST) ((((USE_THM_THEN REAL_ENTIRE)(new_rewrite [] [])) THEN ((USE_THM_THEN negb_or)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (split_tac)) ((arith_tac) THEN (done_tac))))));;
1654 refine (by (VALID ((((USE_THM_THEN SQRT_EQ_0)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_POW_NZ)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_POS_NZ)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_POW_LE)(new_rewrite [] []))))));;
1655 refine (by (VALID (((((USE_THEN "fn0")MP_TAC) THEN (clear_assumption "fn0") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1656 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`(\x. sqrt (x pow 3)) = (sqrt o (\x. x pow 3))`)))));;
1657 refine (by (VALID (((((USE_THM_THEN FUN_EQ_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
1658 refine (by (VALID ((((USE_THM_THEN REAL_CONTINUOUS_ATREAL_COMPOSE)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN REAL_CONTINUOUS_POW)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_CONTINUOUS_AT_ID)(new_rewrite [] []))) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))))));;
1659 refine (by (VALID (((((USE_THM_THEN REAL_CONTINUOUS_AT_SQRT)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_POW_LT)(new_rewrite [] []))) THEN (done_tac)))));;
1660 let diff2c_sqrt_compose = end_section_proof();;
1661 (start_section_proof ["f"](`diff2c f x ==> diff2c (atn o f) x`));;
1662 refine (by (VALID (((BETA_TAC THEN (move ["d2f"])) THEN ((USE_THM_THEN diff2c_uni_compose)(new_rewrite [] []))))));;
1663 refine (by (VALID ((((USE_THM_THEN diff2_atn)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN nth_derivative2)(new_rewrite [] [])) THEN ((USE_THM_THEN second_derivative_atn)(new_rewrite [] []))))));;
1664 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN REAL_CONTINUOUS_MUL)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_CONTINUOUS_CONST)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_CONTINUOUS_AT_ID)(new_rewrite [] []))) THEN ((simp_tac THEN TRY done_tac))))));;
1665 refine (by (VALID ((((USE_THM_THEN REAL_CONTINUOUS_POW)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_INV_ATREAL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1666 refine (by (VALID (((((USE_THM_THEN REAL_CONTINUOUS_CONST)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_POW)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_CONTINUOUS_AT_ID)(new_rewrite [] [])))) THEN (done_tac)))));;
1667 refine (by (VALID (((USE_THM_THEN REAL_RNEG_UNIQ)(new_rewrite [] [])))));;
1668 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN REAL_LE_POW_2)(ISPEC_THEN (`f x`) thm_tac)) MP_TAC) THEN ALL_TAC))));;
1669 refine (by (VALID (((arith_tac) THEN (done_tac)))));;
1670 let diff2c_atn_compose = end_section_proof();;
1671 (start_section_proof ["f"](`abs (f x) < &1 ==> diff2c f x ==> diff2c (acs o f) x`));;
1672 refine (by (VALID (((BETA_TAC THEN (move ["fn1"]) THEN (move ["d2f"])) THEN ((USE_THM_THEN diff2c_uni_compose)(new_rewrite [] []))))));;
1673 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN diff2_acs)(fun fst_th ->(USE_THEN "fn1")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN (simp_tac)))));;
1674 refine (by (VALID ((((USE_THM_THEN real_cont_atreal_local)MP_TAC) THEN (clear_assumption "real_cont_atreal_local") THEN (DISCH_THEN apply_tac)))));;
1675 refine (by (VALID (((exists_tac (`\x. --(x / sqrt ((&1 - x * x) pow 3))`)) THEN (exists_tac (`{x | x < &1} INTER {x | x > -- &1}`))))));;
1676 refine (by (VALID ((((USE_THM_THEN REAL_OPEN_INTER)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_OPEN_HALFSPACE_GT)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_OPEN_HALFSPACE_LT)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
1677 refine (by (VALID (((THENL_ROT (-1)) ((repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_ELIM_THM)(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 1 9 (((USE_THM_THEN real_gt)(new_rewrite [] [])))) THEN (split_tac))))));;
1678 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN ALL_TAC) THEN (case THEN (move ["a"])) THEN (case THEN (move ["a1"])) THEN (DISCH_THEN(new_rewrite [] [])) THEN (case THEN (move ["b"])) THEN (case THEN (move ["b1"])) THEN (move ["ab"])) THEN (((USE_THM_THEN second_derivative_acs)(new_rewrite [] [])) THEN ((TRY done_tac)))))));;
1679 refine (by (VALID (((((USE_THEN "a1")MP_TAC) THEN (clear_assumption "a1") THEN ((USE_THEN "b1")MP_TAC) THEN (clear_assumption "b1") THEN ((USE_THEN "ab")MP_TAC) THEN (clear_assumption "ab") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1680 refine (by (VALID (((THENL_LAST) (split_tac) ((split_tac) THEN (exists_tac (`f x`)) THEN (((USE_THEN "fn1")MP_TAC) THEN (clear_assumption "fn1") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
1681 refine (by (VALID (((USE_THM_THEN REAL_CONTINUOUS_NEG)(new_rewrite [] [])))));;
1682 refine (by (VALID (((USE_THM_THEN REAL_CONTINUOUS_DIV_ATREAL) apply_tac))));;
1683 refine (by (VALID ((have_tac (move ["h"]) (`&0 < (&1 - f x * f x) pow 3`)))));;
1684 refine (by (VALID (((USE_THM_THEN REAL_POW_LT)(new_rewrite [] [])))));;
1685 refine (by (VALID ((((USE_THM_THEN (REAL_ARITH `!a. &1 - a * a = (&1 - a) * (&1 + a)`))(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LT_MUL)(new_rewrite [] []))))));;
1686 refine (by (VALID (((((USE_THEN "fn1")MP_TAC) THEN (clear_assumption "fn1") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1687 refine (by (VALID (((THENL_ROT (-1)) ((((USE_THM_THEN REAL_CONTINUOUS_AT_ID)(new_rewrite [] [])) THEN (simp_tac)) THEN (split_tac))))));;
1688 refine (by (VALID (((((USE_THM_THEN SQRT_EQ_0)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_LE_LT)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_LT_IMP_NZ)(new_rewrite [] []))) THEN (done_tac)))));;
1689 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`(\x. sqrt ((&1 - x * x) pow 3)) = sqrt o (\x. (&1 - x * x) pow 3)`)))));;
1690 refine (by (VALID (((((USE_THM_THEN FUN_EQ_THM)(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
1691 refine (by (VALID ((((USE_THM_THEN REAL_CONTINUOUS_ATREAL_COMPOSE)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_AT_SQRT)(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))))));;
1692 refine (by (VALID ((((USE_THM_THEN REAL_CONTINUOUS_POW)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_SUB)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_CONST)(new_rewrite [] []))))));;
1693 refine (by (VALID (((((USE_THM_THEN REAL_CONTINUOUS_MUL)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_CONTINUOUS_AT_ID)(new_rewrite [] [])))) THEN (done_tac)))));;
1694 let diff2c_acs_compose = end_section_proof();;
1695 let diff2c_acs_compose = finalize_theorem diff2c_acs_compose;;
1696 let diff2c_atn_compose = finalize_theorem diff2c_atn_compose;;
1697 let diff2c_sqrt_compose = finalize_theorem diff2c_sqrt_compose;;
1698 let diff2c_inv_compose = finalize_theorem diff2c_inv_compose;;
1699 let real_open_delete = finalize_theorem real_open_delete;;
1700 let diff2c_uni_compose = finalize_theorem diff2c_uni_compose;;
1701 let diff2_imp_partial_cont = finalize_theorem diff2_imp_partial_cont;;
1702 let diff2_imp_cont = finalize_theorem diff2_imp_cont;;
1703 let nth_diff_strong_eq_on_open = finalize_theorem nth_diff_strong_eq_on_open;;
1704 (end_section "Composite");;
1705 (start_section_proof ["f";"g"](`diff2c f x ==> diff2c g x ==> diff2c (\x. f x + g x) x`));;
1706 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN diff2c)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN ((move ["d2f"]) THEN (move ["p2f"]))) THEN (case THEN ((move ["d2g"]) THEN (move ["p2g"])))) THEN ((((USE_THM_THEN diff2_add)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["j"]))))));;
1707 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "p2g")(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))MP_TAC) THEN ((fun thm_tac -> (fun thm_tac -> (USE_THEN "p2f")(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] [])))) THEN (move ["p2fij"]) THEN (move ["p2gij"]))))));;
1708 refine (by (VALID (((USE_THM_THEN real_cont_at_local) apply_tac))));;
1709 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["d2f"]))))));;
1710 refine (by (VALID ((((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["xt"])) THEN (move ["d2g"])))));;
1711 refine (by (VALID (((exists_tac (`(\x. partial2 j i f x + partial2 j i g x)`)) THEN (exists_tac (`s INTER t`))))));;
1712 refine (by (VALID (((THENL_FIRST) (repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN ((USE_THEN "xt")(new_rewrite [] [])) THEN ((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac)) THEN ((USE_THM_THEN REAL_CONTINUOUS_ADD)(new_rewrite [] [])) THEN (simp_tac)) (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac))))));;
1713 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN ((move ["ys"]) THEN (move ["yt"])))) THEN (((USE_THM_THEN second_partial_add)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1714 let diff2c_add = end_section_proof();;
1715 (start_section_proof ["f";"g"](`diff2c f x ==> diff2c g x ==> diff2c (\x. f x - g x) x`));;
1716 refine (by (VALID (((BETA_TAC THEN (move ["d2f"]) THEN (move ["d2g"])) THEN (((USE_THM_THEN real_sub)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_add)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN diff2c_neg)(new_rewrite [] []))) THEN (done_tac)))));;
1717 let diff2c_sub = end_section_proof();;
1718 (start_section_proof ["f";"g"](`diff2c f x ==> diff2c g x ==> diff2c (\x. f x * g x) x`));;
1719 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN diff2c)(new_rewrite [] []))) THEN ALL_TAC THEN (case THEN ((move ["d2f"]) THEN (move ["p2f"]))) THEN (case THEN ((move ["d2g"]) THEN (move ["p2g"])))) THEN ((((USE_THM_THEN diff2_mul)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andTb)(new_rewrite [] []))) THEN (move ["i"]) THEN (move ["j"]))))));;
1720 refine (by (VALID (((((fun thm_tac -> (fun thm_tac -> (USE_THEN "p2g")(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))MP_TAC) THEN ((fun thm_tac -> (fun thm_tac -> (USE_THEN "p2f")(ISPEC_THEN (mk_var("i",mk_type("num",[]))) thm_tac))(ISPEC_THEN (mk_var("j",mk_type("num",[]))) thm_tac))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] [])))) THEN (move ["p2fij"]) THEN (move ["p2gij"]))))));;
1721 refine (by (VALID (((USE_THM_THEN real_cont_at_local) apply_tac))));;
1722 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["s"])) THEN (case THEN (move ["open_s"])) THEN (case THEN (move ["xs"])) THEN (move ["d2f"]))))));;
1723 refine (by (VALID ((((USE_THM_THEN diff2_eq_diff2_on_open)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["t"])) THEN (case THEN (move ["open_t"])) THEN (case THEN (move ["xt"])) THEN (move ["d2g"])))));;
1724 refine (by (VALID (((exists_tac (`(\x. (partial2 j i f x * g x + partial i f x * partial j g x) + 
1725         partial j f x  * partial i g x + f x * partial2 j i g x)`)) THEN (exists_tac (`s INTER t`))))));;
1726 refine (by (VALID (((THENL_ROT (-1)) ((repeat_tactic 1 9 (((USE_THM_THEN IN_INTER)(new_rewrite [] []))) THEN ((USE_THEN "xs")(new_rewrite [] [])) THEN ((USE_THEN "xt")(new_rewrite [] [])) THEN ((USE_THM_THEN OPEN_INTER)(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))) THEN (split_tac))))));;
1727 refine (by (VALID (((BETA_TAC THEN (move ["y"]) THEN (case THEN ((move ["ys"]) THEN (move ["yt"])))) THEN (((USE_THM_THEN second_partial_mul)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1728 refine (by (VALID (((repeat_tactic 1 9 (((USE_THM_THEN REAL_CONTINUOUS_ADD)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_CONTINUOUS_MUL)(new_rewrite [] [])))) THEN (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN ((TRY done_tac))) THEN (repeat_tactic 0 10 (((USE_THEN "p2gij")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "p2fij")(new_rewrite [] []))) THEN (simp_tac) THEN repeat_tactic 0 10 (((USE_THM_THEN diff2_imp_partial_cont)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN diff2_imp_cont)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1729 let diff2c_mul = end_section_proof();;
1730 let diff2c_mul = finalize_theorem diff2c_mul;;
1731 let diff2c_sub = finalize_theorem diff2c_sub;;
1732 let diff2c_add = finalize_theorem diff2c_add;;
1733 let diff2c_acs_compose = finalize_theorem diff2c_acs_compose;;
1734 let diff2c_atn_compose = finalize_theorem diff2c_atn_compose;;
1735 let diff2c_sqrt_compose = finalize_theorem diff2c_sqrt_compose;;
1736 let diff2c_inv_compose = finalize_theorem diff2c_inv_compose;;
1737 let real_open_delete = finalize_theorem real_open_delete;;
1738 let diff2c_uni_compose = finalize_theorem diff2c_uni_compose;;
1739 let diff2_imp_partial_cont = finalize_theorem diff2_imp_partial_cont;;
1740 let diff2_imp_cont = finalize_theorem diff2_imp_cont;;
1741 let nth_diff_strong_eq_on_open = finalize_theorem nth_diff_strong_eq_on_open;;
1742 let diff2c_neg = finalize_theorem diff2c_neg;;
1743 let diff2c_scale = finalize_theorem diff2c_scale;;
1744 (end_section "Point");;
1745 (begin_section "Domain");;
1746 (add_section_var (mk_var ("f", (`:real^N -> real`))); add_section_var (mk_var ("g", (`:real^N -> real`))));;
1747 (add_section_hyp "d2f" (`diff2c_domain domain f`));;
1748 (start_section_proof ["c"](`diff2c_domain domain (\x. c * f x)`));;
1749 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2c_scale)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] []))) THEN (done_tac)))));;
1750 let diff2c_domain_scale = end_section_proof();;
1751 (start_section_proof [](`diff2c_domain domain (\x. --f x)`));;
1752 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2c_neg)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] []))) THEN (done_tac)))));;
1753 let diff2c_domain_neg = end_section_proof();;
1754 (add_section_var (mk_var ("bounds", (`:real#real`))));;
1755 (start_section_proof [](`m_bounded_on_int f domain bounds ==>
1756         interval_not_zero bounds ==> diff2c_domain domain (inv o f)`));;
1757 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN ((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] [])))) THEN (move ["d2f"]) THEN (move ["ineq"]) THEN (move ["n0"]) THEN (move ["x"]) THEN (move ["x_in"]))))));;
1758 refine (by (VALID (((((USE_THM_THEN diff2c_inv_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN interval_arith_not_zero)(fun fst_th ->(fun thm_tac -> (USE_THEN "ineq")(fun fst_th ->(USE_THEN "x_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1759 let diff2c_domain_inv_compose = end_section_proof();;
1760 (start_section_proof [](`m_bounded_on_int f domain bounds ==>
1761         interval_pos bounds ==> diff2c_domain domain (sqrt o f)`));;
1762 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN ((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] [])))) THEN (move ["d2f"]) THEN (move ["ineq"]) THEN (move ["n0"]) THEN (move ["x"]) THEN (move ["x_in"]))))));;
1763 refine (by (VALID (((((USE_THM_THEN diff2c_sqrt_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN interval_arith_pos)(fun fst_th ->(fun thm_tac -> (USE_THEN "ineq")(fun fst_th ->(USE_THEN "x_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1764 let diff2c_domain_sqrt_compose = end_section_proof();;
1765 (start_section_proof [](`diff2c_domain domain (atn o f)`));;
1766 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2c_atn_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] []))) THEN (done_tac)))));;
1767 let diff2c_domain_atn_compose = end_section_proof();;
1768 (start_section_proof [](`m_bounded_on_int f domain bounds ==>
1769         iabs bounds < &1 ==> diff2c_domain domain (acs o f)`));;
1770 refine (by (VALID (((((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN ((((USE_THM_THEN m_bounded_on_int)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] [])))) THEN (move ["d2f"]) THEN (move ["ineq"]) THEN (move ["n0"]) THEN (move ["x"]) THEN (move ["x_in"]))))));;
1771 refine (by (VALID (((((USE_THM_THEN diff2c_acs_compose)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN ((fun thm_tac -> (USE_THM_THEN interval_arith_abs)(fun fst_th ->(fun thm_tac -> (USE_THEN "ineq")(fun fst_th ->(USE_THEN "x_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] []))) THEN (done_tac)))));;
1772 let diff2c_domain_acs_compose = end_section_proof();;
1773 (add_section_hyp "d2g" (`diff2c_domain domain g`));;
1774 (start_section_proof [](`diff2c_domain domain (\x. f x + g x)`));;
1775 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["d2g"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2c_add)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1776 let diff2c_domain_add = end_section_proof();;
1777 (start_section_proof [](`diff2c_domain domain (\x. f x - g x)`));;
1778 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["d2g"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2c_sub)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1779 let diff2c_domain_sub = end_section_proof();;
1780 (start_section_proof [](`diff2c_domain domain (\x. f x * g x)`));;
1781 refine (by (VALID (((((USE_THEN "d2g")MP_TAC) THEN (clear_assumption "d2g") THEN ((USE_THEN "d2f")MP_TAC) THEN (clear_assumption "d2f") THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN diff2c_domain)(new_rewrite [] []))) THEN (move ["d2f"]) THEN (move ["d2g"]) THEN (move ["x"]) THEN (move ["x_in"])) THEN (((USE_THM_THEN diff2c_mul)(new_rewrite [] [])) THEN ((USE_THEN "d2f")(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "d2g")(new_rewrite [] [])))) THEN (done_tac)))));;
1782 let diff2c_domain_mul = end_section_proof();;
1783 let diff2c_domain_mul = finalize_theorem diff2c_domain_mul;;
1784 let diff2c_domain_sub = finalize_theorem diff2c_domain_sub;;
1785 let diff2c_domain_add = finalize_theorem diff2c_domain_add;;
1786 let diff2c_domain_acs_compose = finalize_theorem diff2c_domain_acs_compose;;
1787 let diff2c_domain_atn_compose = finalize_theorem diff2c_domain_atn_compose;;
1788 let diff2c_domain_sqrt_compose = finalize_theorem diff2c_domain_sqrt_compose;;
1789 let diff2c_domain_inv_compose = finalize_theorem diff2c_domain_inv_compose;;
1790 let diff2c_domain_neg = finalize_theorem diff2c_domain_neg;;
1791 let diff2c_domain_scale = finalize_theorem diff2c_domain_scale;;
1792 (end_section "Domain");;
1793 let diff2c_domain_mul = finalize_theorem diff2c_domain_mul;;
1794 let diff2c_domain_sub = finalize_theorem diff2c_domain_sub;;
1795 let diff2c_domain_add = finalize_theorem diff2c_domain_add;;
1796 let diff2c_domain_acs_compose = finalize_theorem diff2c_domain_acs_compose;;
1797 let diff2c_domain_atn_compose = finalize_theorem diff2c_domain_atn_compose;;
1798 let diff2c_domain_sqrt_compose = finalize_theorem diff2c_domain_sqrt_compose;;
1799 let diff2c_domain_inv_compose = finalize_theorem diff2c_domain_inv_compose;;
1800 let diff2c_domain_neg = finalize_theorem diff2c_domain_neg;;
1801 let diff2c_domain_scale = finalize_theorem diff2c_domain_scale;;
1802 let diff2c_mul = finalize_theorem diff2c_mul;;
1803 let diff2c_sub = finalize_theorem diff2c_sub;;
1804 let diff2c_add = finalize_theorem diff2c_add;;
1805 let diff2c_acs_compose = finalize_theorem diff2c_acs_compose;;
1806 let diff2c_atn_compose = finalize_theorem diff2c_atn_compose;;
1807 let diff2c_sqrt_compose = finalize_theorem diff2c_sqrt_compose;;
1808 let diff2c_inv_compose = finalize_theorem diff2c_inv_compose;;
1809 let real_open_delete = finalize_theorem real_open_delete;;
1810 let diff2c_uni_compose = finalize_theorem diff2c_uni_compose;;
1811 let diff2_imp_partial_cont = finalize_theorem diff2_imp_partial_cont;;
1812 let diff2_imp_cont = finalize_theorem diff2_imp_cont;;
1813 let nth_diff_strong_eq_on_open = finalize_theorem nth_diff_strong_eq_on_open;;
1814 let diff2c_neg = finalize_theorem diff2c_neg;;
1815 let diff2c_scale = finalize_theorem diff2c_scale;;
1816 let real_cont_atreal_local = finalize_theorem real_cont_atreal_local;;
1817 let real_cont_at_local = finalize_theorem real_cont_at_local;;
1818 (end_section "Diff2c");;
1819 (begin_section "M_LinApprox");;
1820 (add_section_var (mk_var ("f", (`:real^N -> real`))); add_section_var (mk_var ("g", (`:real^N -> real`))));;
1821 (add_section_var (mk_var ("bounds", (`:real#real`))));;
1822 (add_section_var (mk_var ("d_bounds_list", (`:(real#real)list`))));;
1823 (add_section_var (mk_var ("x", (`:real^N`))));;
1824 (start_section_proof [](`(lift o f) differentiable at x ==>
1825         interval_arith (--f x) bounds ==>
1826         all_n 1 d_bounds_list (\i int. interval_arith (--partial i f x) int) ==>
1827         m_lin_approx (\x. --f x) x bounds d_bounds_list`));;
1828 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["b"]) THEN (move ["db"])))));;
1829 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN m_lin_approx)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "b")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_neg)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_NEG)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))) (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac))))));;
1830 refine (by (VALID (((ASM_SIMP_TAC[partial_neg]) THEN (done_tac)))));;
1831 let m_lin_approx_neg = end_section_proof();;
1832 (start_section_proof ["c"](`(lift o f) differentiable at x ==>
1833         interval_arith (c * f x) bounds ==>
1834         all_n 1 d_bounds_list (\i int. interval_arith (c * partial i f x) int) ==>
1835         m_lin_approx (\x. c * f x) x bounds d_bounds_list`));;
1836 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["bH"]) THEN (move ["dbH"])))));;
1837 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN m_lin_approx)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "bH")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_scale)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_CMUL)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))) (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac))))));;
1838 refine (by (VALID (((ASM_SIMP_TAC[partial_scale]) THEN (done_tac)))));;
1839 let m_lin_approx_scale = end_section_proof();;
1840 (start_section_proof [](`(lift o f) differentiable at x ==>
1841         (lift o g) differentiable at x ==>
1842         interval_arith (f x + g x) bounds ==>
1843         all_n 1 d_bounds_list (\i int. interval_arith (partial i f x + partial i g x) int) ==>
1844         m_lin_approx (\x. f x + g x) x bounds d_bounds_list`));;
1845 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dg"]) THEN (move ["bH"]) THEN (move ["dbH"])))));;
1846 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN m_lin_approx)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "bH")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_add)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_ADD)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))) (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac))))));;
1847 refine (by (VALID (((ASM_SIMP_TAC[partial_add]) THEN (done_tac)))));;
1848 let m_lin_approx_add = end_section_proof();;
1849 (start_section_proof [](`(lift o f) differentiable at x ==>
1850         (lift o g) differentiable at x ==>
1851         interval_arith (f x - g x) bounds ==>
1852         all_n 1 d_bounds_list (\i int. interval_arith (partial i f x - partial i g x) int) ==>
1853         m_lin_approx (\x. f x - g x) x bounds d_bounds_list`));;
1854 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dg"]) THEN (move ["bH"]) THEN (move ["dbH"])))));;
1855 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN m_lin_approx)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "bH")(new_rewrite [] [])) THEN ((USE_THM_THEN f_lift_sub)(new_rewrite [] [])) THEN ((USE_THM_THEN DIFFERENTIABLE_SUB)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN andTb)(new_rewrite [] [])))) (((USE_THM_THEN ETA_AX)(fun th -> ONCE_REWRITE_TAC[th])) THEN (done_tac))))));;
1856 refine (by (VALID (((ASM_SIMP_TAC[partial_sub]) THEN (done_tac)))));;
1857 let m_lin_approx_sub = end_section_proof();;
1858 (start_section_proof [](`(lift o f) differentiable at x ==>
1859         (lift o g) differentiable at x ==>
1860         interval_arith (f x * g x) bounds ==>
1861         all_n 1 d_bounds_list (\i int. interval_arith (partial i f x * g x + f x * partial i g x) int) ==>
1862         m_lin_approx (\x. f x * g x) x bounds d_bounds_list`));;
1863 refine (by (VALID ((BETA_TAC THEN (move ["df"]) THEN (move ["dg"]) THEN (move ["bH"]) THEN (move ["dbH"])))));;
1864 refine (by (VALID ((((USE_THM_THEN m_lin_approx)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "bH")(new_rewrite [] [])) THEN ((USE_THM_THEN differentiable_mul)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))))));;
1865 refine (by (VALID (((ASM_SIMP_TAC[partial_mul]) THEN (done_tac)))));;
1866 let m_lin_approx_mul = end_section_proof();;
1867 let m_lin_approx_mul = finalize_theorem m_lin_approx_mul;;
1868 let m_lin_approx_sub = finalize_theorem m_lin_approx_sub;;
1869 let m_lin_approx_add = finalize_theorem m_lin_approx_add;;
1870 let m_lin_approx_scale = finalize_theorem m_lin_approx_scale;;
1871 let m_lin_approx_neg = finalize_theorem m_lin_approx_neg;;
1872 (end_section "M_LinApprox");;
1873 let second_bounded = new_definition `second_bounded f domain dd_bounds_list <=>
1874         !x. x IN interval [domain] ==> all_n 1 dd_bounds_list
1875                 (\i list_i. all_n 1 list_i (\j int. interval_arith (partial2 j i f x) int))`;;
1876 let m_taylor_interval = 
1877         new_definition `m_taylor_interval f domain y w f_bounds d_bounds_list dd_bounds_list <=>
1878                 m_cell_domain domain y w /\
1879                 diff2c_domain domain f /\
1880                 m_lin_approx f y f_bounds d_bounds_list /\
1881                 second_bounded f domain dd_bounds_list`;;
1882 (begin_section "M_TaylorIntervalArith");;
1883 (add_section_var (mk_var ("f", (`:real^N -> real`))); add_section_var (mk_var ("g", (`:real^N -> real`))));;
1884 (add_section_var (mk_var ("x", (`:real^N`))); add_section_var (mk_var ("z", (`:real^N`))); add_section_var (mk_var ("y", (`:real^N`))); add_section_var (mk_var ("w", (`:real^N`))));;
1885 (add_section_var (mk_var ("domain", (`:real^N#real^N`))));;
1886 (add_section_var (mk_var ("f_bounds", (`:real#real`))); add_section_var (mk_var ("g_bounds", (`:real#real`))); add_section_var (mk_var ("bounds", (`:real#real`))));;
1887 (add_section_var (mk_var ("df_bounds_list", (`:(real#real)list`))); add_section_var (mk_var ("dg_bounds_list", (`:(real#real)list`))); add_section_var (mk_var ("d_bounds_list", (`:(real#real)list`))));;
1888 (add_section_var (mk_var ("ddf_bounds_list", (`:((real#real)list)list`))); add_section_var (mk_var ("ddg_bounds_list", (`:((real#real)list)list`))); add_section_var (mk_var ("dd_bounds_list", (`:((real#real)list)list`))));;
1889 (add_section_hyp "domainH" (`m_cell_domain domain y w`));;
1890 (add_section_hyp "d2f" (`diff2c_domain domain f`));;
1891 (start_section_proof [](`m_bounded_on_int f domain f_bounds ==> interval_not_zero f_bounds ==>
1892         m_lin_approx (inv o f) y bounds d_bounds_list ==>
1893         second_bounded (inv o f) domain dd_bounds_list ==>
1894         m_taylor_interval (inv o f) domain y w bounds d_bounds_list dd_bounds_list`));;
1895 refine (by (VALID (((BETA_TAC THEN (move ["bf"]) THEN (move ["fn0"]) THEN (move ["lin"]) THEN (move ["second"])) THEN ((USE_THM_THEN m_taylor_interval)(new_rewrite [] []))))));;
1896 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN diff2c_domain_inv_compose)(fun fst_th ->(USE_THEN "d2f")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "bf")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN (done_tac)))));;
1897 let m_taylor_inv_compose = end_section_proof();;
1898 (start_section_proof [](`m_bounded_on_int f domain f_bounds ==> interval_pos f_bounds ==>
1899         m_lin_approx (sqrt o f) y bounds d_bounds_list ==>
1900         second_bounded (sqrt o f) domain dd_bounds_list ==>
1901         m_taylor_interval (sqrt o f) domain y w bounds d_bounds_list dd_bounds_list`));;
1902 refine (by (VALID (((BETA_TAC THEN (move ["bf"]) THEN (move ["fn0"]) THEN (move ["lin"]) THEN (move ["second"])) THEN ((USE_THM_THEN m_taylor_interval)(new_rewrite [] []))))));;
1903 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN diff2c_domain_sqrt_compose)(fun fst_th ->(USE_THEN "d2f")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "bf")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN (done_tac)))));;
1904 let m_taylor_sqrt_compose = end_section_proof();;
1905 (start_section_proof [](`m_lin_approx (atn o f) y bounds d_bounds_list ==>
1906         second_bounded (atn o f) domain dd_bounds_list ==>
1907         m_taylor_interval (atn o f) domain y w bounds d_bounds_list dd_bounds_list`));;
1908 refine (by (VALID (((BETA_TAC THEN (move ["lin"]) THEN (move ["second"])) THEN (((USE_THM_THEN m_taylor_interval)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_domain_atn_compose)(new_rewrite [] []))) THEN (done_tac)))));;
1909 let m_taylor_atn_compose = end_section_proof();;
1910 (start_section_proof [](`m_bounded_on_int f domain f_bounds ==> iabs f_bounds < &1 ==>
1911         m_lin_approx (acs o f) y bounds d_bounds_list ==>
1912         second_bounded (acs o f) domain dd_bounds_list ==>
1913         m_taylor_interval (acs o f) domain y w bounds d_bounds_list dd_bounds_list`));;
1914 refine (by (VALID (((BETA_TAC THEN (move ["bf"]) THEN (move ["fn0"]) THEN (move ["lin"]) THEN (move ["second"])) THEN ((USE_THM_THEN m_taylor_interval)(new_rewrite [] []))))));;
1915 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (USE_THM_THEN diff2c_domain_acs_compose)(fun fst_th ->(USE_THEN "d2f")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(fun fst_th ->(USE_THEN "bf")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))(new_rewrite [] [])) THEN (done_tac)))));;
1916 let m_taylor_acs_compose = end_section_proof();;
1917 (start_section_proof [](`m_lin_approx (\x. --f x) y bounds d_bounds_list ==>
1918         second_bounded (\x. --f x) domain dd_bounds_list ==>
1919         m_taylor_interval (\x. --f x) domain y w bounds d_bounds_list dd_bounds_list`));;
1920 refine (by (VALID (((BETA_TAC THEN (move ["lin"]) THEN (move ["second"])) THEN (((USE_THM_THEN m_taylor_interval)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_domain_neg)(new_rewrite [] []))) THEN (done_tac)))));;
1921 let m_taylor_neg = end_section_proof();;
1922 (start_section_proof ["c"](`m_lin_approx (\x. c * f x) y bounds d_bounds_list ==>
1923         second_bounded (\x. c * f x) domain dd_bounds_list ==>
1924         m_taylor_interval (\x. c * f x) domain y w bounds d_bounds_list dd_bounds_list`));;
1925 refine (by (VALID (((BETA_TAC THEN (move ["lin"]) THEN (move ["second"])) THEN (((USE_THM_THEN m_taylor_interval)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_domain_scale)(new_rewrite [] []))) THEN (done_tac)))));;
1926 let m_taylor_scale = end_section_proof();;
1927 (add_section_hyp "d2g" (`diff2c_domain domain g`));;
1928 (start_section_proof [](`m_lin_approx (\x. f x + g x) y bounds d_bounds_list ==>
1929         second_bounded (\x. f x + g x) domain dd_bounds_list ==>
1930         m_taylor_interval (\x. f x + g x) domain y w bounds d_bounds_list dd_bounds_list`));;
1931 refine (by (VALID (((BETA_TAC THEN (move ["lin"]) THEN (move ["second"])) THEN (((USE_THM_THEN m_taylor_interval)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_domain_add)(new_rewrite [] []))) THEN (done_tac)))));;
1932 let m_taylor_add = end_section_proof();;
1933 (start_section_proof [](`m_lin_approx (\x. f x - g x) y bounds d_bounds_list ==>
1934         second_bounded (\x. f x - g x) domain dd_bounds_list ==>
1935         m_taylor_interval (\x. f x - g x) domain y w bounds d_bounds_list dd_bounds_list`));;
1936 refine (by (VALID (((BETA_TAC THEN (move ["lin"]) THEN (move ["second"])) THEN (((USE_THM_THEN m_taylor_interval)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_domain_sub)(new_rewrite [] []))) THEN (done_tac)))));;
1937 let m_taylor_sub = end_section_proof();;
1938 (start_section_proof [](`m_lin_approx (\x. f x * g x) y bounds d_bounds_list ==>
1939         second_bounded (\x. f x * g x) domain dd_bounds_list ==>
1940         m_taylor_interval (\x. f x * g x) domain y w bounds d_bounds_list dd_bounds_list`));;
1941 refine (by (VALID (((BETA_TAC THEN (move ["lin"]) THEN (move ["second"])) THEN (((USE_THM_THEN m_taylor_interval)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_domain_mul)(new_rewrite [] []))) THEN (done_tac)))));;
1942 let m_taylor_mul = end_section_proof();;
1943 let m_taylor_mul = finalize_theorem m_taylor_mul;;
1944 let m_taylor_sub = finalize_theorem m_taylor_sub;;
1945 let m_taylor_add = finalize_theorem m_taylor_add;;
1946 let m_taylor_scale = finalize_theorem m_taylor_scale;;
1947 let m_taylor_neg = finalize_theorem m_taylor_neg;;
1948 let m_taylor_acs_compose = finalize_theorem m_taylor_acs_compose;;
1949 let m_taylor_atn_compose = finalize_theorem m_taylor_atn_compose;;
1950 let m_taylor_sqrt_compose = finalize_theorem m_taylor_sqrt_compose;;
1951 let m_taylor_inv_compose = finalize_theorem m_taylor_inv_compose;;
1952 (end_section "M_TaylorIntervalArith");;
1953 (begin_section "PartialConvex");;
1954 (add_section_type (mk_var ("f", (`:real^N->real`))));;
1955 (start_section_proof ["f";"j";"x";"z";"u";"v";"hi"](`(!i. i IN 1..dimindex (:N) ==> ~(i = j) ==> u$i = z$i /\ v$i = x$i) ==>
1956         u$j = x$j ==> v$j = z$j ==>
1957         diff2_domain (x,z) f ==>
1958         (!y. y IN interval [x,z] ==> &0 <= partial2 j j f y) ==>
1959         (!y. y IN interval [x,u] ==> f y <= hi) ==>
1960         (!y. y IN interval [v,z] ==> f y <= hi) ==>
1961         (!y. y IN interval [x,z] ==> f y <= hi)`));;
1962 refine (by (VALID ((((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (move ["uv_eq"]) THEN (move ["ux_eq"]) THEN (move ["vz_eq"])))));;
1963 refine (by (VALID ((((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN (move ["diff2_f"]) THEN (move ["partial2_pos"]) THEN (move ["bound1"]) THEN (move ["bound2"]) THEN (move ["y"]) THEN (move ["y_in"])))));;
1964 refine (by (VALID ((set_tac "y1" (`(lambda i. if i = j then x$j else y$i):real^N`)))));;
1965 refine (by (VALID ((set_tac "y2" (`(lambda i. if i = j then z$j else y$i):real^N`)))));;
1966 refine (by (VALID (((((USE_THEN "y_in")MP_TAC) THEN (clear_assumption "y_in") THEN BETA_TAC) THEN (((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] [])) THEN (move ["y_in"]))))));;
1967 refine (by (VALID ((have_tac (ALL_TAC THEN (case THEN ((move ["y1_in"]) THEN (move ["y2_in"])))) (`y1 IN interval [x,u] /\ y2 IN interval [v,z]`)))));;
1968 refine (by (VALID ((((USE_THEN "y1_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "y2_def")(GSYM_THEN (new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] [])))))));;
1969 refine (by (VALID ((((split_tac) THEN (move ["i"]) THEN (move ["i_ineq"])) THEN (((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN ((TRY done_tac))) THEN (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`i = j`) thm_tac))MP_TAC) THEN case THEN (simp_tac) THEN (move ["ij"])) THEN (repeat_tactic 0 10 (((fun thm_tac ->(USE_THEN "ux_eq")(fun tmp_th1 -> (USE_THEN "vz_eq")(fun tmp_th2 -> thm_tac (CONJ tmp_th1 tmp_th2))))(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN ((TRY done_tac))) THEN (((USE_THEN "uv_eq")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THEN "y_in")(new_rewrite [] [])))) THEN (done_tac)))));;
1970 refine (by (VALID ((((THENL_ROT (-1)) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`j IN 1..dimindex (:N)`) thm_tac))MP_TAC) THEN case)) THEN (((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (move ["j_in"]))))));;
1971 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac ALL_TAC (`y1 = y`))) ((BETA_TAC THEN (DISCH_THEN(GSYM_THEN (new_rewrite [] [])))) THEN (((USE_THEN "bound1")MP_TAC) THEN (clear_assumption "bound1") THEN (DISCH_THEN apply_tac)) THEN (done_tac))))));;
1972 refine (by (VALID ((((USE_THM_THEN CART_EQ)(new_rewrite [] [])) THEN (move ["i"]) THEN (move ["i_in"])))));;
1973 refine (by (VALID (((THENL_FIRST) (have_tac (move ["inj"]) (`~(i = j)`)) ((((USE_THEN "i_in")MP_TAC) THEN (clear_assumption "i_in") THEN ((USE_THEN "j_in")MP_TAC) THEN (clear_assumption "j_in") THEN BETA_TAC) THEN (arith_tac) THEN (done_tac))))));;
1974 refine (by (VALID (((((USE_THEN "y1_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] []))) THEN (done_tac)))));;
1975 refine (by (VALID ((((THENL_ROT 1)) (have_tac ALL_TAC (`f y <= max (f y1) (f y2)`))))));;
1976 refine (by (VALID ((BETA_TAC THEN (move ["cond"])))));;
1977 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS))(fun fst_th ->(USE_THEN "cond")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN (DISCH_THEN apply_tac)))));;
1978 refine (by (VALID (((((fun thm_tac -> (USE_THEN "bound2")(fun fst_th ->(USE_THEN "y2_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN ((fun thm_tac -> (USE_THEN "bound1")(fun fst_th ->(USE_THEN "y1_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (arith_tac) THEN (done_tac)))));;
1979 refine (by (VALID ((set_tac "g" (`f o (\t. y1 + t % basis j)`)))));;
1980 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`f y1 = g (&0)`)))));;
1981 refine (by (VALID (((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_MUL_LZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_ADD_RID)(new_rewrite [] []))) THEN (done_tac)))));;
1982 refine (by (VALID ((have_tac (move ["y_eq"]) (`y = y1 + (y$j - x$j) % basis j /\ y2 = y1 + (z$j - x$j) % basis j`)))));;
1983 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN CART_EQ)(new_rewrite [] []))) THEN ((split_tac) THEN (move ["i"]) THEN (move ["i_in"])) THEN (((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN ((TRY done_tac))) THEN (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`i = j`) thm_tac))MP_TAC) THEN case THEN (simp_tac) THEN (move ["ij"])) THEN (repeat_tactic 0 10 (((fun thm_tac ->(USE_THEN "y1_def")(fun tmp_th1 -> (USE_THEN "y2_def")(fun tmp_th2 -> thm_tac (CONJ tmp_th1 tmp_th2))))(GSYM_THEN (new_rewrite [] [])))) THEN repeat_tactic 1 9 (((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] []))) THEN ((simp_tac THEN TRY done_tac)) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_SUB_ADD2)(new_rewrite [] []))) THEN ((TRY done_tac)))))));;
1984 refine (by (VALID (((((USE_THEN "ij")(new_rewrite [] [])) THEN (simp_tac)) THEN (arith_tac) THEN (done_tac)))));;
1985 refine (by (VALID (((((USE_THEN "ij")(new_rewrite [] [])) THEN (simp_tac)) THEN (arith_tac) THEN (done_tac)))));;
1986 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`f y = g (y$j - x$j)`)) ((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "y_eq")(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac))))));;
1987 refine (by (VALID (((THENL_FIRST) (have_tac (DISCH_THEN(new_rewrite [] [])) (`f y2 = g (z$j - x$j)`)) ((((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THEN "y_eq")(GSYM_THEN (new_rewrite [] [])))) THEN (done_tac))))));;
1988 refine (by (VALID ((((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`z$j = x$j`) thm_tac))MP_TAC) THEN case THEN (move ["zx_j"])))));;
1989 refine (by (VALID (((THENL_FIRST) (((THENL_ROT 1)) (have_tac ALL_TAC (`y$j = x$j`))) ((BETA_TAC THEN (DISCH_THEN(new_rewrite [] []))) THEN (((USE_THEN "zx_j")(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_SUB_REFL)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac))))));;
1990 refine (by (VALID (((((fun thm_tac -> (USE_THEN "y_in")(fun fst_th ->(USE_THEN "j_in")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN ((USE_THEN "zx_j")(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac)))));;
1991 refine (by (VALID ((set_tac "t" (`(y$j - x$j) / (z$j - x$j)`)))));;
1992 refine (by (VALID ((have_tac (move ["zx_pos"]) (`&0 < z$j - x$j`)))));;
1993 refine (by (VALID ((((USE_THM_THEN (REAL_ARITH `!a b. &0 < a - b <=> ~(a = b) /\ b <= a`))(new_rewrite [] [])) THEN ((USE_THEN "zx_j")(new_rewrite [] [])) THEN (simp_tac)))));;
1994 refine (by (VALID (((((USE_THM_THEN REAL_LE_TRANS)MP_TAC) THEN (clear_assumption "REAL_LE_TRANS") THEN (DISCH_THEN apply_tac)) THEN (exists_tac (`y$j`)) THEN repeat_tactic 1 9 (((USE_THEN "y_in")(new_rewrite [] []))) THEN (done_tac)))));;
1995 refine (by (VALID ((have_tac (move ["t_props"]) (`&0 <= t /\ t <= &1 /\ y$j - x$j = (&1 - t) * &0 + t * (z$j - x$j)`)))));;
1996 refine (by (VALID ((((USE_THEN "t_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN Packing3.REAL_DIV_LE_1)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_MUL_RZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ADD_LID)(new_rewrite [] []))))));;
1997 refine (by (VALID ((((USE_THM_THEN real_div)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL REAL_MUL_ASSOC))(GSYM_THEN (new_rewrite [] [])))))));;
1998 refine (by (VALID ((((USE_THM_THEN REAL_MUL_LINV)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_SUB_0)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN REAL_MUL_RID)(new_rewrite [] [])) THEN (simp_tac)))));;
1999 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN real_sub)(new_rewrite [] []))) THEN ((USE_THM_THEN REAL_LE_RADD)(new_rewrite [] [])) THEN ((USE_THEN "y_in")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN real_sub)(GSYM_THEN (new_rewrite [] []))))))));;
2000 refine (by (VALID (((THENL_FIRST) (((USE_THM_THEN REAL_LE_MUL)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_LE_INV)(new_rewrite [] []))) (((USE_THM_THEN (REAL_ARITH `!a. &0 < a ==> &0 <= a`))(new_rewrite [] [])) THEN (done_tac))))));;
2001 refine (by (VALID (((((USE_THM_THEN REAL_SUB_LE)(new_rewrite [] [])) THEN ((USE_THEN "y_in")(new_rewrite [] []))) THEN (done_tac)))));;
2002 refine (by (VALID ((((USE_THEN "t_props")(new_rewrite [] [])) THEN (((USE_THM_THEN (GEN_ALL REAL_CONVEX_LOWER))MP_TAC) THEN (DISCH_THEN apply_tac))))));;
2003 refine (by (VALID ((exists_tac (`real_interval [&0, z$j - x$j]`)))));;
2004 refine (by (VALID ((((USE_THM_THEN REAL_SUB_ADD)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_SUB_LE)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THEN "t_props")(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))) THEN (simp_tac)))));;
2005 refine (by (VALID ((((USE_THM_THEN (REAL_ARITH `!a. &0 < a ==> &0 <= a`))(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN andbT)(new_rewrite [] []))))));;
2006 refine (by (VALID (((set_tac "s" (`real_interval _`)) THEN (((USE_THEN "t_props")MP_TAC) THEN (clear_assumption "t_props") THEN ((USE_THEN "t_def")MP_TAC) THEN (clear_assumption "t_def") THEN BETA_TAC THEN (move ["_"]) THEN (move ["_"]))))));;
2007 refine (by (VALID ((have_tac (move ["in_s"]) (`!t. t IN s ==> y1 + t % basis j IN interval [x,z]`)))));;
2008 refine (by (VALID (((((USE_THEN "s_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL IN_INTERVAL))(new_rewrite [] []))) THEN (move ["t"]) THEN (move ["t_ineq"]) THEN (move ["i"]) THEN (move ["i_ineq"])))));;
2009 refine (by (VALID ((repeat_tactic 1 9 (((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] []))) THEN ((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN ((TRY done_tac))))));;
2010 refine (by (VALID ((((USE_THEN "y1_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN (GEN_ALL LAMBDA_BETA))(new_rewrite [] [])) THEN ((simp_tac THEN TRY done_tac))))));;
2011 refine (by (VALID (((THENL_ROT (-1)) (((fun thm_tac -> (USE_THM_THEN EXCLUDED_MIDDLE)(ISPEC_THEN (`i = j`) thm_tac))MP_TAC) THEN case THEN (simp_tac) THEN (move ["ij"]))))));;
2012 refine (by (VALID (((((USE_THM_THEN REAL_MUL_RZERO)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_ADD_RID)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THEN "y_in")(new_rewrite [] [])))) THEN (done_tac)))));;
2013 refine (by (VALID (((((USE_THEN "t_ineq")MP_TAC) THEN (clear_assumption "t_ineq") THEN ((fun thm_tac -> (USE_THEN "y_in")(fun fst_th ->(USE_THEN "i_ineq")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN ((USE_THEN "ij")(new_rewrite [] [])) THEN (arith_tac) THEN (done_tac)))));;
2014 refine (by (VALID ((have_tac (move ["diff2_g"]) (`!t. t IN s ==> nth_diff_strong 2 g t`)))));;
2015 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["ts"])) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN (((USE_THM_THEN diff2_dir)(new_rewrite [] [])) THEN ((USE_THEN "diff2_f")(new_rewrite [] [])) THEN ((USE_THEN "in_s")(new_rewrite [] []))) THEN (done_tac)))));;
2016 refine (by (VALID ((have_tac (move ["dg"]) (`!t. t IN s ==> derivative g t = partial j f (y1 + t % basis j)`)))));;
2017 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["ts"])) THEN ((USE_THM_THEN partial)(new_rewrite [] []))))));;
2018 refine (by (VALID (((((fun thm_tac -> (USE_THEN "in_s")(fun fst_th ->(USE_THEN "ts")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC THEN (move ["p_in"])) THEN (set_tac "h" (`f o _`))))));;
2019 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`h = g o (\t'. t + t')`)))));;
2020 refine (by (VALID ((((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "h_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] [])))) THEN (move ["r"])) THEN (repeat_tactic 1 9 (((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (simp_tac))))));;
2021 refine (by (VALID (((((USE_THM_THEN (GEN_ALL VECTOR_ADD_RDISTRIB))(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL VECTOR_ADD_ASSOC))(new_rewrite [] []))) THEN (done_tac)))));;
2022 refine (by (VALID ((((USE_THM_THEN derivative_translation)(GSYM_THEN (new_rewrite [] []))) THEN ((TRY done_tac))))));;
2023 refine (by (VALID (((((fun thm_tac -> (USE_THEN "diff2_g")(fun fst_th ->(USE_THEN "ts")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN nth_diff_strong2_eq)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["e"])) THEN (case THEN (move ["_"])) THEN (case THEN (move ["te"])) THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
2024 refine (by (VALID ((have_tac (move ["d2g"]) (`!t. t IN s ==> nth_derivative 2 g t = partial2 j j f (y1 + t % basis j)`)))));;
2025 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["ts"])) THEN (((USE_THEN "g_def")(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN diff2_dir_derivative2)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "diff2_f")(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THEN "in_s")(new_rewrite [] []))) THEN ((TRY done_tac)))))));;
2026 refine (by (VALID ((have_tac (move ["s_eq"]) (`1..dimindex (:N) = ((1..dimindex (:N)) DELETE j) UNION {j}`)))));;
2027 refine (by (VALID ((((((USE_THM_THEN EXTENSION)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_UNION)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_SING)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_DELETE)(new_rewrite [] []))) THEN (move ["i"])) THEN (split_tac)))));;
2028 refine (by (VALID (((BETA_TAC THEN (DISCH_THEN(new_rewrite [] []))) THEN (((USE_THM_THEN andTb)(new_rewrite [] [])) THEN ((USE_THM_THEN orNb)(new_rewrite [] []))) THEN (done_tac)))));;
2029 refine (by (VALID (((case THEN (simp_tac)) THEN ((USE_THM_THEN IN_NUMSEG)(new_rewrite [] [])) THEN (done_tac)))));;
2030 refine (by (VALID ((have_tac (move ["disj"]) (`DISJOINT ((1..dimindex (:N)) DELETE j) {j}`)))));;
2031 refine (by (VALID (((((USE_THM_THEN DISJOINT)(new_rewrite [] [])) THEN ((USE_THM_THEN EXTENSION)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_INTER)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_SING)(new_rewrite [] [])) THEN ((USE_THM_THEN NOT_IN_EMPTY)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_DELETE)(new_rewrite [] []))) THEN (move ["i"])))));;
2032 refine (by (VALID (((((USE_THM_THEN andbA)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN andNb)(new_rewrite [] [])) THEN ((USE_THM_THEN andbF)(new_rewrite [] []))) THEN (done_tac)))));;
2033 refine (by (VALID ((((USE_THEN "s_eq")(new_rewrite [1] [])) THEN ((USE_THM_THEN SUM_UNION)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_DELETE)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_SING)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN SUM_SING)(new_rewrite [] [])) THEN (simp_tac)))));;
2034 refine (by (VALID ((((USE_THM_THEN SUM_EQ_0)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN IN_DELETE)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_ADD_LID)(new_rewrite [] [])))))));;
2035 refine (by (VALID (((BETA_TAC THEN (move ["i"]) THEN (move ["i_in"])) THEN (((USE_THM_THEN SUM_EQ_0) apply_tac) THEN (move ["k"]) THEN (move ["k_in"]) THEN (simp_tac))))));;
2036 refine (by (VALID (((((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN IN_NUMSEG)(GSYM_THEN (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN ((USE_THEN "i_in")(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN REAL_MUL_LZERO)(new_rewrite [] []))) THEN (done_tac)))));;
2037 refine (by (VALID ((((USE_THEN "s_eq")(new_rewrite [] [])) THEN ((USE_THM_THEN SUM_UNION)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_DELETE)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_NUMSEG)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN FINITE_SING)(new_rewrite [] []))) THEN ((TRY done_tac)) THEN ((USE_THM_THEN SUM_SING)(new_rewrite [] [])) THEN (simp_tac)))));;
2038 refine (by (VALID ((((USE_THM_THEN SUM_EQ_0)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN IN_DELETE)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_ADD_LID)(new_rewrite [] [])))))));;
2039 refine (by (VALID (((BETA_TAC THEN (move ["i"]) THEN (move ["i_in"]) THEN (simp_tac)) THEN ((USE_THM_THEN REAL_ENTIRE)(new_rewrite [] [])) THEN (DISJ2_TAC)))));;
2040 refine (by (VALID (((((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN IN_NUMSEG)(GSYM_THEN (new_rewrite [] [])))) THEN ((TRY done_tac)) THEN ((USE_THEN "i_in")(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN REAL_MUL_LZERO)(new_rewrite [] []))) THEN (done_tac)))));;
2041 refine (by (VALID (((((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THEN "j_in")(new_rewrite [] []))) THEN ((simp_tac THEN TRY done_tac)) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_MUL_LID)(new_rewrite [] []))) THEN ((USE_THM_THEN partial2)(new_rewrite [] [])) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
2042 refine (by (VALID ((((fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (fun thm_tac -> (USE_THM_THEN REAL_CONVEX_ON_SECOND_DERIVATIVE)(ISPEC_THEN (mk_var("g",mk_type("fun",[mk_type("real",[]);mk_type("real",[])]))) thm_tac))(ISPEC_THEN (`derivative g`) thm_tac))(ISPEC_THEN (`nth_derivative 2 g`) thm_tac))(ISPEC_THEN (mk_var("s",mk_type("fun",[mk_type("real",[]);mk_type("bool",[])]))) thm_tac)) MP_TAC) THEN ALL_TAC))));;
2043 refine (by (VALID (((THENL_ROT (-1)) ((((USE_THEN "s_def")(GSYM_THEN (new_rewrite [1; 2] []))) THEN ((USE_THM_THEN IS_REALINTERVAL_INTERVAL)(new_rewrite [] [])) THEN ((USE_THM_THEN andTb)(new_rewrite [] [])) THEN ((USE_THM_THEN NOT_EXISTS_THM)(new_rewrite [] []))) THEN (DISCH_THEN(new_rewrite [] [])))))));;
2044 refine (by (VALID (((BETA_TAC THEN (move ["t"]) THEN (move ["ts"])) THEN (((USE_THEN "d2g")(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THEN "partial2_pos")(new_rewrite [] [])) THEN ((USE_THEN "in_s")(new_rewrite [] []))) THEN (done_tac)))));;
2045 refine (by (VALID ((split_tac))));;
2046 refine (by (VALID (((BETA_TAC THEN (move ["t"])) THEN (((USE_THM_THEN contraT)MP_TAC) THEN (clear_assumption "contraT") THEN (DISCH_THEN apply_tac)) THEN ((((USE_THM_THEN negbK)(new_rewrite [] [])) THEN ((USE_THM_THEN EXTENSION)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_SING)(new_rewrite [] []))) THEN (move ["eq"]))))));;
2047 refine (by (VALID (((((USE_THEN "zx_pos")MP_TAC) THEN (clear_assumption "zx_pos") THEN ((fun thm_tac -> (USE_THEN "eq")(ISPEC_THEN (`z$j - x$j`) thm_tac))MP_TAC) THEN ((fun thm_tac -> (USE_THEN "eq")(ISPEC_THEN (`&0`) thm_tac))MP_TAC) THEN BETA_TAC) THEN (repeat_tactic 1 9 (((USE_THM_THEN IN_REAL_INTERVAL)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN REAL_LE_REFL)(new_rewrite [] []))))))));;
2048 refine (by (VALID (((arith_tac) THEN (done_tac)))));;
2049 refine (by (VALID (((split_tac) THEN (move ["t"]) THEN (move ["ts"])))));;
2050 refine (by (VALID (((((fun thm_tac -> (USE_THEN "diff2_g")(fun fst_th ->(USE_THEN "ts")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN nth_diff_strong2_eq_alt)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["e"])) THEN (case THEN (move ["_"])) THEN (case THEN (move ["te"])) THEN (move ["H"]))))));;
2051 refine (by (VALID (((((USE_THM_THEN HAS_REAL_DERIVATIVE_ATREAL_WITHIN)(new_rewrite [] [])) THEN ((USE_THEN "H")(new_rewrite [] []))) THEN (done_tac)))));;
2052 refine (by (VALID (((((fun thm_tac -> (USE_THEN "diff2_g")(fun fst_th ->(USE_THEN "ts")(fun th -> MATCH_MP_THEN th thm_tac fst_th)))MP_TAC) THEN BETA_TAC) THEN (((USE_THM_THEN nth_diff_strong2_eq_alt)(new_rewrite [] [])) THEN ALL_TAC THEN (case THEN (move ["e"])) THEN (case THEN (move ["_"])) THEN (case THEN (move ["te"])) THEN (move ["H"]))))));;
2053 refine (by (VALID (((((USE_THM_THEN HAS_REAL_DERIVATIVE_ATREAL_WITHIN)(new_rewrite [] [])) THEN ((USE_THEN "H")(new_rewrite [] []))) THEN (done_tac)))));;
2054 let partial_convex_max = end_section_proof();;
2055 let partial_convex_max = finalize_theorem partial_convex_max;;
2056 (end_section "PartialConvex");;
2057 (begin_section "ElementaryFunctions");;
2058 (start_section_proof ["c"](`lift o (\x. c) = (\x. lift c)`));;
2059 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
2060 let f_lift_const = end_section_proof();;
2061 (start_section_proof ["f"](`lift o (\x. f x) = (\x. lift (f x))`));;
2062 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] []))) THEN (done_tac)))));;
2063 let f_lift_unary = end_section_proof();;
2064 (start_section_proof ["c";"x"](`diff2 (\x:real^N. c) x`));;
2065 refine (by (VALID ((((USE_THM_THEN diff2)(new_rewrite [] [])) THEN (exists_tac (`(:real^N)`)) THEN ((((USE_THM_THEN OPEN_UNIV)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_UNIV)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["y"]) THEN (move ["_"]))))));;
2066 refine (by (VALID (((((USE_THM_THEN partial_const)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN f_lift_const)(new_rewrite [] []))) THEN repeat_tactic 1 9 (((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] [])))) THEN (done_tac)))));;
2067 let diff2_const = end_section_proof();;
2068 (start_section_proof ["c";"domain"](`diff2_domain domain (\x:real^N. c)`));;
2069 refine (by (VALID (((((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_const)(new_rewrite [] []))) THEN (done_tac)))));;
2070 let diff2_domain_const = end_section_proof();;
2071 (start_section_proof ["i";"j";"c"](`partial2 i j (\x:real^N. c) = (\x. &0)`));;
2072 refine (by (VALID (((((USE_THM_THEN partial2)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN partial_const)(new_rewrite [] [])))) THEN (done_tac)))));;
2073 let partial2_const = end_section_proof();;
2074 (start_section_proof ["c";"x"](`diff2c (\x:real^N. c) x`));;
2075 refine (by (VALID (((((USE_THM_THEN diff2c)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_const)(new_rewrite [] [])) THEN ((USE_THM_THEN partial2_const)(new_rewrite [] [])) THEN ((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN REAL_CONTINUOUS_CONST)(new_rewrite [] []))) THEN (done_tac)))));;
2076 let diff2c_const = end_section_proof();;
2077 (start_section_proof ["c";"domain"](`diff2c_domain domain (\x:real^N. c)`));;
2078 refine (by (VALID (((((USE_THM_THEN diff2c_domain)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2c_const)(new_rewrite [] []))) THEN (done_tac)))));;
2079 let diff2c_domain_const = end_section_proof();;
2080 (start_section_proof ["k";"i"](`partial i (\x:real^N. x$k) = (\x. (basis i:real^N)$k)`));;
2081 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN partial)(new_rewrite [] []))) THEN (move ["x"]) THEN (simp_tac)))));;
2082 refine (by (VALID ((have_tac (DISCH_THEN(new_rewrite [] [])) (`(\x. x$k) o (\t. x + t % basis i) = (\t. x$k + t * (basis i:real^N)$k)`)))));;
2083 refine (by (VALID (((((USE_THM_THEN eq_ext)(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN o_THM)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN VECTOR_ADD_COMPONENT)(new_rewrite [] [])) THEN ((USE_THM_THEN VECTOR_MUL_COMPONENT)(new_rewrite [] []))) THEN (done_tac)))));;
2084 refine (by (VALID ((((USE_THM_THEN derivative_add)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_MUL_ATREAL)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
2085 refine (by (VALID (((((USE_THM_THEN REAL_DIFFERENTIABLE_ID)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN (done_tac)))));;
2086 refine (by (VALID ((((USE_THM_THEN derivative_const)(new_rewrite [] [])) THEN (simp_tac) THEN ((USE_THM_THEN derivative_mul)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_ID)(new_rewrite [] []))) THEN repeat_tactic 0 10 (((USE_THM_THEN REAL_DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN ((TRY done_tac))))));;
2087 refine (by (VALID (((((USE_THM_THEN derivative_x)(new_rewrite [] [])) THEN ((USE_THM_THEN derivative_const)(new_rewrite [] []))) THEN (arith_tac) THEN (done_tac)))));;
2088 let partial_x_lemma = end_section_proof();;
2089 (start_section_proof ["k";"i"](`k IN 1..dimindex (:N) ==> 
2090         partial i (\x:real^N. x$k) = (\x. if i = k then &1 else &0)`));;
2091 refine (by (VALID (((BETA_TAC THEN (move ["k_ineq"])) THEN (((USE_THM_THEN partial_x_lemma)(new_rewrite [] [])) THEN ((USE_THM_THEN BASIS_COMPONENT)(new_rewrite [] [])) THEN repeat_tactic 0 10 (((USE_THM_THEN IN_NUMSEG)(GSYM_THEN (new_rewrite [] [])))) THEN ((TRY done_tac))) THEN (arith_tac) THEN (done_tac)))));;
2092 let partial_x = end_section_proof();;
2093 (start_section_proof ["k";"i";"j"](`partial2 i j (\x:real^N. x$k) = (\x. &0)`));;
2094 refine (by (VALID (((((USE_THM_THEN partial2)(new_rewrite [] [])) THEN ((USE_THM_THEN partial_x_lemma)(new_rewrite [] [])) THEN ((USE_THM_THEN partial_const)(new_rewrite [] []))) THEN (done_tac)))));;
2095 let partial2_x = end_section_proof();;
2096 (start_section_proof ["k";"x"](`k IN 1..dimindex (:N) ==> diff2 (\x:real^N. x$k) x`));;
2097 refine (by (VALID (((BETA_TAC THEN (move ["k_ineq"])) THEN ((USE_THM_THEN diff2)(new_rewrite [] [])) THEN (exists_tac (`(:real^N)`)) THEN ((((USE_THM_THEN OPEN_UNIV)(new_rewrite [] [])) THEN ((USE_THM_THEN IN_UNIV)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN andTb)(new_rewrite [] [])))) THEN (move ["y"]) THEN (move ["_"]))))));;
2098 refine (by (VALID (((((USE_THM_THEN projection_diff)(new_rewrite [] [])) THEN ((TRY done_tac)) THEN ((USE_THM_THEN partial_x_lemma)(new_rewrite [] [])) THEN repeat_tactic 1 9 (((USE_THM_THEN f_lift_unary)(new_rewrite [] []))) THEN ((USE_THM_THEN DIFFERENTIABLE_CONST)(new_rewrite [] []))) THEN (done_tac)))));;
2099 let diff2_x = end_section_proof();;
2100 (start_section_proof ["k";"domain"](`k IN 1..dimindex (:N) ==> diff2_domain domain (\x:real^N. x$k)`));;
2101 refine (by (VALID ((((DISCH_THEN (fun snd_th -> (USE_THM_THEN diff2_x)(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC) THEN (((USE_THM_THEN diff2_domain)(new_rewrite [] [])) THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
2102 let diff2_domain_x = end_section_proof();;
2103 (start_section_proof ["k";"x"](`k IN 1..dimindex (:N) ==> diff2c (\x:real^N. x$k) x`));;
2104 refine (by (VALID (((BETA_TAC THEN (move ["k_ineq"])) THEN (((USE_THM_THEN diff2c)(new_rewrite [] [])) THEN ((USE_THM_THEN diff2_x)(new_rewrite [] [])) THEN ((TRY done_tac)))))));;
2105 refine (by (VALID (((((USE_THM_THEN (GEN_ALL REAL_CONTINUOUS_CONTINUOUS1))(GSYM_THEN (new_rewrite [] []))) THEN ((USE_THM_THEN partial2_x)(new_rewrite [] [])) THEN ((USE_THM_THEN REAL_CONTINUOUS_CONST)(new_rewrite [] []))) THEN (done_tac)))));;
2106 let diff2c_x = end_section_proof();;
2107 (start_section_proof ["k";"domain"](`k IN 1..dimindex (:N) ==> diff2c_domain domain (\x:real^N. x$k)`));;
2108 refine (by (VALID ((((DISCH_THEN (fun snd_th -> (USE_THM_THEN diff2c_x)(MATCH_MP_THEN snd_th MP_TAC))) THEN BETA_TAC) THEN (((USE_THM_THEN diff2c_domain)(new_rewrite [] [])) THEN (DISCH_THEN(new_rewrite [] []))) THEN (done_tac)))));;
2109 let diff2c_domain_x = end_section_proof();;
2110 let diff2c_domain_x = finalize_theorem diff2c_domain_x;;
2111 let diff2c_x = finalize_theorem diff2c_x;;
2112 let diff2_domain_x = finalize_theorem diff2_domain_x;;
2113 let diff2_x = finalize_theorem diff2_x;;
2114 let partial2_x = finalize_theorem partial2_x;;
2115 let partial_x = finalize_theorem partial_x;;
2116 let partial_x_lemma = finalize_theorem partial_x_lemma;;
2117 let diff2c_domain_const = finalize_theorem diff2c_domain_const;;
2118 let diff2c_const = finalize_theorem diff2c_const;;
2119 let partial2_const = finalize_theorem partial2_const;;
2120 let diff2_domain_const = finalize_theorem diff2_domain_const;;
2121 let diff2_const = finalize_theorem diff2_const;;
2122 let f_lift_unary = finalize_theorem f_lift_unary;;
2123 let f_lift_const = finalize_theorem f_lift_const;;
2124 (end_section "ElementaryFunctions");;