needs "../formal_lp/formal_interval/m_taylor_arith.hl";; let reset_all () = Arith_cache.reset_stat(); Arith_cache.reset_cache(); Arith_float.reset_stat(); Arith_float.reset_cache();; (*************) let pp = 4;; let poly1 = expr_to_vector_fun `x1 * x2 * x3 + x2 * (x4 + x5) pow 3`;; let n = (get_dim o fst o dest_abs) poly1;; let xx = `[-- &3; -- &3; -- &3; -- &3; -- &3]` and zz = `[&2; &2; &2; &2; &2]`;; let xx1 = convert_to_float_list n true xx and zz1 = convert_to_float_list n false zz;; let eval_poly, tf, ti = mk_verification_functions pp poly1 false `&0`;; let dom_th = mk_m_center_domain n pp xx1 zz1;; let th = eval_poly.taylor pp pp dom_th;; (* 100: 0.524 *) reset_all();; test 100 (eval_poly.taylor pp pp) dom_th;; (* 100: 0.512 *) test 100 (eval_poly.taylor pp pp) dom_th;; (************) (* 100: 4.120 *) reset_all();; test 100 (eval_m_taylor_add n pp pp th) th;; (* 100: 4.184 *) test 100 (eval_m_taylor_add n pp pp th) th;; (*****************) let p_lin = pp and p_second = pp and taylor1_th = th and taylor2_th = th;; (****************) let domain_th, diff2_f1_th, lin1_th, second1_th = dest_m_taylor_thms n taylor1_th;; let _, diff2_f2_th, lin2_th, second2_th = dest_m_taylor_thms n taylor2_th;; let f1_tm = (rand o concl) diff2_f1_th and f2_tm = (rand o concl) diff2_f2_th;; let domain_tm, y_tm, w_tm = dest_m_cell_domain (concl domain_th);; let ty = type_of y_tm;; let x_var = mk_var ("x", ty) and y_var = mk_var ("y", ty) and w_var = mk_var ("w", ty) and f_var = mk_var ("f", type_of f1_tm) and g_var = mk_var ("g", type_of f2_tm) and domain_var = mk_var ("domain", type_of domain_tm);; let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th and _, bounds2_th, df2_th = m_lin_approx_components n lin2_th;; let bounds_th = float_interval_add p_lin bounds1_th bounds2_th;; let bounds_tm = (rand o concl) bounds_th;; let add_lemma0 = (INST[f1_tm, f_var; f2_tm, g_var; y_tm, x_var] o INST_TYPE[n_type_array.(n), nty]) add_partial_lemma';; let add th1 th2 = let add_th = float_interval_add p_lin th1 th2 in let int_tm = rand (concl add_th) and i_tm = (rand o rator o rator o lhand) (concl th1) in let th0 = INST[i_tm, i_var_num; int_tm, int_var] add_lemma0 in EQ_MP th0 add_th;; let df_th = eval_all_n2 df1_th df2_th true add;; let d_bounds_list = (rand o rator o concl) df_th;; let dd1 = second_bounded_components n second1_th;; let dd2 = second_bounded_components n second2_th;; let add_second_lemma0 = (INST[f1_tm, f_var; f2_tm, g_var] o INST_TYPE[n_type_array.(n), nty]) add_second_lemma';; let add_second_lemma1 = (INST[f1_tm, f_var; f2_tm, g_var] o INST_TYPE[n_type_array.(n), nty]) add_second_lemma'';; let add_second2 th1 th2 = let i_tm = (rand o rator o concl) th1 in let th1, th2 = BETA_RULE th1, BETA_RULE th2 in let lemma = INST[i_tm, i_var_num] add_second_lemma0 in let add_second th1 th2 = let add_th = float_interval_add p_second th1 th2 in let int_tm = rand (concl add_th) and j_tm = (rand o rator o rator o rator o lhand) (concl th1) in let th0 = INST[j_tm, j_var_num; int_tm, int_var] lemma in EQ_MP th0 add_th in let add_th = eval_all_n2 th1 th2 true add_second in let list_tm = (rand o rator o concl) add_th in let lemma1 = INST[i_tm, i_var_num; list_tm, list_var_real_pair] add_second_lemma1 in EQ_MP lemma1 add_th;; let dd_th0 = eval_all_n2 dd1 dd2 false add_second2;; let dd_list = (rand o rator o concl) dd_th0;; let dd_th = GEN x_var (DISCH_ALL dd_th0);; let th = (MY_PROVE_HYP dd_th o MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP diff2_f2_th o MY_PROVE_HYP bounds_th o MY_PROVE_HYP df_th o MY_PROVE_HYP domain_th o INST[f1_tm, f_var; f2_tm, g_var; domain_tm, domain_var; y_tm, y_var; w_tm, w_var; bounds_tm, bounds_var; d_bounds_list, d_bounds_list_var; dd_list, dd_bounds_list_var] o INST_TYPE[n_type_array.(n), nty]) MK_M_TAYLOR_ADD';; let eq_th = binary_beta_gen_eq f1_tm f2_tm x_var add_op_real;; m_taylor_interval_norm th eq_th;; (********************) reset_all();; (* 0.028 *) test 100 (dest_m_taylor_thms n) taylor1_th;; (* 0.028 *) test 100 (dest_m_taylor_thms n) taylor2_th;; (* 0.000 *) let f () = let a =(rand o concl) diff2_f1_th and b = (rand o concl) diff2_f2_th in a, b;; test 100 f ();; (* 0.000 *) test 100 dest_m_cell_domain (concl domain_th);; (* 0.000 *) test 100 type_of y_tm;; (* 0.000 *) let f () = let x_var = mk_var ("x", ty) and y_var = mk_var ("y", ty) and w_var = mk_var ("w", ty) and f_var = mk_var ("f", type_of f1_tm) and g_var = mk_var ("g", type_of f2_tm) and domain_var = mk_var ("domain", type_of domain_tm) in x_var, y_var, w_var, f_var, g_var, domain_var;; test 100 f ();; (* 0.052 *) let f () = let _, bounds1_th, df1_th = m_lin_approx_components n lin1_th and _, bounds2_th, df2_th = m_lin_approx_components n lin2_th in bounds1_th, df1_th, bounds2_th, df2_th;; test 100 f ();; (* 0.012 *) test 100 (float_interval_add p_lin bounds1_th) bounds2_th;; (* 0.000 *) test 100 (rand o concl) bounds_th;; (* 0.008 *) test 100 (INST[f1_tm, f_var; f2_tm, g_var; y_tm, x_var] o INST_TYPE[n_type_array.(n), nty]) add_partial_lemma';; let add th1 th2 = let add_th = float_interval_add p_lin th1 th2 in let int_tm = rand (concl add_th) and i_tm = (rand o rator o rator o lhand) (concl th1) in let th0 = INST[i_tm, i_var_num; int_tm, int_var] add_lemma0 in EQ_MP th0 add_th;; (* 0.688 *) test 100 (eval_all_n2 df1_th df2_th true) add;; (* 0.000 *) test 100 (rand o rator o concl) df_th;; (* 0.044 *) test 100 (second_bounded_components n) second1_th;; (* 0.040 *) test 100 (second_bounded_components n) second2_th;; (* 0.011 *) test 100 (INST[f1_tm, f_var; f2_tm, g_var] o INST_TYPE[n_type_array.(n), nty]) add_second_lemma';; (* 0.020 *) test 100 (INST[f1_tm, f_var; f2_tm, g_var] o INST_TYPE[n_type_array.(n), nty]) add_second_lemma'';; let add_second2 th1 th2 = let i_tm = (rand o rator o concl) th1 in let th1, th2 = BETA_RULE th1, BETA_RULE th2 in let lemma = INST[i_tm, i_var_num] add_second_lemma0 in let add_second th1 th2 = let add_th = float_interval_add p_second th1 th2 in let int_tm = rand (concl add_th) and j_tm = (rand o rator o rator o rator o lhand) (concl th1) in let th0 = INST[j_tm, j_var_num; int_tm, int_var] lemma in EQ_MP th0 add_th in let add_th = eval_all_n2 th1 th2 true add_second in let list_tm = (rand o rator o concl) add_th in let lemma1 = INST[i_tm, i_var_num; list_tm, list_var_real_pair] add_second_lemma1 in EQ_MP lemma1 add_th;; (* 3.016 *) test 100 (eval_all_n2 dd1 dd2 false) add_second2;; (* 0.000 *) test 100 (rand o rator o concl) dd_th0;; (* 0.004 *) test 100 (GEN x_var o DISCH_ALL) dd_th0;; (* 0.096 *) test 100 (MY_PROVE_HYP dd_th o MY_PROVE_HYP diff2_f1_th o MY_PROVE_HYP diff2_f2_th o MY_PROVE_HYP bounds_th o MY_PROVE_HYP df_th o MY_PROVE_HYP domain_th o INST[f1_tm, f_var; f2_tm, g_var; domain_tm, domain_var; y_tm, y_var; w_tm, w_var; bounds_tm, bounds_var; d_bounds_list, d_bounds_list_var; dd_list, dd_bounds_list_var] o INST_TYPE[n_type_array.(n), nty]) MK_M_TAYLOR_ADD';; (* 0.000 *) test 100 (binary_beta_gen_eq f1_tm f2_tm x_var) add_op_real;; (* 0.004 *) test 100 (m_taylor_interval_norm th) eq_th;; (***********************) test 100 (eval_all_n2 df1_th df2_th true) add;; (* Constructs all_n n (map2 s list1 list2) *) let all_n1_th = df1_th and all_n2_th = df2_th and beta_flag = true and s = add;; (***) let ths1', suc_ths = all_n_components all_n1_th;; let ths2', _ = all_n_components all_n2_th;; let ths1, ths2 = if beta_flag then map BETA_RULE ths1', map BETA_RULE ths2' else ths1', ths2';; let ths1, ths2, suc_ths = List.rev ths1, List.rev ths2, List.rev suc_ths;; let ths = map2 s ths1 ths2;; build_all_n ths suc_ths;; (***) (* 0.040 *) test 100 all_n_components all_n1_th;; (* 0.052 *) test 100 all_n_components all_n2_th;; (* 0.244 *) test 100 (map BETA_RULE) ths1';; (* 0.240 *) test 100 (map BETA_RULE) ths2';; hd ths1';; BETA_RULE (hd ths1');; (* 0.000 *) let f () = let ths1, ths2, suc_ths = List.rev ths1, List.rev ths2, List.rev suc_ths in ths1, ths2, suc_ths;; test 100 f ();; (* 0.052 *) test 100 (map2 s ths1) ths2;; (* 0.056 *) test 100 (build_all_n ths) suc_ths;; (*************) let th0 = hd ths1';; BETA_RULE th0;; (* 0.436 *) test 1000 BETA_RULE th0;; let MY_BETA_RULE th = let rec beta tm = let op, arg = dest_comb tm in if is_comb op then let op_th = AP_THM (beta op) arg in let beta_th = BETA_CONV (rand (concl op_th)) in TRANS op_th beta_th else BETA_CONV tm in EQ_MP (beta (concl th)) th;; let MY_BETA_RULE2 th0 = let c = concl th0 in let lhs, rhs = dest_comb c in let th1 = BETA_CONV lhs in let th2 = AP_THM th1 rhs in let th3 = BETA_CONV (rand (concl th2)) in EQ_MP (TRANS th2 th3) th0;; MY_BETA_RULE2 th0;; (* 0.036 *) test 1000 MY_BETA_RULE2 th0;;