flyspeck_needs "../formal_lp/formal_interval/interval_m/verifier.hl";; flyspeck_needs "../formal_lp/formal_interval/eval_interval.hl";; open Verifier;; open Interval;; open Line_interval;; open Taylor;; open Recurse;; (****************************) (* Automatic conversion of formal interval functions into functions *) let rec build_fun i_fun = match i_fun with | Int_var tm -> (try F_int_var (dest_small_numeral (rand tm)) with Failure _ -> let name = (fst o dest_var) tm in F_int_var (int_of_string (String.sub name 1 (String.length name - 1)))) | Int_const th -> let f1, f2 = (dest_pair o rand o concl) th in let int = mk_interval (float_of_float_tm f1, float_of_float_tm f2) in F_int_const int | Int_pow (n, f) -> F_int_pow (n, build_fun f) | Int_unary (op, f) -> let f' = build_fun f in if op = neg_op_real then F_int_neg f' else failwith ("Unsupported operator: "^string_of_term op) | Int_binary (op, f1, f2) -> let f1', f2' = build_fun f1, build_fun f2 in if op = add_op_real then F_int_add (f1',f2') else if op = sub_op_real then F_int_sub (f1',f2') else if op = mul_op_real then F_int_mul (f1',f2') else failwith ("Unsupported operator: "^string_of_term op) | _ -> failwith "Unsupported function";; let buildL pp lin_th = let funs = map (fst o dest_interval_arith) ((striplist dest_conj o rand o concl) lin_th) in let i_funs = map (eval_constants pp o build_interval_fun) funs in let fs = map build_fun i_funs @ (replicate (F_int_const zero) (8 - length funs + 1)) in let eval_fs = map eval_int_fun fs in let f, df = hd eval_fs, tl eval_fs in (fun i x z -> let vars = map2 (curry mk_interval) x z in if i = 0 then f vars else (List.nth df (i - 1)) vars), (fun x -> let vars = map (fun x -> mk_interval (x,x)) x in mk_line (f vars, map (fun df -> df vars) df));; let buildL0 pp poly_tm = let lin_th = gen_lin_approx_poly_thm0 poly_tm in buildL pp lin_th;; let buildDD pp second_th = let poly_tm = (lhand o rator o lhand o concl) second_th in let n = (get_dim o fst o dest_abs) poly_tm in let ns = 1--n in let funs = (striplist dest_conj o rand o snd o dest_forall o rand o concl) second_th in let i_funs = map (eval_constants pp o build_interval_fun o fst o dest_interval_arith) funs in let fs0 = map build_fun i_funs in let pad1 = replicate zero (8 - n) and pad2 = replicate zero 8 in let pad3 = replicate pad2 (8 - n) in let get_el dd i j = let i', j' = if j <= i then i, j else j, i in let index = (i' - 1) * i' / 2 + (j' - 1) in List.nth dd index in let eval_fs = map eval_int_fun fs0 in fun x z -> let ints = map2 (curry mk_interval) x z in let vals = map (fun f -> f ints) eval_fs in map (fun i -> map (fun j -> get_el vals i j) ns @ pad1) ns @ pad3;; let buildDD0 pp poly_tm = let second_th = gen_second_bounded_poly_thm0 poly_tm in buildDD pp second_th;; (******) let build_taylor pp lin_th second_th = let f_df, lin = buildL pp lin_th and dd = buildDD pp second_th in Prim_a (make_primitiveA (f_df, lin, dd));; let build_taylor0 pp poly_tm = build_taylor pp (gen_lin_approx_poly_thm0 poly_tm) (gen_second_bounded_poly_thm0 poly_tm);;