1 needs "../formal_lp/formal_interval/m_taylor_arith.hl";;
6 (**************************************)
7 let real_pair_ty = `:real#real`;;
8 let mk_vars n name ty = map (fun i -> mk_var (name^string_of_int i, ty)) (1--n);;
11 let all_n_components2 n all_n_th =
12 let th0 = SYM (all_n_array.(n)) in
13 let _, list_tm, s_tm = dest_all_n (concl all_n_th) in
14 let list_ty = type_of list_tm in
15 let ty = (hd o snd o dest_type) list_ty in
16 let s_var = mk_var ("s", type_of s_tm) and
17 a_vars = mk_vars n "a" ty in
19 let list_tms = dest_list list_tm in
20 let th1 = (INST ([s_tm, s_var] @ zip list_tms a_vars) o INST_TYPE[ty, aty]) th0 in
21 CONJUNCTS (EQ_MP th1 all_n_th);;
25 (***************************************)
27 let gen_taylor_arith_thm arith_th final_rule n =
28 let num1_th = (SYM o REWRITE_RULE[Arith_hash.NUM_THM] o NUMERAL_TO_NUM_CONV) `1` in
29 let th0 = (REWRITE_RULE[num1_th] o DISCH_ALL o INST_TYPE[n_type_array.(n), nty]) arith_th in
30 let pty = `:real#real` in
31 let dfs = mk_vars n "df" pty in
32 let ddfs' = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
33 let ddfs = map (fun list -> mk_list (list, pty)) ddfs' in
34 let d_bounds_list = mk_list (dfs, pty) in
35 let dd_bounds_list = mk_list (ddfs, type_of (hd ddfs)) in
36 let th1 = INST[d_bounds_list, d_bounds_list_var; dd_bounds_list, dd_bounds_list_var] th0 in
37 let th2 = (CONV_RULE NUM_REDUCE_CONV o REWRITE_RULE[all_n]) th1 in
38 (UNDISCH_ALL o final_rule o REWRITE_RULE[GSYM CONJ_ASSOC] o
39 NUMERALS_TO_NUM o PURE_REWRITE_RULE[FLOAT_OF_NUM; min_exp_def]) th2;;
42 let gen_add_thm = gen_taylor_arith_thm MK_M_TAYLOR_ADD' (CONV_RULE ALL_CONV);;
43 let gen_sub_thm = gen_taylor_arith_thm MK_M_TAYLOR_SUB' (CONV_RULE ALL_CONV);;
44 let gen_mul_thm = gen_taylor_arith_thm MK_M_TAYLOR_MUL' (CONV_RULE ALL_CONV);;
45 let gen_inv_thm = gen_taylor_arith_thm MK_M_TAYLOR_INV' (REWRITE_RULE[float2_eq]);;
46 let gen_sqrt_thm = gen_taylor_arith_thm MK_M_TAYLOR_SQRT' (REWRITE_RULE[float2_eq]);;
49 let pow2_th = (SYM o REWRITE_CONV[SYM num2_eq]) `x pow 2` in
50 gen_taylor_arith_thm MK_M_TAYLOR_ATN' (REWRITE_RULE[float2_eq; float1_eq; pow2_th]);;
53 let iabs_lemma = REWRITE_CONV[SYM float1_eq] `iabs f_bounds < &1` in
54 let pow3_lemma = (SYM o REWRITE_CONV[SYM num3_eq]) `x pow 3` in
55 gen_taylor_arith_thm MK_M_TAYLOR_ACS' (REWRITE_RULE[iabs_lemma] o REWRITE_RULE[float1_eq; pow3_lemma]);;
65 let gen = fun f -> Array.init (max_dim + 1) (fun i -> if i = 0 then TRUTH else f i) in
75 (*********************)
78 let eval_m_taylor_add2 n p_lin p_second taylor1_th taylor2_th =
79 let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th in
80 let _, diff2_f2_th, lin2_th, second2_th = dest_m_taylor_thms n taylor2_th in
81 let f1_tm = (rand o concl) diff2_f1_th and
82 f2_tm = (rand o concl) diff2_f2_th in
83 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
84 let ty = type_of y_tm in
86 let x_var = mk_var ("x", ty) and
87 y_var = mk_var ("y", ty) and
88 w_var = mk_var ("w", ty) and
89 f_var = mk_var ("f", type_of f1_tm) and
90 g_var = mk_var ("g", type_of f2_tm) and
91 domain_var = mk_var ("domain", type_of domain_tm) in
93 let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th and
94 _, bounds2_th, df2_th = m_lin_approx_components n lin2_th in
96 let bounds_th = float_interval_add p_lin bounds1_th bounds2_th in
97 let bounds_tm = (rand o concl) bounds_th in
100 let df1_ths = map MY_BETA_RULE (all_n_components2 n df1_th) in
101 let df2_ths = map MY_BETA_RULE (all_n_components2 n df2_th) in
102 map2 (float_interval_add p_lin) df1_ths df2_ths in
104 let df_th = end_itlist CONJ df_ths in
107 let dd1' = all_n_components2 n (second_bounded_components n second1_th) in
108 let dd2' = all_n_components2 n (second_bounded_components n second2_th) in
109 let dd1 = map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd1' in
110 let dd2 = map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd2' in
111 map2 (map2 (float_interval_add p_second)) dd1 dd2 in
113 let dd_th = (GEN x_var o DISCH_ALL o end_itlist CONJ) (List.flatten dd_ths) in
115 let df_vars = map (fun i -> df_vars_array.(i)) (1--n) in
116 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
118 let dfs = map (rand o concl) df_ths in
119 let dds = map (map (rand o concl)) dd_ths in
120 let inst_list = union (zip dfs df_vars) (zip (List.flatten dds) (List.flatten dd_vars)) in
122 let th = (MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP diff2_f2_th o
123 MY_PROVE_HYP bounds_th o MY_PROVE_HYP domain_th o
124 MY_PROVE_HYP df_th o MY_PROVE_HYP dd_th o
125 INST([f1_tm, f_var; f2_tm, g_var;
126 domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
127 bounds_tm, bounds_var] @ inst_list)) add_ths_array.(n) in
128 let eq_th = binary_beta_gen_eq f1_tm f2_tm x_var add_op_real in
129 m_taylor_interval_norm th eq_th;;
132 (*********************)
135 let eval_m_taylor_sub2 n p_lin p_second taylor1_th taylor2_th =
136 let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th in
137 let _, diff2_f2_th, lin2_th, second2_th = dest_m_taylor_thms n taylor2_th in
138 let f1_tm = (rand o concl) diff2_f1_th and
139 f2_tm = (rand o concl) diff2_f2_th in
140 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
141 let ty = type_of y_tm in
143 let x_var = mk_var ("x", ty) and
144 y_var = mk_var ("y", ty) and
145 w_var = mk_var ("w", ty) and
146 f_var = mk_var ("f", type_of f1_tm) and
147 g_var = mk_var ("g", type_of f2_tm) and
148 domain_var = mk_var ("domain", type_of domain_tm) in
150 let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th and
151 _, bounds2_th, df2_th = m_lin_approx_components n lin2_th in
153 let bounds_th = float_interval_sub p_lin bounds1_th bounds2_th in
154 let bounds_tm = (rand o concl) bounds_th in
157 let df1_ths = map MY_BETA_RULE (all_n_components2 n df1_th) in
158 let df2_ths = map MY_BETA_RULE (all_n_components2 n df2_th) in
159 map2 (float_interval_sub p_lin) df1_ths df2_ths in
161 let df_th = end_itlist CONJ df_ths in
164 let dd1' = all_n_components2 n (second_bounded_components n second1_th) in
165 let dd2' = all_n_components2 n (second_bounded_components n second2_th) in
166 let dd1 = map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd1' in
167 let dd2 = map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd2' in
168 map2 (map2 (float_interval_sub p_second)) dd1 dd2 in
170 let dd_th = (GEN x_var o DISCH_ALL o end_itlist CONJ) (List.flatten dd_ths) in
172 let df_vars = map (fun i -> df_vars_array.(i)) (1--n) in
173 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
175 let dfs = map (rand o concl) df_ths in
176 let dds = map (map (rand o concl)) dd_ths in
177 let inst_list = union (zip dfs df_vars) (zip (List.flatten dds) (List.flatten dd_vars)) in
179 let th = (MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP diff2_f2_th o
180 MY_PROVE_HYP bounds_th o MY_PROVE_HYP domain_th o
181 MY_PROVE_HYP df_th o MY_PROVE_HYP dd_th o
182 INST([f1_tm, f_var; f2_tm, g_var;
183 domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
184 bounds_tm, bounds_var] @ inst_list)) sub_ths_array.(n) in
185 let eq_th = binary_beta_gen_eq f1_tm f2_tm x_var sub_op_real in
186 m_taylor_interval_norm th eq_th;;
189 (*********************)
192 let eval_m_taylor_mul2 n p_lin p_second taylor1_th taylor2_th =
193 let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th in
194 let _, diff2_f2_th, lin2_th, second2_th = dest_m_taylor_thms n taylor2_th in
195 let f1_tm = (rand o concl) diff2_f1_th and
196 f2_tm = (rand o concl) diff2_f2_th in
197 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
198 let ty = type_of y_tm in
200 let x_var = mk_var ("x", ty) and
201 y_var = mk_var ("y", ty) and
202 w_var = mk_var ("w", ty) and
203 f_var = mk_var ("f", type_of f1_tm) and
204 g_var = mk_var ("g", type_of f2_tm) and
205 domain_var = mk_var ("domain", type_of domain_tm) in
207 let undisch = UNDISCH o SPEC x_var in
209 let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th and
210 _, bounds2_th, df2_th = m_lin_approx_components n lin2_th in
212 let bounds_th = float_interval_mul p_lin bounds1_th bounds2_th in
213 let bounds_tm = (rand o concl) bounds_th in
217 let df1_ths = map MY_BETA_RULE (all_n_components2 n df1_th) in
218 let df2_ths = map MY_BETA_RULE (all_n_components2 n df2_th) in
219 let ( * ), ( + ) = float_interval_mul p_lin, float_interval_add p_lin in
220 map2 (fun d1 d2 -> d1 * bounds2_th + bounds1_th * d2) df1_ths df2_ths in
222 let df_th = end_itlist CONJ df_ths in
224 (* second partials *)
225 let d1_bounds = map (fun i ->
226 undisch (eval_m_taylor_partial_bound n p_second i taylor1_th)) (1--n) in
227 let d2_bounds = map (fun i ->
228 undisch (eval_m_taylor_partial_bound n p_second i taylor2_th)) (1--n) in
229 let f1_bound = undisch (eval_m_taylor_bound n p_second taylor1_th) in
230 let f2_bound = undisch (eval_m_taylor_bound n p_second taylor2_th) in
234 let dd1' = all_n_components2 n (second_bounded_components n second1_th) in
235 let dd2' = all_n_components2 n (second_bounded_components n second2_th) in
236 let dd1 = map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) ns dd1' in
237 let dd2 = map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) ns dd2' in
238 let ( * ), ( + ) = float_interval_mul p_second, float_interval_add p_second in
239 map2 (fun (dd1_list, dd2_list) i ->
240 let di1 = List.nth d1_bounds (i - 1) in
241 let di2 = List.nth d2_bounds (i - 1) in
242 map2 (fun (dd1, dd2) j ->
243 let dj1 = List.nth d1_bounds (j - 1) in
244 let dj2 = List.nth d2_bounds (j - 1) in
245 (dd1 * f2_bound + di1 * dj2) + (dj1 * di2 + f1_bound * dd2))
246 (zip dd1_list dd2_list) (1--i)) (zip dd1 dd2) ns in
248 let dd_th = (GEN x_var o DISCH_ALL o end_itlist CONJ) (List.flatten dd_ths) in
250 let df_vars = map (fun i -> df_vars_array.(i)) (1--n) in
251 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
253 let dfs = map (rand o concl) df_ths in
254 let dds = map (map (rand o concl)) dd_ths in
255 let inst_list = union (zip dfs df_vars) (zip (List.flatten dds) (List.flatten dd_vars)) in
257 let th = (MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP diff2_f2_th o
258 MY_PROVE_HYP bounds_th o MY_PROVE_HYP domain_th o
259 MY_PROVE_HYP df_th o MY_PROVE_HYP dd_th o
260 INST([f1_tm, f_var; f2_tm, g_var;
261 domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
262 bounds_tm, bounds_var] @ inst_list)) mul_ths_array.(n) in
263 let eq_th = binary_beta_gen_eq f1_tm f2_tm x_var mul_op_real in
264 m_taylor_interval_norm th eq_th;;
268 (******************************)
271 let eval_m_taylor_inv2 n p_lin p_second taylor1_th =
272 let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th in
273 let f1_tm = (rand o concl) diff2_f1_th in
274 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
276 let ty = type_of y_tm in
277 let x_var = mk_var ("x", ty) and
278 y_var = mk_var ("y", ty) and
279 w_var = mk_var ("w", ty) and
280 f_var = mk_var ("f", type_of f1_tm) and
281 domain_var = mk_var ("domain", type_of domain_tm) in
283 let undisch = UNDISCH o SPEC x_var in
285 let f1_bound0 = eval_m_taylor_bound n p_second taylor1_th in
286 let f1_bound = undisch f1_bound0 in
287 let f_bounds_tm = (rand o concl) f1_bound in
290 let cond_th = check_interval_not_zero f_bounds_tm in
292 let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th in
294 let bounds_th = float_interval_inv p_lin bounds1_th in
295 let bounds_tm = (rand o concl) bounds_th in
299 let neg, inv, ( * ) = float_interval_neg, float_interval_inv p_lin, float_interval_mul p_lin in
300 neg (inv (bounds1_th * bounds1_th)) in
302 let df1_ths' = all_n_components2 n df1_th in
303 let df1_ths = map MY_BETA_RULE df1_ths' in
306 let ( * ) = float_interval_mul p_lin in
307 map (fun th1 -> u_bounds * th1) df1_ths in
309 let df_th = end_itlist CONJ df_ths in
311 (* second partials *)
313 let dd1 = all_n_components2 n (second_bounded_components n second1_th) in
314 map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd1 in
316 let d1_bounds = map (fun i ->
317 let th0 = eval_m_taylor_partial_bound n p_second i taylor1_th in
318 undisch th0) (1--n) in
320 (* u'(f x), u''(f x) *)
322 let inv, ( * ) = float_interval_inv p_second, float_interval_mul p_second in
323 let ff = f1_bound * f1_bound in
325 two_interval * inv (f1_bound * ff) in
328 let ( * ), ( - ) = float_interval_mul p_second, float_interval_sub p_second in
329 map2 (fun dd_list di1 ->
330 my_map2 (fun dd dj1 ->
331 (d2_th0 * dj1) * di1 - d1_th0 * dd) dd_list d1_bounds) dd_ths d1_bounds in
333 let dd_th = (GEN x_var o DISCH_ALL o end_itlist CONJ) (List.flatten dd_ths) in
336 let df_vars = map (fun i -> df_vars_array.(i)) (1--n) in
337 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
339 let dfs = map (rand o concl) df_ths in
340 let dds = map (map (rand o concl)) dd_ths in
342 let inst_list = union (zip dfs df_vars) (zip (List.flatten dds) (List.flatten dd_vars)) in
344 let th1 = (MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP cond_th o MY_PROVE_HYP f1_bound0 o
345 MY_PROVE_HYP bounds_th o MY_PROVE_HYP domain_th o
346 MY_PROVE_HYP dd_th o MY_PROVE_HYP df_th o
347 INST([f1_tm, f_var; f_bounds_tm, f_bounds_var;
348 domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
349 bounds_tm, bounds_var] @ inst_list)) inv_ths_array.(n) in
350 let eq_th = unary_beta_gen_eq f1_tm x_var inv_op_real in
351 m_taylor_interval_norm th1 eq_th;;
355 (******************************)
358 let eval_m_taylor_sqrt2 n p_lin p_second taylor1_th =
359 let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th in
360 let f1_tm = (rand o concl) diff2_f1_th in
361 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
363 let ty = type_of y_tm in
364 let x_var = mk_var ("x", ty) and
365 y_var = mk_var ("y", ty) and
366 w_var = mk_var ("w", ty) and
367 f_var = mk_var ("f", type_of f1_tm) and
368 domain_var = mk_var ("domain", type_of domain_tm) in
370 let undisch = UNDISCH o SPEC x_var in
372 let f1_bound0 = eval_m_taylor_bound n p_second taylor1_th in
373 let f1_bound = undisch f1_bound0 in
374 let f_bounds_tm = (rand o concl) f1_bound in
377 let cond_th = check_interval_pos f_bounds_tm in
379 let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th in
381 let bounds_th = float_interval_sqrt p_lin bounds1_th in
382 let bounds_tm = (rand o concl) bounds_th in
386 let inv, ( * ) = float_interval_inv p_lin, float_interval_mul p_lin in
387 inv (two_interval * bounds_th) in
389 let df1_ths' = all_n_components2 n df1_th in
390 let df1_ths = map MY_BETA_RULE df1_ths' in
393 let ( * ) = float_interval_mul p_lin in
394 map (fun th1 -> u_bounds * th1) df1_ths in
396 let df_th = end_itlist CONJ df_ths in
398 (* second partials *)
400 let dd1 = all_n_components2 n (second_bounded_components n second1_th) in
401 map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd1 in
403 let d1_bounds = map (fun i ->
404 let th0 = eval_m_taylor_partial_bound n p_second i taylor1_th in
405 undisch th0) (1--n) in
407 (* u'(f x), u''(f x) *)
409 let neg, sqrt, inv, ( * ) = float_interval_neg, float_interval_sqrt p_second,
410 float_interval_inv p_second, float_interval_mul p_second in
411 let two_sqrt_f = two_interval * sqrt f1_bound in
412 inv two_sqrt_f, neg (inv (two_sqrt_f * (two_interval * f1_bound))) in
415 let ( * ), ( + ) = float_interval_mul p_second, float_interval_add p_second in
416 map2 (fun dd_list di1 ->
417 my_map2 (fun dd dj1 ->
418 (d2_th0 * dj1) * di1 + d1_th0 * dd) dd_list d1_bounds) dd_ths d1_bounds in
420 let dd_th = (GEN x_var o DISCH_ALL o end_itlist CONJ) (List.flatten dd_ths) in
423 let df_vars = map (fun i -> df_vars_array.(i)) (1--n) in
424 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
426 let dfs = map (rand o concl) df_ths in
427 let dds = map (map (rand o concl)) dd_ths in
429 let inst_list = union (zip dfs df_vars) (zip (List.flatten dds) (List.flatten dd_vars)) in
431 let th1 = (MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP cond_th o MY_PROVE_HYP f1_bound0 o
432 MY_PROVE_HYP bounds_th o MY_PROVE_HYP domain_th o
433 MY_PROVE_HYP dd_th o MY_PROVE_HYP df_th o
434 INST([f1_tm, f_var; f_bounds_tm, f_bounds_var;
435 domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
436 bounds_tm, bounds_var] @ inst_list)) sqrt_ths_array.(n) in
437 let eq_th = unary_beta_gen_eq f1_tm x_var sqrt_tm in
438 m_taylor_interval_norm th1 eq_th;;
442 (******************************)
445 let eval_m_taylor_atn2 n p_lin p_second taylor1_th =
446 let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th in
447 let f1_tm = (rand o concl) diff2_f1_th in
448 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
450 let ty = type_of y_tm in
451 let x_var = mk_var ("x", ty) and
452 y_var = mk_var ("y", ty) and
453 w_var = mk_var ("w", ty) and
454 f_var = mk_var ("f", type_of f1_tm) and
455 domain_var = mk_var ("domain", type_of domain_tm) in
457 let undisch = UNDISCH o SPEC x_var in
459 let f1_bound0 = eval_m_taylor_bound n p_second taylor1_th in
460 let f1_bound = undisch f1_bound0 in
461 let f_bounds_tm = (rand o concl) f1_bound in
463 let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th in
465 let bounds_th = float_interval_atn p_lin bounds1_th in
466 let bounds_tm = (rand o concl) bounds_th in
470 let inv, ( + ), ( * ) = float_interval_inv p_lin,
471 float_interval_add p_lin, float_interval_mul p_lin in
472 inv (one_interval + bounds1_th * bounds1_th) in
474 let df1_ths' = all_n_components2 n df1_th in
475 let df1_ths = map MY_BETA_RULE df1_ths' in
478 let ( * ) = float_interval_mul p_lin in
479 map (fun th1 -> u_bounds * th1) df1_ths in
481 let df_th = end_itlist CONJ df_ths in
483 (* second partials *)
485 let dd1 = all_n_components2 n (second_bounded_components n second1_th) in
486 map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd1 in
488 let d1_bounds = map (fun i ->
489 let th0 = eval_m_taylor_partial_bound n p_second i taylor1_th in
490 undisch th0) (1--n) in
492 (* u'(f x), u''(f x) *)
494 let neg, inv, ( + ), ( * ), pow2 = float_interval_neg, float_interval_inv p_second,
495 float_interval_add p_second, float_interval_mul p_second, float_interval_pow_simple p_second 2 in
496 let inv_one_ff = inv (one_interval + f1_bound * f1_bound) in
497 inv_one_ff, (neg_two_interval * f1_bound) * pow2 inv_one_ff in
500 let ( * ), ( + ) = float_interval_mul p_second, float_interval_add p_second in
501 map2 (fun dd_list di1 ->
502 my_map2 (fun dd dj1 ->
503 (d2_th0 * dj1) * di1 + d1_th0 * dd) dd_list d1_bounds) dd_ths d1_bounds in
505 let dd_th = (GEN x_var o DISCH_ALL o end_itlist CONJ) (List.flatten dd_ths) in
508 let df_vars = map (fun i -> df_vars_array.(i)) (1--n) in
509 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
511 let dfs = map (rand o concl) df_ths in
512 let dds = map (map (rand o concl)) dd_ths in
514 let inst_list = union (zip dfs df_vars) (zip (List.flatten dds) (List.flatten dd_vars)) in
516 let th1 = (MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP f1_bound0 o
517 MY_PROVE_HYP bounds_th o MY_PROVE_HYP domain_th o
518 MY_PROVE_HYP dd_th o MY_PROVE_HYP df_th o
519 INST([f1_tm, f_var; f_bounds_tm, f_bounds_var;
520 domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
521 bounds_tm, bounds_var] @ inst_list)) atn_ths_array.(n) in
522 let eq_th = unary_beta_gen_eq f1_tm x_var atn_tm in
523 m_taylor_interval_norm th1 eq_th;;
526 (******************************)
529 let eval_m_taylor_acs2 n p_lin p_second taylor1_th =
530 let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th in
531 let f1_tm = (rand o concl) diff2_f1_th in
532 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
534 let ty = type_of y_tm in
535 let x_var = mk_var ("x", ty) and
536 y_var = mk_var ("y", ty) and
537 w_var = mk_var ("w", ty) and
538 f_var = mk_var ("f", type_of f1_tm) and
539 domain_var = mk_var ("domain", type_of domain_tm) in
541 let undisch = UNDISCH o SPEC x_var in
543 let f1_bound0 = eval_m_taylor_bound n p_second taylor1_th in
544 let f1_bound = undisch f1_bound0 in
545 let f_bounds_tm = (rand o concl) f1_bound in
548 let cond_th = EQT_ELIM (check_interval_iabs f_bounds_tm one_float) in
550 let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th in
552 let bounds_th = float_interval_acs p_lin bounds1_th in
553 let bounds_tm = (rand o concl) bounds_th in
557 let inv, sqrt, neg = float_interval_inv p_lin, float_interval_sqrt p_lin, float_interval_neg in
558 let ( * ), ( - ) = float_interval_mul p_lin, float_interval_sub p_lin in
559 neg (inv (sqrt (one_interval - bounds1_th * bounds1_th))) in
561 let df1_ths' = all_n_components2 n df1_th in
562 let df1_ths = map MY_BETA_RULE df1_ths' in
565 let ( * ) = float_interval_mul p_lin in
566 map (fun th1 -> u_bounds * th1) df1_ths in
568 let df_th = end_itlist CONJ df_ths in
570 (* second partials *)
572 let dd1 = all_n_components2 n (second_bounded_components n second1_th) in
573 map2 (fun i -> map MY_BETA_RULE o all_n_components2 i o MY_BETA_RULE) (1--n) dd1 in
575 let d1_bounds = map (fun i ->
576 let th0 = eval_m_taylor_partial_bound n p_second i taylor1_th in
577 undisch th0) (1--n) in
579 (* u'(f x), u''(f x) *)
581 let neg, sqrt, inv = float_interval_neg, float_interval_sqrt p_second, float_interval_inv p_second in
582 let ( - ), ( * ), ( / ), pow3 = float_interval_sub p_second, float_interval_mul p_second,
583 float_interval_div p_second, float_interval_pow_simple p_second 3 in
584 let ff_1 = one_interval - f1_bound * f1_bound in
585 inv (sqrt ff_1), neg (f1_bound / sqrt (pow3 ff_1)) in
588 let ( * ), ( - ) = float_interval_mul p_second, float_interval_sub p_second in
589 map2 (fun dd_list di1 ->
590 my_map2 (fun dd dj1 ->
591 (d2_th0 * dj1) * di1 - d1_th0 * dd) dd_list d1_bounds) dd_ths d1_bounds in
593 let dd_th = (GEN x_var o DISCH_ALL o end_itlist CONJ) (List.flatten dd_ths) in
596 let df_vars = map (fun i -> df_vars_array.(i)) (1--n) in
597 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(i).(j)) (1--i)) (1--n) in
599 let dfs = map (rand o concl) df_ths in
600 let dds = map (map (rand o concl)) dd_ths in
602 let inst_list = union (zip dfs df_vars) (zip (List.flatten dds) (List.flatten dd_vars)) in
604 let th1 = (MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP cond_th o MY_PROVE_HYP f1_bound0 o
605 MY_PROVE_HYP bounds_th o MY_PROVE_HYP domain_th o
606 MY_PROVE_HYP dd_th o MY_PROVE_HYP df_th o
607 INST([f1_tm, f_var; f_bounds_tm, f_bounds_var;
608 domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
609 bounds_tm, bounds_var] @ inst_list)) acs_ths_array.(n) in
610 let eq_th = unary_beta_gen_eq f1_tm x_var acs_tm in
611 m_taylor_interval_norm th1 eq_th;;
615 (*******************************)
622 let xx = mk_vector_list [one_float; one_float; one_float];;
623 let r = mk_float 27182 46;;
624 let r = mk_float 11 49;;
625 let zz = mk_vector_list [r; r; r];;
627 let r = mk_float 0 50;;
628 let xx = mk_vector_list [r; r; r];;
629 let r = mk_float 1 49;;
630 let zz = mk_vector_list [r; r; r];;
632 let domain_th = mk_m_center_domain n pp (rand xx) (rand zz);;
633 let f1 = expr_to_vector_fun `x1 + x2 * x3 + pi`;;
634 let f2 = `\x:real^3. x$2 * x$2 + &2 * pi`;;
635 let taylor1 = eval_m_taylor_poly0 pp f1 pp pp domain_th;;
636 let taylor2 = eval_m_taylor_poly0 pp f2 pp pp domain_th;;
638 eval_m_taylor_inv n pp pp taylor1;;
639 eval_m_taylor_inv2 n pp pp taylor1;;
641 test 100 (eval_m_taylor_inv n pp pp) taylor1;;
643 test 100 (eval_m_taylor_inv2 n pp pp) taylor1;;
646 test 100 (eval_m_taylor_sqrt 3 2 2) taylor1;;
648 test 100 (eval_m_taylor_sqrt2 3 2 2) taylor1;;
650 eval_m_taylor_add2 3 2 2 taylor1 taylor2;;
651 eval_m_taylor_sub2 3 2 2 taylor1 taylor2;;
653 test 100 (eval_m_taylor_add 3 2 2 taylor1) taylor2;;
655 test 100 (eval_m_taylor_add2 3 2 2 taylor1) taylor2;;
657 eval_m_taylor_mul2 3 2 2 taylor1 taylor2;;
659 test 100 (eval_m_taylor_mul 3 2 2 taylor1) taylor2;;
661 test 100 (eval_m_taylor_mul2 3 2 2 taylor1) taylor2;;
663 eval_m_taylor_atn2 3 2 2 taylor1;;
665 test 100 (eval_m_taylor_atn 3 2 2) taylor1;;
667 test 100 (eval_m_taylor_atn2 3 2 2) taylor1;;