test/Tools/isac/Interpret/inform.sml
changeset 42428 aaca5c033fa4
parent 42426 fc042a668d7a
child 42430 5b629bb1c073
     1.1 --- a/test/Tools/isac/Interpret/inform.sml	Thu May 17 16:44:13 2012 +0200
     1.2 +++ b/test/Tools/isac/Interpret/inform.sml	Thu May 17 19:09:48 2012 +0200
     1.3 @@ -33,6 +33,8 @@
     1.4  "--------- init_form, start with <NEW> (CAS input) ---------------";
     1.5  "--------- build fun check_err_patt ------------------------------";
     1.6  "--------- build fun check_err_patt ?bdv -------------------------";
     1.7 +"--------- build fun check_error_patterns ------------------------";
     1.8 +"--------- embed fun check_error_patterns ------------------------";
     1.9  "-----------------------------------------------------------------";
    1.10  "-----------------------------------------------------------------";
    1.11  "-----------------------------------------------------------------";
    1.12 @@ -869,4 +871,88 @@
    1.13  if check_err_patt (res, inf) (subst: subst) ("errpatID": errpatID, pat) rls = SOME "errpatID"
    1.14  then () else error "error patt example1 changed";
    1.15  
    1.16 +"--------- build fun check_error_patterns ------------------------";
    1.17 +"--------- build fun check_error_patterns ------------------------";
    1.18 +"--------- build fun check_error_patterns ------------------------";
    1.19 +val (res, inf) =
    1.20 +  (str2term "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))",
    1.21 +   str2term "d_d x (x ^^^ 2) + cos (4 * x ^^^ 3)");
    1.22 +val {errpats, nrls = rls, scr = Script prog, ...} = get_met ["diff", "differentiate_on_R"]
    1.23  
    1.24 +val env = [(str2term "v_v", str2term "x")];
    1.25 +val errpats =
    1.26 +  [e_errpat, (*generalised for testing*)
    1.27 +   ("chain-rule-diff-both",
    1.28 +     [parse_patt @{theory} "d_d ?bdv (sin ?u) = cos (d_d ?bdv ?u)",
    1.29 +      parse_patt @{theory} "d_d ?bdv (cos ?u) = - sin (d_d ?bdv ?u)",
    1.30 +      parse_patt @{theory} "d_d ?bdv (?u ^^^ ?n) = ?n * ?u ^^^ (?n - 1)",
    1.31 +      parse_patt @{theory} "d_d ?bdv (LogExp.ln ?u) = 1 / ?u",
    1.32 +      parse_patt @{theory} "d_d ?bdv (LogExp.ln ?u) = 1 / d_d ?bdv ?u"],
    1.33 +     [@{thm diff_sin_chain}, @{thm diff_cos_chain}, @{thm diff_pow_chain}, 
    1.34 +      @{thm diff_ln_chain}, @{thm  diff_exp_chain}])]: errpat list;
    1.35 +
    1.36 +case check_error_patterns (res, inf) (prog, env) (errpats, rls) of SOME _ => () 
    1.37 +| NONE => error "check_error_patterns broken";
    1.38 +
    1.39 +
    1.40 +"--------- embed fun check_error_patterns ------------------------";
    1.41 +"--------- embed fun check_error_patterns ------------------------";
    1.42 +"--------- embed fun check_error_patterns ------------------------";
    1.43 +states:=[];
    1.44 +CalcTree
    1.45 +[(["functionTerm (x ^ 2 + sin (x ^ 4))", "differentiateFor x", "derivative f_f'"], 
    1.46 +  ("Isac", ["derivative_of","function"], ["diff","differentiate_on_R"]))];
    1.47 +Iterator 1;
    1.48 +moveActiveRoot 1;
    1.49 +autoCalculate 1 CompleteCalcHead;
    1.50 +autoCalculate 1 (Step 1);
    1.51 +autoCalculate 1 (Step 1);(*([1], Res), d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))*)
    1.52 +(*autoCalculate 1 (Step 1);([2], Res), d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4)*)
    1.53 +
    1.54 +"~~~~~ fun appendFormula, args:"; val (cI, (ifo:cterm')) = (1, "d_d x (x ^ 2) + cos (4 * x ^ 3)");
    1.55 +val cs = get_calc cI
    1.56 +val pos as (_,p_) = get_pos cI 1; (*pos = ([1], Res)*)
    1.57 +val cs' = 
    1.58 +    case step pos cs of
    1.59 +	    ("ok", cs') => cs';
    1.60 +
    1.61 +val (_, _, (pt, ([2], Res))) = cs';
    1.62 +(*show_pt pt;
    1.63 +  [(([], Frm), Diff (x ^^^ 2 + sin (x ^^^ 4), x)),
    1.64 +   (([1], Frm), d_d x (x ^^^ 2 + sin (x ^^^ 4))),
    1.65 +   (([1], Res), d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))), <<=== input follos: "...+ cos(4.x^3)"
    1.66 +   (([2], Res), d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4))] *)
    1.67 +
    1.68 +"~~~~~ fun inform, args:"; val ((cs as (_, _, ptp as (pt, pos as (p, p_))): calcstate'), istr) =
    1.69 +  (cs', (encode ifo));
    1.70 +val 	SOME f_in = parse (assoc_thy "Isac") istr
    1.71 +val f_in = term_of f_in
    1.72 +val pos_pred = lev_back' pos
    1.73 +			(* f_pred ---"step pos cs"---> f_succ in appendFormula
    1.74 +   TODO.WN120517: one starting point for redesign of pos' *)
    1.75 +val (f_pred, f_succ) = (get_pred_formula (pt, pos_pred), get_pred_formula (pt, pos));
    1.76 +	
    1.77 +term2str f_pred = "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))";
    1.78 +term2str f_succ = "d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4)";
    1.79 +
    1.80 +			f_succ = f_in; (* = false*)
    1.81 +cas_input f_in; (* = NONE*)
    1.82 +val msg_calcstate' = compare_step ([], [], (pt, pos_pred)) f_in
    1.83 +val ("no derivation found", calcstate') = msg_calcstate';
    1.84 +			                 val pp = par_pblobj pt p
    1.85 +			                 val {errpats, nrls, scr = Script prog, ...} = get_met (get_obj g_metID pt pp)
    1.86 +			                 val ScrState (env, _, _, _, _, _) = get_istate pt pos;
    1.87 +                 case check_error_patterns (f_pred, f_in) (prog, env) (errpats, nrls) of
    1.88 +			                   SOME errpatID => ("error pattern #" ^ errpatID ^ "#", calcstate')
    1.89 +			                 | NONE => msg_calcstate';
    1.90 +
    1.91 +"~~~~~ from inform return val:"; val () = ();
    1.92 +case check_error_patterns (f_pred, f_in) (prog, env) (errpats, nrls) of
    1.93 +			  SOME errpatID => ()
    1.94 +			| NONE => error "check_error_patterns broken";
    1.95 +
    1.96 +"--- final check:";
    1.97 +case inform cs' (encode ifo) of
    1.98 +  ("error pattern #chain-rule-diff-both#", calcstate') => ()
    1.99 +| _ => error "inform with (positive) check_error_patterns broken"
   1.100 +