1 needs "../formal_lp/formal_interval/m_taylor.hl";;
\r
3 module M_taylor_old = struct
\r
5 let gen_second_bounded_eq_thm n =
\r
6 let ty, _, x_var, _, _, _, domain_var = get_types_and_vars n in
\r
7 let dd_vars = map (fun i -> map (fun j -> dd_vars_array.(j).(i)) (1--n)) (1--n) in
\r
8 let dd_bounds_list = mk_list (map (fun l -> mk_list (l, real_pair_ty)) dd_vars, real_pair_list_ty) in
\r
9 let th0 = (SPECL[domain_var; dd_bounds_list] o inst_first_type_var ty) second_bounded in
\r
10 let th1 = (CONV_RULE NUM_REDUCE_CONV o REWRITE_RULE[all_n]) th0 in
\r
13 let gen_second_bounded_poly_thm poly_tm partials2 =
\r
14 let x_var, _ = dest_abs poly_tm in
\r
15 let n = get_dim x_var in
\r
16 let partials2' = List.flatten partials2 in
\r
17 let second_th = (REWRITE_RULE partials2' o SPECL [poly_tm]) (gen_second_bounded_eq_thm n) in
\r
21 let gen_second_bounded_poly_thm0 poly_tm =
\r
22 let x_var, _ = dest_abs poly_tm in
\r
23 let n = get_dim x_var in
\r
24 let partials = map (fun i -> gen_partial_poly i poly_tm) (1--n) in
\r
25 let get_partial i eq_th =
\r
26 let partial_i = gen_partial_poly i (rand (concl eq_th)) in
\r
27 let pi = (rator o lhand o concl) partial_i in
\r
28 REWRITE_RULE[GSYM partial2] (TRANS (AP_TERM pi eq_th) partial_i) in
\r
29 let partials2 = map (fun th -> map (fun i -> get_partial i th) (1--n)) partials in
\r
30 gen_second_bounded_poly_thm poly_tm partials2;;
\r
33 (* eval_second_bounded *)
\r
34 let eval_second_bounded pp0 second_bounded_th =
\r
35 let poly_tm = (lhand o rator o lhand o concl) second_bounded_th in
\r
36 let th0 = second_bounded_th in
\r
37 let n = (get_dim o fst o dest_abs) poly_tm in
\r
38 let x_vector = mk_vector_list (map (fun i -> x_vars_array.(i)) (1--n)) and
\r
39 z_vector = mk_vector_list (map (fun i -> z_vars_array.(i)) (1--n)) in
\r
40 let _, _, _, _, _, _, domain_var = get_types_and_vars n in
\r
42 let th1 = INST[mk_pair (x_vector, z_vector), domain_var] th0 in
\r
43 let th2 = REWRITE_RULE[IN_INTERVAL; dimindex_array.(n)] th1 in
\r
44 let th3 = REWRITE_RULE[gen_in_interval n; GSYM interval_arith] th2 in
\r
45 let th4 = (REWRITE_RULE[CONJ_ACI] o REWRITE_RULE (Array.to_list comp_thms_array.(n))) th3 in
\r
46 let final_th0 = (UNDISCH_ALL o MATCH_MP iffRL) th4 in
\r
48 let x_var, h_tm = (dest_forall o hd o hyp) final_th0 in
\r
49 let _, h2 = dest_imp h_tm in
\r
50 let concl_ints = striplist dest_conj h2 in
\r
52 let i_funs = map (fun int ->
\r
53 let expr, var = dest_interval_arith int in
\r
54 (eval_constants pp0 o build_interval_fun) expr, var) concl_ints in
\r
56 let rec split_rules i_list =
\r
59 | ((i_fun, var_tm) :: es) ->
\r
60 let th_list, i_list' = split_rules es in
\r
62 | Int_const th -> (var_tm, th) :: th_list, i_list'
\r
63 | _ -> th_list, (var_tm, i_fun) :: i_list' in
\r
65 let const_th_list, i_list0 = split_rules i_funs in
\r
66 let th5 = itlist (fun (var_tm, th) th0 ->
\r
67 let b_tm = rand (concl th) in
\r
68 (REWRITE_RULE[th] o INST[b_tm, var_tm]) th0) const_th_list (SYM th4) in
\r
69 let final_th = REWRITE_RULE[GSYM IMP_IMP] th5 in
\r
70 let v_list, i_list' = unzip i_list0 in
\r
71 let i_list = find_and_replace_all i_list' [] in
\r
73 fun pp x_vector_tm z_vector_tm ->
\r
74 let x_vals = dest_vector x_vector_tm and
\r
75 z_vals = dest_vector z_vector_tm in
\r
76 if length x_vals <> n or length z_vals <> n then
\r
77 failwith (sprintf "Wrong vector size; expected size: %d" n)
\r
79 let x_vars = map (fun i -> x_vars_array.(i)) (1--n) and
\r
80 z_vars = map (fun i -> z_vars_array.(i)) (1--n) in
\r
82 let inst_th = (INST (zip x_vals x_vars) o INST (zip z_vals z_vars)) final_th in
\r
83 if (not o is_eq) (concl inst_th) then inst_th
\r
85 let x_var, lhs = (dest_forall o lhand o concl) inst_th in
\r
86 let hs = (butlast o striplist dest_imp) lhs in
\r
87 let vars = map (rand o rator) hs in
\r
88 let int_vars = zip vars (map ASSUME hs) in
\r
90 let dd_ints = eval_interval_fun_list pp i_list int_vars in
\r
91 let inst_dd = map2 (fun var th -> (rand o concl) th, var) v_list dd_ints in
\r
92 let inst_th2 = INST inst_dd inst_th in
\r
94 let conj_th = end_itlist CONJ dd_ints in
\r
95 let lhs_th = GEN x_var (itlist DISCH hs conj_th) in
\r
96 EQ_MP inst_th2 lhs_th;;
\r
100 let eval_second_bounded_poly0 pp0 poly_tm =
\r
101 eval_second_bounded pp0 (gen_second_bounded_poly_thm0 poly_tm);;
\r
104 (*************************************)
\r
106 let eval_m_taylor pp0 diff2c_th lin_th second_th =
\r
107 let poly_tm = (rand o concl) diff2c_th in
\r
108 let n = (get_dim o fst o dest_abs) poly_tm in
\r
109 let eval_lin = eval_lin_approx pp0 lin_th and
\r
110 eval_second = eval_second_bounded pp0 second_th in
\r
112 let ty, _, x_var, f_var, y_var, w_var, domain_var = get_types_and_vars n in
\r
113 let th0 = (SPEC_ALL o inst_first_type_var ty) m_taylor_interval in
\r
114 let th1 = INST[poly_tm, f_var] th0 in
\r
115 let th2 = (UNDISCH_ALL o REWRITE_RULE[GSYM IMP_IMP] o MATCH_MP iffRL o REWRITE_RULE[diff2c_th]) th1 in
\r
117 fun p_lin p_second domain_th ->
\r
118 let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th) in
\r
119 let x_tm, z_tm = dest_pair domain_tm in
\r
121 let lin_th = eval_lin p_lin y_tm and
\r
122 second_th = eval_second p_second x_tm z_tm in
\r
124 let _, _, f_bounds, df_bounds_list = dest_lin_approx (concl lin_th) in
\r
125 let dd_bounds_list = (rand o concl) second_th in
\r
126 let df_var = mk_var ("d_bounds_list", type_of df_bounds_list) and
\r
127 dd_var = mk_var ("dd_bounds_list", type_of dd_bounds_list) in
\r
129 (MY_PROVE_HYP domain_th o MY_PROVE_HYP lin_th o MY_PROVE_HYP second_th o
\r
130 INST[domain_tm, domain_var; y_tm, y_var; w_tm, w_var;
\r
131 f_bounds, f_bounds_var; df_bounds_list, df_var; dd_bounds_list, dd_var]) th2;;
\r
134 let eval_m_taylor_poly0 pp0 poly_tm =
\r
135 let diff2_th = gen_diff2c_domain_poly poly_tm in
\r
136 let x_var, _ = dest_abs poly_tm in
\r
137 let n = get_dim x_var in
\r
138 let partials = map (fun i -> gen_partial_poly i poly_tm) (1--n) in
\r
139 let get_partial i eq_th =
\r
140 let partial_i = gen_partial_poly i (rand (concl eq_th)) in
\r
141 let pi = (rator o lhand o concl) partial_i in
\r
142 REWRITE_RULE[GSYM partial2] (TRANS (AP_TERM pi eq_th) partial_i) in
\r
143 let partials2 = map (fun th -> map (fun i -> get_partial i th) (1--n)) partials in
\r
144 let second_th = gen_second_bounded_poly_thm poly_tm partials2 in
\r
145 let diff_th = gen_diff_poly poly_tm in
\r
146 let lin_th = gen_lin_approx_poly_thm poly_tm diff_th partials in
\r
147 eval_m_taylor pp0 diff2_th lin_th second_th;;
\r
151 (********************************)
\r
152 (* m_taylor_error *)
\r
155 (* Sum of the list elements *)
\r
157 let ITLIST2_EQ_SUM = prove(`!(f:A->real) l1 l2. LENGTH l1 = LENGTH l2 ==>
\r
158 ITLIST2 (\x y z. x * f y + z) l1 l2 (&0) =
\r
159 sum (1..(LENGTH l1)) (\i. EL (i - 1) l1 * f (EL (i - 1) l2))`,
\r
161 LIST_INDUCT_TAC THEN LIST_INDUCT_TAC THEN REWRITE_TAC[LENGTH; ITLIST2] THEN TRY ARITH_TAC THENL
\r
163 REWRITE_TAC[SUM_CLAUSES_NUMSEG; ARITH];
\r
166 REWRITE_TAC[eqSS] THEN DISCH_TAC THEN
\r
167 FIRST_X_ASSUM (MP_TAC o SPEC `t':(A)list`) THEN ASM_REWRITE_TAC[] THEN
\r
168 DISCH_THEN (fun th -> REWRITE_TAC[th]) THEN
\r
169 REWRITE_TAC[GSYM add1n] THEN
\r
170 new_rewrite [] [] SUM_ADD_SPLIT THEN REWRITE_TAC[ARITH] THEN
\r
171 REWRITE_TAC[TWO; add1n; SUM_SING_NUMSEG; subnn; EL; HD] THEN
\r
172 REWRITE_TAC[GSYM addn1; SUM_OFFSET; REAL_EQ_ADD_LCANCEL] THEN
\r
173 MATCH_MP_TAC SUM_EQ THEN move ["i"] THEN REWRITE_TAC[IN_NUMSEG] THEN DISCH_TAC THEN
\r
174 ASM_SIMP_TAC[ARITH_RULE `1 <= i ==> (i + 1) - 1 = SUC (i - 1)`; EL; TL]);;
\r
178 let M_TAYLOR_ERROR_ITLIST2 = prove(`!f domain y w dd_bounds_list error.
\r
179 m_cell_domain domain y (vector w) ==>
\r
180 second_bounded (f:real^N->real) domain dd_bounds_list ==>
\r
181 LENGTH w = dimindex (:N) ==>
\r
182 LENGTH dd_bounds_list = dimindex (:N) ==>
\r
183 ALL (\list. LENGTH list = dimindex (:N)) dd_bounds_list ==>
\r
184 ITLIST2 (\x list z. x * ITLIST2 (\a b c. a * iabs b + c) w list (&0) + z)
\r
185 w dd_bounds_list (&0) <= error ==>
\r
186 m_taylor_error f domain (vector w) error`,
\r
187 REWRITE_TAC[second_bounded; m_taylor_error] THEN REPEAT GEN_TAC THEN
\r
188 set_tac "s" `ITLIST2 _1 _2 _3 _4` THEN
\r
189 move ["domain"; "second"; "lw"; "ldd"; "ldd_all"; "s_le"; "x"; "x_in"] THEN
\r
190 SUBGOAL_THEN `!i. i IN 1..dimindex (:N) ==> &0 <= EL (i - 1) w` (LABEL_TAC "w_ge0") THENL
\r
192 GEN_TAC THEN DISCH_TAC THEN REMOVE_THEN "domain" MP_TAC THEN new_rewrite [] [] pair_eq THEN
\r
193 REWRITE_TAC[m_cell_domain] THEN
\r
194 DISCH_THEN (MP_TAC o SPEC `i:num`) THEN ASM_REWRITE_TAC[] THEN
\r
195 ASM_SIMP_TAC[VECTOR_COMPONENT] THEN REAL_ARITH_TAC;
\r
198 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `s:real` THEN ASM_REWRITE_TAC[] THEN
\r
199 EXPAND_TAC "s" THEN
\r
200 new_rewrite [] [] ITLIST2_EQ_SUM THEN ASM_REWRITE_TAC[] THEN
\r
201 MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN
\r
202 move ["i"; "i_in"] THEN ASM_SIMP_TAC[VECTOR_COMPONENT] THEN
\r
203 USE_THEN "i_in" (ASSUME_TAC o REWRITE_RULE[IN_NUMSEG]) THEN
\r
204 MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[] THEN
\r
205 new_rewrite [] [] ITLIST2_EQ_SUM THEN ASM_REWRITE_TAC[] THENL
\r
207 REMOVE_THEN "ldd_all" MP_TAC THEN REWRITE_TAC[GSYM ALL_EL] THEN
\r
208 DISCH_THEN (MP_TAC o SPEC `i - 1`) THEN
\r
211 ASM_REWRITE_TAC[] THEN POP_ASSUM MP_TAC THEN ARITH_TAC;
\r
214 DISCH_THEN (fun th -> REWRITE_TAC[th]);
\r
217 MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN
\r
218 move ["j"; "j_in"] THEN ASM_SIMP_TAC[VECTOR_COMPONENT] THEN
\r
219 USE_THEN "j_in" (ASSUME_TAC o REWRITE_RULE[IN_NUMSEG]) THEN
\r
220 MATCH_MP_TAC REAL_LE_LMUL THEN ASM_SIMP_TAC[] THEN
\r
221 FIRST_X_ASSUM (MP_TAC o SPEC `x:real^N`) THEN ASM_REWRITE_TAC[ALL_N_EL] THEN
\r
222 DISCH_THEN (MP_TAC o SPEC `i - 1`) THEN ANTS_TAC THENL
\r
224 REMOVE_THEN "i_in" MP_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC;
\r
227 DISCH_THEN (MP_TAC o SPEC `j - 1`) THEN ANTS_TAC THENL
\r
229 REMOVE_THEN "ldd_all" MP_TAC THEN REWRITE_TAC[GSYM ALL_EL] THEN
\r
230 DISCH_THEN (new_rewrite [] []) THEN ASM_REWRITE_TAC[] THENL
\r
232 REMOVE_THEN "i_in" MP_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC;
\r
235 REMOVE_THEN "j_in" MP_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC;
\r
238 SUBGOAL_THEN `1 + j - 1 = j /\ 1 + i - 1 = i` (fun th -> REWRITE_TAC[th]) THENL
\r
240 REPLICATE_TAC 3 (POP_ASSUM MP_TAC) THEN ARITH_TAC;
\r
243 REWRITE_TAC[partial2] THEN
\r
244 DISCH_THEN (MP_TAC o MATCH_MP interval_arith_abs_le) THEN
\r
245 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[REAL_LE_REFL]);;
\r
248 let M_TAYLOR_ERROR_LIST_SUM2 = prove(`!f domain y w dd_bounds_list error.
\r
249 m_cell_domain domain y (vector w) ==>
\r
250 second_bounded (f:real^N->real) domain dd_bounds_list ==>
\r
251 LENGTH w = dimindex (:N) ==>
\r
252 LENGTH dd_bounds_list = dimindex (:N) ==>
\r
253 ALL (\list. LENGTH list = dimindex (:N)) dd_bounds_list ==>
\r
254 list_sum2 (error_mul_f1 w) w dd_bounds_list <= error ==>
\r
255 m_taylor_error f domain (vector w) error`,
\r
256 REWRITE_TAC[list_sum2; error_mul_f1; error_mul_f2; M_TAYLOR_ERROR_ITLIST2]);;
\r
260 (**********************************)
\r
262 let m_taylor_error_array = Array.init (max_dim + 1)
\r
263 (fun i -> if i < 1 then TRUTH else
\r
264 (MY_RULE_NUM o REWRITE_RULE[dimindex_array.(i)] o inst_first_type_var (n_type_array.(i)))
\r
265 M_TAYLOR_ERROR_LIST_SUM2);;
\r
268 let REFL_CONV tm =
\r
269 let rhs = rand tm in
\r
270 let th0 = EQT_INTRO (REFL rhs) in
\r
273 let eval_m_taylor_error n pp m_taylor_th =
\r
274 let domain_th, _, _, second_th = dest_m_taylor_thms n m_taylor_th in
\r
275 let f_tm = (rand o rator o rator o concl) second_th in
\r
276 let domain_tm, y_tm, w_tm = (dest_m_cell_domain o concl) domain_th in
\r
277 let dd_bounds_list = (rand o concl) second_th in
\r
278 let w_list = rand w_tm in
\r
279 let y_var = mk_var ("y", type_of y_tm) and
\r
280 f_var = mk_var ("f", type_of f_tm) and
\r
281 domain_var = mk_var ("domain", type_of domain_tm) in
\r
283 let th0 = (MY_PROVE_HYP domain_th o MY_PROVE_HYP second_th o
\r
284 INST[dd_bounds_list, dd_bounds_list_var; w_list, w_var_list;
\r
285 domain_tm, domain_var; y_tm, y_var; f_tm, f_var]) m_taylor_error_array.(n) in
\r
287 let len_dd = eval_length dd_bounds_list in
\r
288 let len_w = eval_length w_list in
\r
290 let th1 = (MY_PROVE_HYP len_dd o MY_PROVE_HYP len_w) th0 in
\r
291 let [all_tm; sum2_tm] = hyp th1 in
\r
292 let l_conv = (BETA_CONV THENC LAND_CONV length_conv THENC REFL_CONV) in
\r
293 let all_len = EQT_ELIM (all_conv_univ l_conv all_tm) in
\r
294 let sum2_le_th = list_sum2_le_conv pp (error_mul_f1_le_conv w_list) (lhand sum2_tm) in
\r
295 let error_tm = (rand o concl) sum2_le_th in
\r
296 (MY_PROVE_HYP all_len o MY_PROVE_HYP sum2_le_th o INST[error_tm, error_var]) th1;;
\r
299 (**********************)
\r
300 (* taylor_upper_bound *)
\r
304 let M_TAYLOR_UPPER_BOUND' = prove(`m_cell_domain domain (y:real^N) (vector w) /\
\r
305 diff2c_domain domain f /\
\r
306 m_lin_approx f y (f_lo, f_hi) d_bounds_list /\
\r
307 m_taylor_error f domain (vector w) error /\
\r
308 list_sum2 error_mul_f2 w d_bounds_list <= b /\
\r
309 b + inv(&2) * error <= a /\
\r
311 LENGTH w = dimindex (:N) /\ LENGTH d_bounds_list = dimindex (:N) ==>
\r
312 (!p. p IN interval [domain] ==> f p <= hi)`,
\r
313 REWRITE_TAC[m_lin_approx; interval_arith; list_sum2; error_mul_f2; ALL_N_EL] THEN
\r
314 set_tac "s" `ITLIST2 _1 _2 _3 _4` THEN STRIP_TAC THEN
\r
315 SUBGOAL_THEN `diff2_domain domain (f:real^N->real)` ASSUME_TAC THENL
\r
317 UNDISCH_TAC `diff2c_domain domain (f:real^N->real)` THEN
\r
318 SIMP_TAC[diff2_domain; diff2c_domain; diff2c];
\r
321 apply_tac m_taylor_upper_bound THEN
\r
322 MAP_EVERY EXISTS_TAC [`y:real^N`; `vector w:real^N`; `error:real`; `f_hi:real`] THEN
\r
323 ASM_REWRITE_TAC[] THEN
\r
324 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `f_hi + a:real` THEN
\r
325 ASM_REWRITE_TAC[real_div] THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
\r
326 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN ASM_REWRITE_TAC[REAL_LE_REFL] THEN
\r
327 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `b + inv (&2) * error` THEN
\r
328 ASM_REWRITE_TAC[] THEN
\r
329 MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_REWRITE_TAC[REAL_LE_REFL] THEN
\r
330 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `s:real` THEN ASM_REWRITE_TAC[] THEN
\r
331 EXPAND_TAC "s" THEN new_rewrite [] [] ITLIST2_EQ_SUM THEN ASM_REWRITE_TAC[] THEN
\r
332 MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN REPEAT STRIP_TAC THEN
\r
333 new_rewrite [] [] REAL_MUL_SYM THEN
\r
334 MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[VECTOR_COMPONENT; REAL_LE_REFL; REAL_ABS_POS] THEN
\r
337 UNDISCH_TAC `m_cell_domain domain (y:real^N) (vector w)` THEN
\r
338 new_rewrite [] [] pair_eq THEN REWRITE_TAC[m_cell_domain] THEN
\r
339 DISCH_THEN (MP_TAC o SPEC `x:num`) THEN ASM_REWRITE_TAC[] THEN
\r
340 ASM_SIMP_TAC[VECTOR_COMPONENT] THEN REAL_ARITH_TAC;
\r
343 FIRST_X_ASSUM (MP_TAC o SPEC `x - 1`) THEN
\r
346 POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC;
\r
349 DISCH_THEN (MP_TAC o MATCH_MP interval_arith_abs_le) THEN
\r
350 SUBGOAL_THEN `1 + x - 1 = x` (fun th -> REWRITE_TAC[th]) THENL
\r
352 POP_ASSUM MP_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC;
\r
355 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[REAL_LE_REFL]);;
\r
359 let M_TAYLOR_LOWER_BOUND' = prove(`m_cell_domain domain (y:real^N) (vector w) /\
\r
360 diff2c_domain domain f /\
\r
361 m_lin_approx f y (f_lo, f_hi) d_bounds_list /\
\r
362 m_taylor_error f domain (vector w) error /\
\r
363 list_sum2 error_mul_f2 w d_bounds_list <= b /\
\r
364 b + inv(&2) * error <= a /\
\r
366 LENGTH w = dimindex (:N) /\ LENGTH d_bounds_list = dimindex (:N) ==>
\r
367 (!p. p IN interval [domain] ==> lo <= f p)`,
\r
368 REWRITE_TAC[m_lin_approx; interval_arith; list_sum2; error_mul_f2; ALL_N_EL] THEN
\r
369 set_tac "s" `ITLIST2 _1 _2 _3 _4` THEN STRIP_TAC THEN
\r
370 SUBGOAL_THEN `diff2_domain domain (f:real^N->real)` ASSUME_TAC THENL
\r
372 UNDISCH_TAC `diff2c_domain domain (f:real^N->real)` THEN
\r
373 SIMP_TAC[diff2_domain; diff2c_domain; diff2c];
\r
376 apply_tac m_taylor_lower_bound THEN
\r
377 MAP_EVERY EXISTS_TAC [`y:real^N`; `vector w:real^N`; `error:real`; `f_lo:real`] THEN
\r
378 ASM_REWRITE_TAC[] THEN
\r
379 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `f_lo - a:real` THEN
\r
380 ASM_REWRITE_TAC[real_div; real_sub] THEN MATCH_MP_TAC REAL_LE_ADD2 THEN
\r
381 ASM_REWRITE_TAC[REAL_LE_REFL; REAL_LE_NEG] THEN
\r
382 ONCE_REWRITE_TAC[REAL_MUL_SYM] THEN
\r
383 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `b + inv (&2) * error` THEN
\r
384 ASM_REWRITE_TAC[] THEN
\r
385 MATCH_MP_TAC REAL_LE_ADD2 THEN ASM_REWRITE_TAC[REAL_LE_REFL] THEN
\r
386 MATCH_MP_TAC REAL_LE_TRANS THEN EXISTS_TAC `s:real` THEN ASM_REWRITE_TAC[] THEN
\r
387 EXPAND_TAC "s" THEN new_rewrite [] [] ITLIST2_EQ_SUM THEN ASM_REWRITE_TAC[] THEN
\r
388 MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN REPEAT STRIP_TAC THEN
\r
389 new_rewrite [] [] REAL_MUL_SYM THEN
\r
390 MATCH_MP_TAC REAL_LE_MUL2 THEN ASM_SIMP_TAC[VECTOR_COMPONENT; REAL_LE_REFL; REAL_ABS_POS] THEN
\r
393 UNDISCH_TAC `m_cell_domain domain (y:real^N) (vector w)` THEN
\r
394 new_rewrite [] [] pair_eq THEN REWRITE_TAC[m_cell_domain] THEN
\r
395 DISCH_THEN (MP_TAC o SPEC `x:num`) THEN ASM_REWRITE_TAC[] THEN
\r
396 ASM_SIMP_TAC[VECTOR_COMPONENT] THEN REAL_ARITH_TAC;
\r
399 FIRST_X_ASSUM (MP_TAC o SPEC `x - 1`) THEN
\r
402 POP_ASSUM MP_TAC THEN ASM_REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC;
\r
405 DISCH_THEN (MP_TAC o MATCH_MP interval_arith_abs_le) THEN
\r
406 SUBGOAL_THEN `1 + x - 1 = x` (fun th -> REWRITE_TAC[th]) THENL
\r
408 POP_ASSUM MP_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN ARITH_TAC;
\r
411 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[REAL_LE_REFL]);;
\r
415 let M_TAYLOR_BOUND' =
\r
416 prove(`m_cell_domain domain (y:real^N) (vector w) /\
\r
417 diff2c_domain domain f /\
\r
418 m_lin_approx f y (f_lo, f_hi) d_bounds_list /\
\r
419 m_taylor_error f domain (vector w) error /\
\r
420 list_sum2 error_mul_f2 w d_bounds_list <= b /\
\r
421 b + inv(&2) * error <= a /\
\r
424 LENGTH w = dimindex (:N) /\ LENGTH d_bounds_list = dimindex (:N) ==>
\r
425 (!x. x IN interval [domain] ==> interval_arith (f x) (lo, hi))`,
\r
426 REPEAT STRIP_TAC THEN REWRITE_TAC[interval_arith] THEN
\r
427 MP_TAC M_TAYLOR_UPPER_BOUND' THEN
\r
428 MP_TAC M_TAYLOR_LOWER_BOUND' THEN
\r
429 ASM_REWRITE_TAC[] THEN
\r
430 REPEAT (DISCH_THEN (MP_TAC o SPEC `x:real^N`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC));;
\r
436 let m_taylor_upper_array = Array.init (max_dim + 1)
\r
437 (fun i -> if i < 1 then TRUTH else
\r
438 (MY_RULE_NUM o REWRITE_RULE[dimindex_array.(i); float_inv2_th] o inst_first_type_var (n_type_array.(i)))
\r
439 M_TAYLOR_UPPER_BOUND');;
\r
442 let m_taylor_lower_array = Array.init (max_dim + 1)
\r
443 (fun i -> if i < 1 then TRUTH else
\r
444 (MY_RULE_NUM o REWRITE_RULE[dimindex_array.(i); float_inv2_th] o inst_first_type_var (n_type_array.(i)))
\r
445 M_TAYLOR_LOWER_BOUND');;
\r
448 let m_taylor_bound_array = Array.init (max_dim + 1)
\r
449 (fun i -> if i < 1 then TRUTH else
\r
450 (MY_RULE_NUM o REWRITE_RULE[dimindex_array.(i); float_inv2_th] o inst_first_type_var (n_type_array.(i)))
\r
456 let b_var_real = `b:real`;;
\r
458 let eval_m_taylor_upper_bound n pp m_taylor_th =
\r
459 let domain_th, diff_th, lin_th, _ = dest_m_taylor_thms n m_taylor_th in
\r
460 let error_th = eval_m_taylor_error n pp m_taylor_th in
\r
462 let f_tm, _, f_bounds, d_bounds_list = dest_lin_approx (concl lin_th) and
\r
463 domain_tm, y_tm, w_tm = (dest_m_cell_domain o concl) domain_th and
\r
464 error_tm = (rand o concl) error_th in
\r
465 let w_list = rand w_tm and
\r
466 f_lo, f_hi = dest_pair f_bounds in
\r
468 let y_var = mk_var ("y", type_of y_tm) and
\r
469 f_var = mk_var ("f", type_of f_tm) and
\r
470 domain_var = mk_var ("domain", type_of domain_tm) in
\r
472 let th0 = (MY_PROVE_HYP domain_th o MY_PROVE_HYP diff_th o
\r
473 MY_PROVE_HYP lin_th o MY_PROVE_HYP error_th o
\r
474 INST[d_bounds_list, d_bounds_list_var; w_list, w_var_list;
\r
475 f_lo, f_lo_var; f_hi, f_hi_var; error_tm, error_var;
\r
476 domain_tm, domain_var; y_tm, y_var; f_tm, f_var]) m_taylor_upper_array.(n) in
\r
478 let len_d_th = eval_length d_bounds_list and
\r
479 len_w_th = eval_length w_list in
\r
480 let th1 = (MY_PROVE_HYP len_d_th o MY_PROVE_HYP len_w_th) th0 in
\r
482 let sum2_tm = (C List.nth 2 o hyp) th1 in
\r
483 let sum2_le_th = list_sum2_le_conv pp error_mul_f2_le_conv2 (lhand sum2_tm) in
\r
484 let b_tm = (rand o concl) sum2_le_th in
\r
487 let ( * ), ( + ) = float_mul_hi pp, add_ineq_hi pp in
\r
488 mk_refl_ineq b_tm + float_inv2 * error_tm in
\r
490 let a_tm = (rand o concl) ineq1_th in
\r
491 let ineq2_th = float_add_hi pp f_hi a_tm in
\r
492 let hi_tm = (rand o concl) ineq2_th in
\r
493 (MY_PROVE_HYP ineq2_th o MY_PROVE_HYP ineq1_th o MY_PROVE_HYP sum2_le_th o
\r
494 INST[a_tm, a_var_real; b_tm, b_var_real; hi_tm, hi_var_real]) th1;;
\r
498 let eval_m_taylor_lower_bound n pp m_taylor_th =
\r
499 let domain_th, diff_th, lin_th, _ = dest_m_taylor_thms n m_taylor_th in
\r
500 let error_th = eval_m_taylor_error n pp m_taylor_th in
\r
502 let f_tm, _, f_bounds, d_bounds_list = dest_lin_approx (concl lin_th) and
\r
503 domain_tm, y_tm, w_tm = (dest_m_cell_domain o concl) domain_th and
\r
504 error_tm = (rand o concl) error_th in
\r
505 let w_list = rand w_tm and
\r
506 f_lo, f_hi = dest_pair f_bounds in
\r
508 let y_var = mk_var ("y", type_of y_tm) and
\r
509 f_var = mk_var ("f", type_of f_tm) and
\r
510 domain_var = mk_var ("domain", type_of domain_tm) in
\r
512 let th0 = (MY_PROVE_HYP domain_th o MY_PROVE_HYP diff_th o
\r
513 MY_PROVE_HYP lin_th o MY_PROVE_HYP error_th o
\r
514 INST[d_bounds_list, d_bounds_list_var; w_list, w_var_list;
\r
515 f_lo, f_lo_var; f_hi, f_hi_var; error_tm, error_var;
\r
516 domain_tm, domain_var; y_tm, y_var; f_tm, f_var]) m_taylor_lower_array.(n) in
\r
518 let len_d_th = eval_length d_bounds_list and
\r
519 len_w_th = eval_length w_list in
\r
520 let th1 = (MY_PROVE_HYP len_d_th o MY_PROVE_HYP len_w_th) th0 in
\r
522 let sum2_tm = (C List.nth 2 o hyp) th1 in
\r
523 let sum2_le_th = list_sum2_le_conv pp error_mul_f2_le_conv2 (lhand sum2_tm) in
\r
524 let b_tm = (rand o concl) sum2_le_th in
\r
527 let ( * ), ( + ) = float_mul_hi pp, add_ineq_hi pp in
\r
528 mk_refl_ineq b_tm + float_inv2 * error_tm in
\r
530 let a_tm = (rand o concl) ineq1_th in
\r
531 let ineq2_th = float_sub_lo pp f_lo a_tm in
\r
532 let lo_tm = (lhand o concl) ineq2_th in
\r
534 (MY_PROVE_HYP ineq2_th o MY_PROVE_HYP ineq1_th o MY_PROVE_HYP sum2_le_th o
\r
535 INST[a_tm, a_var_real; b_tm, b_var_real; lo_tm, lo_var_real]) th1;;
\r
540 let eval_m_taylor_bound n pp m_taylor_th =
\r
541 let domain_th, diff_th, lin_th, _ = dest_m_taylor_thms n m_taylor_th in
\r
542 let error_th = eval_m_taylor_error n pp m_taylor_th in
\r
544 let f_tm, _, f_bounds, d_bounds_list = dest_lin_approx (concl lin_th) and
\r
545 domain_tm, y_tm, w_tm = (dest_m_cell_domain o concl) domain_th and
\r
546 error_tm = (rand o concl) error_th in
\r
547 let w_list = rand w_tm and
\r
548 f_lo, f_hi = dest_pair f_bounds in
\r
550 let y_var = mk_var ("y", type_of y_tm) and
\r
551 f_var = mk_var ("f", type_of f_tm) and
\r
552 domain_var = mk_var ("domain", type_of domain_tm) in
\r
554 let th0 = (MY_PROVE_HYP domain_th o MY_PROVE_HYP diff_th o
\r
555 MY_PROVE_HYP lin_th o MY_PROVE_HYP error_th o
\r
556 INST[d_bounds_list, d_bounds_list_var; w_list, w_var_list;
\r
557 f_lo, f_lo_var; f_hi, f_hi_var; error_tm, error_var;
\r
558 domain_tm, domain_var; y_tm, y_var; f_tm, f_var]) m_taylor_bound_array.(n) in
\r
560 let len_d_th = eval_length d_bounds_list and
\r
561 len_w_th = eval_length w_list in
\r
562 let th1 = (MY_PROVE_HYP len_d_th o MY_PROVE_HYP len_w_th) th0 in
\r
564 let sum2_tm = (C List.nth 3 o hyp) th1 in
\r
565 let sum2_le_th = list_sum2_le_conv pp error_mul_f2_le_conv2 (lhand sum2_tm) in
\r
566 let b_tm = (rand o concl) sum2_le_th in
\r
569 let ( * ), ( + ) = float_mul_hi pp, add_ineq_hi pp in
\r
570 mk_refl_ineq b_tm + float_inv2 * error_tm in
\r
572 let a_tm = (rand o concl) ineq1_th in
\r
573 let ineq2_th = float_add_hi pp f_hi a_tm in
\r
574 let hi_tm = (rand o concl) ineq2_th in
\r
576 let ineq3_th = float_sub_lo pp f_lo a_tm in
\r
577 let lo_tm = (lhand o concl) ineq3_th in
\r
579 (MY_PROVE_HYP ineq3_th o MY_PROVE_HYP ineq2_th o
\r
580 MY_PROVE_HYP ineq1_th o MY_PROVE_HYP sum2_le_th o
\r
581 INST[a_tm, a_var_real; b_tm, b_var_real; hi_tm, hi_var_real; lo_tm, lo_var_real]) th1;;
\r
583 (******************************)
\r
584 (* taylor_upper_partial_bound *)
\r
585 (* taylor_lower_partial_bound *)
\r
589 let M_TAYLOR_UPPER_PARTIAL_BOUND' =
\r
590 prove(`m_taylor_interval f domain (y:real^N) (vector w) f_bounds d_bounds_list dd_bounds_list /\
\r
591 i IN 1..dimindex (:N) /\
\r
592 EL (i - 1) d_bounds_list = (df_lo, df_hi) /\
\r
593 EL (i - 1) dd_bounds_list = dd_list /\
\r
594 LENGTH d_bounds_list = dimindex (:N) /\
\r
595 LENGTH dd_bounds_list = dimindex (:N) /\
\r
596 LENGTH dd_list = dimindex (:N) /\ LENGTH w = dimindex (:N) /\
\r
597 list_sum2 error_mul_f2 w dd_list <= error /\
\r
598 df_hi + error <= hi ==>
\r
599 (!p. p IN interval [domain] ==> partial i f p <= hi)`,
\r
600 REWRITE_TAC[m_taylor_interval; m_lin_approx; second_bounded; ALL_N_EL] THEN STRIP_TAC THEN
\r
601 SUBGOAL_THEN `1 <= i /\ i <= dimindex (:N)` (LABEL_TAC "i_in") THENL
\r
603 ASM_REWRITE_TAC[GSYM IN_NUMSEG];
\r
606 SUBGOAL_THEN `diff2_domain domain (f:real^N->real)` ASSUME_TAC THENL
\r
608 UNDISCH_TAC `diff2c_domain domain (f:real^N->real)` THEN
\r
609 SIMP_TAC[diff2_domain; diff2c_domain; diff2c];
\r
612 apply_tac m_taylor_upper_partial_bound THEN
\r
613 MAP_EVERY EXISTS_TAC [`y:real^N`; `vector w:real^N`; `error:real`; `df_hi:real`] THEN
\r
614 ASM_REWRITE_TAC[] THEN
\r
615 FIRST_X_ASSUM (MP_TAC o SPEC `i - 1`) THEN
\r
616 ASM_SIMP_TAC[ARITH_RULE `1 <= i /\ i <= n ==> i - 1 < n`] THEN
\r
617 ASM_SIMP_TAC[ARITH_RULE `1 <= i ==> 1 + i - 1 = i`; interval_arith] THEN
\r
618 DISCH_THEN (fun th -> ALL_TAC) THEN
\r
619 REWRITE_TAC[m_taylor_partial_error] THEN REPEAT STRIP_TAC THEN
\r
620 UNDISCH_TAC `list_sum2 error_mul_f2 w dd_list <= error` THEN
\r
621 REWRITE_TAC[list_sum2; error_mul_f2] THEN
\r
622 MATCH_MP_TAC (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS) THEN
\r
623 new_rewrite [] [] ITLIST2_EQ_SUM THEN ASM_REWRITE_TAC[] THEN
\r
624 MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN
\r
625 move ["j"; "j_in"] THEN
\r
626 ASM_SIMP_TAC[VECTOR_COMPONENT] THEN
\r
627 MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL
\r
629 UNDISCH_TAC `m_cell_domain domain (y:real^N) (vector w)` THEN
\r
630 new_rewrite [] [] pair_eq THEN REWRITE_TAC[m_cell_domain] THEN
\r
631 DISCH_THEN (MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[] THEN
\r
632 ASM_SIMP_TAC[VECTOR_COMPONENT] THEN REAL_ARITH_TAC;
\r
635 FIRST_X_ASSUM (MP_TAC o SPEC `x:real^N`) THEN ASM_REWRITE_TAC[] THEN
\r
636 DISCH_THEN (MP_TAC o SPEC `i - 1`) THEN
\r
637 ASM_SIMP_TAC[ARITH_RULE `1 <= i /\ i <= n ==> i - 1 < n`] THEN
\r
638 DISCH_THEN (MP_TAC o SPEC `j - 1`) THEN
\r
639 FIRST_ASSUM MP_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN DISCH_TAC THEN
\r
640 ASM_SIMP_TAC[ARITH_RULE `1 <= j /\ j <= n ==> j - 1 < n`] THEN
\r
641 ASM_SIMP_TAC[ARITH_RULE `!i. 1 <= i ==> 1 + i - 1 = i`; GSYM partial2] THEN
\r
642 DISCH_THEN (MP_TAC o MATCH_MP interval_arith_abs_le) THEN
\r
643 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[REAL_LE_REFL]);;
\r
647 let M_TAYLOR_LOWER_PARTIAL_BOUND' =
\r
648 prove(`m_taylor_interval f domain (y:real^N) (vector w) f_bounds d_bounds_list dd_bounds_list /\
\r
649 i IN 1..dimindex (:N) /\
\r
650 EL (i - 1) d_bounds_list = (df_lo, df_hi) /\
\r
651 EL (i - 1) dd_bounds_list = dd_list /\
\r
652 LENGTH d_bounds_list = dimindex (:N) /\
\r
653 LENGTH dd_bounds_list = dimindex (:N) /\
\r
654 LENGTH dd_list = dimindex (:N) /\ LENGTH w = dimindex (:N) /\
\r
655 list_sum2 error_mul_f2 w dd_list <= error /\
\r
656 lo <= df_lo - error ==>
\r
657 (!p. p IN interval [domain] ==> lo <= partial i f p)`,
\r
658 REWRITE_TAC[m_taylor_interval; m_lin_approx; second_bounded; ALL_N_EL] THEN STRIP_TAC THEN
\r
659 SUBGOAL_THEN `1 <= i /\ i <= dimindex (:N)` (LABEL_TAC "i_in") THENL
\r
661 ASM_REWRITE_TAC[GSYM IN_NUMSEG];
\r
664 SUBGOAL_THEN `diff2_domain domain (f:real^N->real)` ASSUME_TAC THENL
\r
666 UNDISCH_TAC `diff2c_domain domain (f:real^N->real)` THEN
\r
667 SIMP_TAC[diff2_domain; diff2c_domain; diff2c];
\r
670 apply_tac m_taylor_lower_partial_bound THEN
\r
671 MAP_EVERY EXISTS_TAC [`y:real^N`; `vector w:real^N`; `error:real`; `df_lo:real`] THEN
\r
672 ASM_REWRITE_TAC[] THEN
\r
673 FIRST_X_ASSUM (MP_TAC o SPEC `i - 1`) THEN
\r
674 ASM_SIMP_TAC[ARITH_RULE `1 <= i /\ i <= n ==> i - 1 < n`] THEN
\r
675 ASM_SIMP_TAC[ARITH_RULE `1 <= i ==> 1 + i - 1 = i`; interval_arith] THEN
\r
676 DISCH_THEN (fun th -> ALL_TAC) THEN
\r
677 REWRITE_TAC[m_taylor_partial_error] THEN REPEAT STRIP_TAC THEN
\r
678 UNDISCH_TAC `list_sum2 error_mul_f2 w dd_list <= error` THEN
\r
679 REWRITE_TAC[list_sum2; error_mul_f2] THEN
\r
680 MATCH_MP_TAC (REWRITE_RULE[GSYM IMP_IMP] REAL_LE_TRANS) THEN
\r
681 new_rewrite [] [] ITLIST2_EQ_SUM THEN ASM_REWRITE_TAC[] THEN
\r
682 MATCH_MP_TAC SUM_LE THEN REWRITE_TAC[FINITE_NUMSEG] THEN
\r
683 move ["j"; "j_in"] THEN
\r
684 ASM_SIMP_TAC[VECTOR_COMPONENT] THEN
\r
685 MATCH_MP_TAC REAL_LE_LMUL THEN CONJ_TAC THENL
\r
687 UNDISCH_TAC `m_cell_domain domain (y:real^N) (vector w)` THEN
\r
688 new_rewrite [] [] pair_eq THEN REWRITE_TAC[m_cell_domain] THEN
\r
689 DISCH_THEN (MP_TAC o SPEC `j:num`) THEN ASM_REWRITE_TAC[] THEN
\r
690 ASM_SIMP_TAC[VECTOR_COMPONENT] THEN REAL_ARITH_TAC;
\r
693 FIRST_X_ASSUM (MP_TAC o SPEC `x:real^N`) THEN ASM_REWRITE_TAC[] THEN
\r
694 DISCH_THEN (MP_TAC o SPEC `i - 1`) THEN
\r
695 ASM_SIMP_TAC[ARITH_RULE `1 <= i /\ i <= n ==> i - 1 < n`] THEN
\r
696 DISCH_THEN (MP_TAC o SPEC `j - 1`) THEN
\r
697 FIRST_ASSUM MP_TAC THEN REWRITE_TAC[IN_NUMSEG] THEN DISCH_TAC THEN
\r
698 ASM_SIMP_TAC[ARITH_RULE `1 <= j /\ j <= n ==> j - 1 < n`] THEN
\r
699 ASM_SIMP_TAC[ARITH_RULE `!i. 1 <= i ==> 1 + i - 1 = i`; GSYM partial2] THEN
\r
700 DISCH_THEN (MP_TAC o MATCH_MP interval_arith_abs_le) THEN
\r
701 DISCH_THEN MATCH_MP_TAC THEN REWRITE_TAC[REAL_LE_REFL]);;
\r
704 let M_TAYLOR_PARTIAL_BOUND' =
\r
705 prove(`m_taylor_interval f domain (y:real^N) (vector w) f_bounds d_bounds_list dd_bounds_list /\
\r
706 i IN 1..dimindex (:N) /\
\r
707 EL (i - 1) d_bounds_list = (df_lo, df_hi) /\
\r
708 EL (i - 1) dd_bounds_list = dd_list /\
\r
709 LENGTH d_bounds_list = dimindex (:N) /\
\r
710 LENGTH dd_bounds_list = dimindex (:N) /\
\r
711 LENGTH dd_list = dimindex (:N) /\ LENGTH w = dimindex (:N) /\
\r
712 list_sum2 error_mul_f2 w dd_list <= error /\
\r
713 df_hi + error <= hi ==>
\r
714 lo <= df_lo - error ==>
\r
715 (!x. x IN interval [domain] ==> interval_arith (partial i f x) (lo, hi))`,
\r
716 REPEAT STRIP_TAC THEN
\r
717 REWRITE_TAC[interval_arith] THEN
\r
718 MP_TAC M_TAYLOR_UPPER_PARTIAL_BOUND' THEN
\r
719 MP_TAC M_TAYLOR_LOWER_PARTIAL_BOUND' THEN
\r
720 ASM_REWRITE_TAC[] THEN
\r
721 REPEAT (DISCH_THEN (MP_TAC o SPEC `x:real^N`) THEN ASM_REWRITE_TAC[] THEN DISCH_TAC));;
\r
725 (* The (n, i)-th element is the theorem |- i IN 1..dimindex (:n) *)
\r
726 let i_in_array = Array.init (max_dim + 1)
\r
727 (fun i -> Array.init (i + 1)
\r
729 if j < 1 then TRUTH else
\r
730 let j_tm = mk_small_numeral j in
\r
731 let tm0 = `j IN 1..dimindex (:N)` in
\r
732 let tm1 = (subst [j_tm, `j:num`] o inst [n_type_array.(i), nty]) tm0 in
\r
733 prove(tm1, REWRITE_TAC[dimindex_array.(i); IN_NUMSEG] THEN ARITH_TAC)));;
\r
736 let m_taylor_upper_partial_array = Array.init (max_dim + 1)
\r
737 (fun i -> Array.init (i + 1)
\r
739 if j < 1 then TRUTH else
\r
740 let j_tm = mk_small_numeral j in
\r
741 (MY_RULE_NUM o CONV_RULE NUM_REDUCE_CONV o REWRITE_RULE[dimindex_array.(i); IN_NUMSEG] o
\r
742 INST[j_tm, `i:num`] o inst_first_type_var n_type_array.(i))
\r
743 M_TAYLOR_UPPER_PARTIAL_BOUND'));;
\r
746 let m_taylor_lower_partial_array = Array.init (max_dim + 1)
\r
747 (fun i -> Array.init (i + 1)
\r
749 if j < 1 then TRUTH else
\r
750 let j_tm = mk_small_numeral j in
\r
751 (MY_RULE_NUM o CONV_RULE NUM_REDUCE_CONV o REWRITE_RULE[dimindex_array.(i); IN_NUMSEG] o
\r
752 INST[j_tm, `i:num`] o inst_first_type_var n_type_array.(i))
\r
753 M_TAYLOR_LOWER_PARTIAL_BOUND'));;
\r
755 let m_taylor_interval_partial_array = Array.init (max_dim + 1)
\r
756 (fun i -> Array.init (i + 1)
\r
758 if j < 1 then TRUTH else
\r
759 let j_tm = mk_small_numeral j in
\r
760 (MY_RULE_NUM o CONV_RULE NUM_REDUCE_CONV o REWRITE_RULE[dimindex_array.(i); IN_NUMSEG] o
\r
761 INST[j_tm, `i:num`] o inst_first_type_var n_type_array.(i))
\r
762 M_TAYLOR_PARTIAL_BOUND'));;
\r
765 (* upper_partial *)
\r
766 let eval_m_taylor_upper_partial n pp i m_taylor_th =
\r
767 let f_tm, domain_tm, y_tm, w_tm, f_bounds, d_bounds_list, dd_bounds_list =
\r
768 dest_m_taylor (concl m_taylor_th) in
\r
769 let w_list = rand w_tm in
\r
770 let y_var = mk_var ("y", type_of y_tm) and
\r
771 f_var = mk_var ("f", type_of f_tm) and
\r
772 domain_var = mk_var ("domain", type_of domain_tm) in
\r
774 let th0 = (MY_PROVE_HYP m_taylor_th o
\r
775 INST[dd_bounds_list, dd_bounds_list_var; d_bounds_list, d_bounds_list_var;
\r
776 w_list, w_var_list; f_bounds, f_bounds_var;
\r
777 domain_tm, domain_var; y_tm, y_var; f_tm, f_var]) m_taylor_upper_partial_array.(n).(i) in
\r
779 let el_dd_list_tm = (hd o hyp) th0 in
\r
780 let dd_list_th = el_conv (lhand el_dd_list_tm) in
\r
781 let dd_list_tm = (rand o concl) dd_list_th in
\r
783 let len_dd_list_th = eval_length dd_list_tm and
\r
784 len_dd_th = eval_length dd_bounds_list and
\r
785 len_d_th = eval_length d_bounds_list and
\r
786 len_w_th = eval_length w_list in
\r
787 let th1 = (MY_PROVE_HYP len_dd_list_th o MY_PROVE_HYP len_dd_th o MY_PROVE_HYP len_d_th o
\r
788 MY_PROVE_HYP len_w_th o MY_PROVE_HYP dd_list_th o
\r
789 INST[dd_list_tm, dd_list_var]) th0 in
\r
791 let el_d_list_tm = (hd o hyp) th1 in
\r
792 let d_list_th = el_conv (lhand el_d_list_tm) in
\r
793 let df_lo, df_hi = (dest_pair o rand o concl) d_list_th in
\r
794 let th2 = (MY_PROVE_HYP d_list_th o INST[df_lo, df_lo_var; df_hi, df_hi_var]) th1 in
\r
796 let sum2_tm = (C List.nth 1 o hyp) th2 in
\r
797 let sum2_le_th = list_sum2_le_conv pp error_mul_f2_le_conv2 (lhand sum2_tm) in
\r
798 let error_tm = (rand o concl) sum2_le_th in
\r
800 let ineq1_th = float_add_hi pp df_hi error_tm in
\r
801 let hi_tm = (rand o concl) ineq1_th in
\r
802 (MY_PROVE_HYP ineq1_th o MY_PROVE_HYP sum2_le_th o
\r
803 INST[error_tm, error_var; hi_tm, hi_var_real]) th2;;
\r
806 (* lower_partial *)
\r
807 let eval_m_taylor_lower_partial n pp i m_taylor_th =
\r
808 let f_tm, domain_tm, y_tm, w_tm, f_bounds, d_bounds_list, dd_bounds_list =
\r
809 dest_m_taylor (concl m_taylor_th) in
\r
810 let w_list = rand w_tm in
\r
811 let y_var = mk_var ("y", type_of y_tm) and
\r
812 f_var = mk_var ("f", type_of f_tm) and
\r
813 domain_var = mk_var ("domain", type_of domain_tm) in
\r
815 let th0 = (MY_PROVE_HYP m_taylor_th o
\r
816 INST[dd_bounds_list, dd_bounds_list_var; d_bounds_list, d_bounds_list_var;
\r
817 w_list, w_var_list; f_bounds, f_bounds_var;
\r
818 domain_tm, domain_var; y_tm, y_var; f_tm, f_var]) m_taylor_lower_partial_array.(n).(i) in
\r
820 let el_dd_list_tm = (hd o hyp) th0 in
\r
821 let dd_list_th = el_conv (lhand el_dd_list_tm) in
\r
822 let dd_list_tm = (rand o concl) dd_list_th in
\r
824 let len_dd_list_th = eval_length dd_list_tm and
\r
825 len_dd_th = eval_length dd_bounds_list and
\r
826 len_d_th = eval_length d_bounds_list and
\r
827 len_w_th = eval_length w_list in
\r
828 let th1 = (MY_PROVE_HYP len_dd_list_th o MY_PROVE_HYP len_dd_th o MY_PROVE_HYP len_d_th o
\r
829 MY_PROVE_HYP len_w_th o MY_PROVE_HYP dd_list_th o
\r
830 INST[dd_list_tm, dd_list_var]) th0 in
\r
832 let el_d_list_tm = (hd o hyp) th1 in
\r
833 let d_list_th = el_conv (lhand el_d_list_tm) in
\r
834 let df_lo, df_hi = (dest_pair o rand o concl) d_list_th in
\r
835 let th2 = (MY_PROVE_HYP d_list_th o INST[df_lo, df_lo_var; df_hi, df_hi_var]) th1 in
\r
837 let sum2_tm = (C List.nth 1 o hyp) th2 in
\r
838 let sum2_le_th = list_sum2_le_conv pp error_mul_f2_le_conv2 (lhand sum2_tm) in
\r
839 let error_tm = (rand o concl) sum2_le_th in
\r
841 let ineq1_th = float_sub_lo pp df_lo error_tm in
\r
842 let lo_tm = (lhand o concl) ineq1_th in
\r
843 (MY_PROVE_HYP ineq1_th o MY_PROVE_HYP sum2_le_th o
\r
844 INST[error_tm, error_var; lo_tm, lo_var_real]) th2;;
\r
847 (* interval_partial *)
\r
848 let eval_m_taylor_interval_partial n pp i m_taylor_th =
\r
849 let f_tm, domain_tm, y_tm, w_tm, f_bounds, d_bounds_list, dd_bounds_list =
\r
850 dest_m_taylor (concl m_taylor_th) in
\r
851 let w_list = rand w_tm in
\r
852 let y_var = mk_var ("y", type_of y_tm) and
\r
853 f_var = mk_var ("f", type_of f_tm) and
\r
854 domain_var = mk_var ("domain", type_of domain_tm) in
\r
856 let th0 = (MY_PROVE_HYP m_taylor_th o
\r
857 INST[dd_bounds_list, dd_bounds_list_var; d_bounds_list, d_bounds_list_var;
\r
858 w_list, w_var_list; f_bounds, f_bounds_var;
\r
859 domain_tm, domain_var; y_tm, y_var; f_tm, f_var]) m_taylor_interval_partial_array.(n).(i) in
\r
861 let el_dd_list_tm = (hd o hyp) th0 in
\r
862 let dd_list_th = el_conv (lhand el_dd_list_tm) in
\r
863 let dd_list_tm = (rand o concl) dd_list_th in
\r
865 let len_dd_list_th = eval_length dd_list_tm and
\r
866 len_dd_th = eval_length dd_bounds_list and
\r
867 len_d_th = eval_length d_bounds_list and
\r
868 len_w_th = eval_length w_list in
\r
869 let th1 = (MY_PROVE_HYP len_dd_list_th o MY_PROVE_HYP len_dd_th o MY_PROVE_HYP len_d_th o
\r
870 MY_PROVE_HYP len_w_th o MY_PROVE_HYP dd_list_th o
\r
871 INST[dd_list_tm, dd_list_var]) th0 in
\r
873 let el_d_list_tm = (hd o hyp) th1 in
\r
874 let d_list_th = el_conv (lhand el_d_list_tm) in
\r
875 let df_lo, df_hi = (dest_pair o rand o concl) d_list_th in
\r
876 let th2 = (MY_PROVE_HYP d_list_th o INST[df_lo, df_lo_var; df_hi, df_hi_var]) th1 in
\r
878 let sum2_tm = (C List.nth 2 o hyp) th2 in
\r
879 let sum2_le_th = list_sum2_le_conv pp error_mul_f2_le_conv2 (lhand sum2_tm) in
\r
880 let error_tm = (rand o concl) sum2_le_th in
\r
882 let ineq1_th = float_sub_lo pp df_lo error_tm in
\r
883 let lo_tm = (lhand o concl) ineq1_th in
\r
884 let ineq2_th = float_add_hi pp df_hi error_tm in
\r
885 let hi_tm = (rand o concl) ineq2_th in
\r
886 (MY_PROVE_HYP ineq1_th o MY_PROVE_HYP ineq2_th o MY_PROVE_HYP sum2_le_th o
\r
887 INST[error_tm, error_var; lo_tm, lo_var_real; hi_tm, hi_var_real]) th2;;
\r