akargl@42176: (* Title: tests on inform.sml akargl@42176: Author: Walther Neuper 060225, neuper@37906: (c) due to copyright terms neuper@37906: *) neuper@37906: neuper@37906: "-----------------------------------------------------------------"; neuper@37906: "table of contents -----------------------------------------------"; neuper@37906: "-----------------------------------------------------------------"; neuper@37906: "appendForm with miniscript with mini-subpbl:"; neuper@37906: "--------- appendFormula: on Res + equ_nrls ----------------------"; neuper@37906: "--------- appendFormula: on Frm + equ_nrls ----------------------"; neuper@37906: "--------- appendFormula: on Res + NO deriv ----------------------"; neuper@37906: "--------- appendFormula: on Res + late deriv --------------------"; neuper@37906: "--------- appendFormula: on Res + late deriv [x = 3 + -2]---///--"; neuper@37906: "replaceForm with miniscript with mini-subpbl:"; neuper@37906: "--------- replaceFormula: on Res + = ----------------------------"; neuper@37906: "--------- replaceFormula: on Res + = 1st Nd ---------------------"; neuper@37906: "--------- replaceFormula: on Frm + = 1st Nd ---------------------"; neuper@37906: "--------- replaceFormula: cut calculation -----------------------"; neuper@37906: "--------- replaceFormula: cut calculation -----------------------"; neuper@37906: (* 040307 copied from informtest.sml ... old versions neuper@37906: "--------- maximum-example, UC: Modeling / modifyCalcHead --------";*) neuper@37906: "--------- syntax error ------------------------------------------"; neuper@37906: "CAS-command:"; neuper@37906: "--------- CAS-command on ([],Pbl) -------------------------------"; neuper@37906: "--------- CAS-command on ([],Pbl) FE-interface ------------------"; neuper@37906: "--------- inform [rational,simplification] ----------------------"; neuper@37906: "--------- Take as 1st tac, start with (CAS input) ---------"; neuper@37906: "--------- Take as 1st tac, start from exp -----------------------"; neuper@37906: "--------- init_form, start with (CAS input) ---------------"; neuper@42423: "--------- build fun check_err_patt ------------------------------"; neuper@42426: "--------- build fun check_err_patt ?bdv -------------------------"; neuper@42428: "--------- build fun check_error_patterns ------------------------"; neuper@42428: "--------- embed fun check_error_patterns ------------------------"; neuper@48895: "--------- build fun get_fillpats --------------------------------"; neuper@42430: "--------- embed fun find_fillpatterns ---------------------------"; neuper@48895: "--------- build fun is_exactly_equal, inputFillFormula ----------"; wneuper@59262: "--------- fun appl_adds -----------------------------------------"; wneuper@59264: "--------- fun concat_deriv --------------------------------------"; wneuper@59264: "--------- handle an input formula -------------------------------"; wneuper@59264: "--------- fun dropwhile' ----------------------------------------"; neuper@37906: "-----------------------------------------------------------------"; neuper@37906: "-----------------------------------------------------------------"; neuper@37906: "-----------------------------------------------------------------"; neuper@37906: neuper@37906: neuper@37906: "--------- appendFormula: on Res + equ_nrls ----------------------"; neuper@37906: "--------- appendFormula: on Res + equ_nrls ----------------------"; neuper@37906: "--------- appendFormula: on Res + equ_nrls ----------------------"; neuper@48790: val Prog sc = (#scr o get_met) ["Test","squ-equ-test-subpbl1"]; neuper@37906: (writeln o term2str) sc; neuper@48790: val Prog sc = (#scr o get_met) ["Test","solve_linear"]; neuper@37906: (writeln o term2str) sc; neuper@37906: s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 + -1 * 2 = 0*); neuper@37906: wneuper@59123: appendFormula 1 "-2 * 1 + (1 + x) = 0" (*|> Future.join*); refFormula 1 (get_pos 1 1); neuper@37906: val ((pt,_),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@48895: if str = neuper@48895: (". ----- pblobj -----\n" ^ neuper@48895: "1. x + 1 = 2\n" ^ neuper@48895: "2. x + 1 + -1 * 2 = 0\n" ^ neuper@48895: "2.1. x + 1 + -1 * 2 = 0\n" ^ neuper@48895: "2.2. 1 + x + -1 * 2 = 0\n" ^ neuper@48895: "2.3. 1 + (x + -1 * 2) = 0\n" ^ neuper@48895: "2.4. 1 + (x + -2) = 0\n" ^ neuper@48895: "2.5. 1 + (x + -2 * 1) = 0\n" ^ neuper@48895: "2.6. 1 + x + -2 * 1 = 0\n" ) then () neuper@48895: else error "inform.sml: diff.behav.appendFormula: on Res + equ 1"; neuper@37906: neuper@37906: moveDown 1 ([ ],Pbl); refFormula 1 ([1],Frm); (*x + 1 = 2*) neuper@37906: moveDown 1 ([1],Frm); refFormula 1 ([1],Res); (*x + 1 + -1 * 2 = 0*) neuper@37906: neuper@37906: (*the seven steps of detailed derivation*) neuper@37906: moveDown 1 ([1 ],Res); refFormula 1 ([2,1],Frm); neuper@37906: moveDown 1 ([2,1],Frm); refFormula 1 ([2,1],Res); neuper@37906: moveDown 1 ([2,1],Res); refFormula 1 ([2,2],Res); neuper@37906: moveDown 1 ([2,2],Res); refFormula 1 ([2,3],Res); neuper@37906: moveDown 1 ([2,3],Res); refFormula 1 ([2,4],Res); neuper@37906: moveDown 1 ([2,4],Res); refFormula 1 ([2,5],Res); neuper@37906: moveDown 1 ([2,5],Res); refFormula 1 ([2,6],Res); neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: if "-2 * 1 + (1 + x) = 0" = term2str (fst (get_obj g_result pt [2,6])) then() neuper@38031: else error "inform.sml: diff.behav.appendFormula: on Res + equ 2"; neuper@37906: neuper@37906: fetchProposedTactic 1; (*takes Iterator 1 _1_*) neuper@48895: (* error in kernel ALREADY IN 2009-2*) neuper@48895: (*========== inhibit exn WN1130701 broken at Isabelle2002 --> 2009-2 ============= neuper@37906: val (_,(tac,_,_)::_) = get_calc 1; neuper@37906: if tac = Rewrite_Set "Test_simplify" then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: on Res + equ 3"; neuper@48895: ============ inhibit exn WN1130701 broken at Isabelle2002 --> 2009-2 ============*) akargl@42209: wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: if "[x = 1]" = term2str (fst (get_obj g_result pt [])) then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: on Res + equ 4"; wneuper@59248: (* autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,p),_) = get_calc 1; neuper@37906: (writeln o istates2str) (get_obj g_loc pt [ ]); neuper@37906: (writeln o istates2str) (get_obj g_loc pt [1]); neuper@37906: (writeln o istates2str) (get_obj g_loc pt [2]); neuper@37906: (writeln o istates2str) (get_obj g_loc pt [3]); neuper@37906: (writeln o istates2str) (get_obj g_loc pt [3,1]); neuper@37906: (writeln o istates2str) (get_obj g_loc pt [3,2]); neuper@37906: (writeln o istates2str) (get_obj g_loc pt [4]); neuper@37906: neuper@37906: *) neuper@37906: "----------------------------------------------------------"; akargl@42176: akargl@42176: val fod = make_deriv (@{theory "Isac"}) Atools_erls neuper@37906: ((#rules o rep_rls) Test_simplify) akargl@42176: (sqrt_right false (@{theory "Pure"})) NONE neuper@37906: (str2term "x + 1 + -1 * 2 = 0"); neuper@37906: (writeln o trtas2str) fod; neuper@37906: akargl@42176: val ifod = make_deriv (@{theory "Isac"}) Atools_erls neuper@37906: ((#rules o rep_rls) Test_simplify) akargl@42176: (sqrt_right false (@{theory "Pure"})) NONE neuper@37906: (str2term "-2 * 1 + (1 + x) = 0"); neuper@37906: (writeln o trtas2str) ifod; akargl@42176: fun equal (_,_,(t1, _)) (_,_,(t2, _)) = t1 = t2; neuper@37906: val (fod', rifod') = dropwhile' equal (rev fod) (rev ifod); neuper@37906: val der = fod' @ (map rev_deriv' rifod'); neuper@37906: (writeln o trtas2str) der; neuper@37906: "----------------------------------------------------------"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- appendFormula: on Frm + equ_nrls ----------------------"; neuper@37906: "--------- appendFormula: on Frm + equ_nrls ----------------------"; neuper@37906: "--------- appendFormula: on Frm + equ_nrls ----------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1) (*x + 1 = 2*); wneuper@59123: appendFormula 1 "2+ -1 + x = 2" (*|> Future.join*); refFormula 1 (get_pos 1 1); neuper@37906: neuper@37906: moveDown 1 ([],Pbl); refFormula 1 ([1],Frm) (*x + 1 = 2*); neuper@37906: neuper@37906: moveDown 1 ([1 ],Frm); refFormula 1 ([1,1],Frm); neuper@37906: moveDown 1 ([1,1],Frm); refFormula 1 ([1,1],Res); neuper@37906: moveDown 1 ([1,1],Res); refFormula 1 ([1,2],Res); neuper@37906: moveDown 1 ([1,2],Res); refFormula 1 ([1,3],Res); neuper@37906: moveDown 1 ([1,3],Res); refFormula 1 ([1,4],Res); neuper@37906: moveDown 1 ([1,4],Res); refFormula 1 ([1,5],Res); neuper@37906: moveDown 1 ([1,5],Res); refFormula 1 ([1,6],Res); neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: if "2 + -1 + x = 2" = term2str (fst (get_obj g_result pt [1,6])) then() neuper@38031: else error "inform.sml: diff.behav.appendFormula: on Frm + equ 1"; neuper@37906: neuper@37906: fetchProposedTactic 1; (*takes Iterator 1 _1_*) neuper@37906: val (_,(tac,_,_)::_) = get_calc 1; wneuper@59253: case tac of Rewrite_Set "norm_equation" => () wneuper@59253: | _ => error "inform.sml: diff.behav.appendFormula: on Frm + equ 2"; wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: if "[x = 1]" = term2str (fst (get_obj g_result pt [])) then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: on Frm + equ 3"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- appendFormula: on Res + NO deriv ----------------------"; neuper@37906: "--------- appendFormula: on Res + NO deriv ----------------------"; neuper@37906: "--------- appendFormula: on Res + NO deriv ----------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 + -1 * 2 = 0*); neuper@37906: wneuper@59123: appendFormula 1 "x = 2" (*|> Future.join*); neuper@37906: val ((pt,p),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@37906: writeln str; neuper@37906: if str = ". ----- pblobj -----\n1. x + 1 = 2\n" andalso p = ([1], Res) neuper@37906: then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: Res + NOder 1"; neuper@37906: neuper@37906: fetchProposedTactic 1; neuper@37906: val (_,(tac,_,_)::_) = get_calc 1; wneuper@59253: case tac of Rewrite_Set "Test_simplify" => () wneuper@59253: | _ => error "inform.sml: diff.behav.appendFormula: Res + NOder 2"; wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: if "[x = 1]" = term2str (fst (get_obj g_result pt [])) then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: on Frm + equ 3"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- appendFormula: on Res + late deriv --------------------"; neuper@37906: "--------- appendFormula: on Res + late deriv --------------------"; neuper@37906: "--------- appendFormula: on Res + late deriv --------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 + -1 * 2 = 0*); neuper@37906: wneuper@59123: appendFormula 1 "x = 1" (*|> Future.join*); neuper@37906: val ((pt,p),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@37906: writeln str; neuper@37906: if str = ". ----- pblobj -----\n1. x + 1 = 2\n2. x + 1 + -1 * 2 = 0\n3. ----- pblobj -----\n3.1. -1 + x = 0\n3.2. x = 0 + -1 * -1\n3.2.1. x = 0 + -1 * -1\n3.2.2. x = 0 + 1\n" andalso p = ([3,2], Res) neuper@37906: then () (*finds 1 step too early: ([3,2], Res) "x = 1" also by script !!!*) neuper@38031: else error "inform.sml: diff.behav.appendFormula: Res + late d 1"; akargl@42176: neuper@37906: fetchProposedTactic 1; neuper@37906: val (_,(tac,_,_)::_) = get_calc 1; wneuper@59253: case tac of Check_Postcond ["LINEAR", "univariate", "equation", "test"] => () wneuper@59253: | _ => error "inform.sml: diff.behav.appendFormula: Res + late d 2"; wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: if "[x = 1]" = term2str (fst (get_obj g_result pt [])) then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: Res + late d 3"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- appendFormula: on Res + late deriv [x = 3 + -2]---///--"; neuper@37906: "--------- appendFormula: on Res + late deriv [x = 3 + -2]---///--"; neuper@37906: "--------- appendFormula: on Res + late deriv [x = 3 + -2]---///--"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 + -1 * 2 = 0*); wneuper@59123: appendFormula 1 "[x = 3 + -2*1]" (*|> Future.join*); neuper@37906: val ((pt,p),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@37906: writeln str; neuper@37906: if str=". ----- pblobj -----\n1. x + 1 = 2\n2. x + 1 + -1 * 2 = 0\n3. ----- pblobj -----\n3.1. -1 + x = 0\n3.2. x = 0 + -1 * -1\n4. [x = 1]\n4.1. [x = 1]\n4.2. [x = -2 + 3]\n4.3. [x = 3 + -2]\n" then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: Res + latEE 1"; wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,p),_) = get_calc 1; neuper@37906: if "[x = 3 + -2 * 1]" = term2str (fst (get_obj g_result pt [])) then () neuper@37906: (* ~~~~~~~~~~ simplify as last step in any script ?!*) neuper@38031: else error "inform.sml: diff.behav.appendFormula: Res + latEE 2"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- replaceFormula: on Res + = ----------------------------"; neuper@37906: "--------- replaceFormula: on Res + = ----------------------------"; neuper@37906: "--------- replaceFormula: on Res + = ----------------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 + -1 * 2 = 0*); wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*-1 + x*); neuper@37906: neuper@37906: replaceFormula 1 "-2 * 1 + (1 + x) = 0"; refFormula 1 (get_pos 1 1); neuper@37906: val ((pt,_),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; akargl@42176: neuper@48895: (* before AK110725 this was neuper@48895: ". ----- pblobj -----\n neuper@48895: 1. x + 1 = 2\n neuper@48895: 2. x + 1 + -1 * 2 = 0\n neuper@48895: 2.1. x + 1 + -1 * 2 = 0\n neuper@48895: 2.2. 1 + x + -1 * 2 = 0\n neuper@48895: 2.3. 1 + (x + -1 * 2) = 0\n neuper@48895: 2.4. 1 + (x + -2) = 0\n neuper@48895: 2.5. 1 + (x + -2 * 1) = 0\n neuper@48895: 2.6. 1 + x + -2 * 1 = 0\n"; neuper@48895: *) neuper@48895: if str = neuper@48895: ". ----- pblobj -----\n"^ neuper@48895: "1. x + 1 = 2\n"^ neuper@48895: "2. x + 1 + -1 * 2 = 0\n"^ neuper@48895: "2.1. x + 1 + -1 * 2 = 0\n"^ neuper@48895: "2.2. 1 + x + -1 * 2 = 0\n"^ neuper@48895: "2.3. 1 + (x + -1 * 2) = 0\n"^ neuper@48895: "2.4. 1 + (x + -2) = 0\n"^ neuper@48895: "2.5. 1 + (x + -2 * 1) = 0\n"^ neuper@48895: "2.6. 1 + x + -2 * 1 = 0\n" then() neuper@48895: else error "inform.sml: diff.behav.replaceFormula: on Res += 1"; akargl@42176: wneuper@59248: autoCalculate 1 CompleteCalc; akargl@42176: val ((pt,pos as (p,_)),_) = get_calc 1; akargl@42176: if pos = ([],Res) andalso "[x = 1]" = (term2str o fst) (get_obj g_result pt p) then() neuper@38031: else error "inform.sml: diff.behav.replaceFormula: on Res + = 2"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- replaceFormula: on Res + = 1st Nd ---------------------"; neuper@37906: "--------- replaceFormula: on Res + = 1st Nd ---------------------"; neuper@37906: "--------- replaceFormula: on Res + = 1st Nd ---------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 + -1 * 2 = 0*); neuper@37906: neuper@37906: replaceFormula 1 "x + 1 = 4 + -2"; refFormula 1 (get_pos 1 1); neuper@37906: val ((pt,_),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@37906: writeln str; akargl@42176: if str= ". ----- pblobj -----\n1. x + 1 = 2\n1.1. x + 1 = 2\n1.2. 1 + x = 2\n1.3. 1 + x = -2 + 4\n1.4. x + 1 = -2 + 4\n" then () neuper@38031: else error "inform.sml: diff.behav.replaceFormula: on Res 1 + = 1"; wneuper@59248: autoCalculate 1 CompleteCalc; akargl@42176: val ((pt,pos as (p,_)),_) = get_calc 1; akargl@42176: if pos = ([],Res) andalso "[x = 1]" = (term2str o fst)(get_obj g_result pt p) then() neuper@38031: else error "inform.sml: diff.behav.replaceFormula: on Res + = 2"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- replaceFormula: on Frm + = 1st Nd ---------------------"; neuper@37906: "--------- replaceFormula: on Frm + = 1st Nd ---------------------"; neuper@37906: "--------- replaceFormula: on Frm + = 1st Nd ---------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) neuper@37906: neuper@37906: replaceFormula 1 "x + 1 = 4 + -2"; refFormula 1 (get_pos 1 1); neuper@37906: val ((pt,_),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@37906: writeln str; akargl@42176: if str= ". ----- pblobj -----\n1. x + 1 = 2\n1.1. x + 1 = 2\n1.2. 1 + x = 2\n1.3. 1 + x = -2 + 4\n1.4. x + 1 = -2 + 4\n" then () neuper@38031: else error "inform.sml: diff.behav.replaceFormula: on Frm 1 + = 1"; wneuper@59248: autoCalculate 1 CompleteCalc; akargl@42176: val ((pt,pos as (p,_)),_) = get_calc 1; akargl@42176: if pos = ([],Res) andalso "[x = 1]" = (term2str o fst)(get_obj g_result pt p) then() neuper@38031: else error "inform.sml: diff.behav.replaceFormula: on Frm 1 + = 2"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- replaceFormula: cut calculation -----------------------"; neuper@37906: "--------- replaceFormula: cut calculation -----------------------"; neuper@37906: "--------- replaceFormula: cut calculation -----------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: moveActiveRoot 1; moveActiveDown 1; neuper@37906: if get_pos 1 1 = ([1], Frm) then () neuper@38031: else error "inform.sml: diff.behav. cut calculation 1"; neuper@37906: neuper@37906: replaceFormula 1 "x + 1 = 4 + -2"; refFormula 1 (get_pos 1 1); neuper@37906: val ((pt,p),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@37906: writeln str; neuper@37906: if p = ([1], Res) then () neuper@38031: else error "inform.sml: diff.behav. cut calculation 2"; neuper@37906: neuper@37906: neuper@37906: (* 040307 copied from informtest.sml; ... old version neuper@37906: "---------------- maximum-example, UC: Modeling / modifyCalcHead -"; neuper@37906: "---------------- maximum-example, UC: Modeling / modifyCalcHead -"; neuper@37906: "---------------- maximum-example, UC: Modeling / modifyCalcHead -"; neuper@37906: neuper@37906: val p = ([],Pbl); neuper@37906: val elems = ["fixedValues [r=Arbfix]","maximum A","valuesFor [a,b]", neuper@37906: "relations [A=a*b, (a/2)^^^2 + (b/2)^^^2 = r^^^2]", neuper@37906: "relations [A=a*b, (a/2)^^^2 + (b/2)^^^2 = r^^^2]", neuper@37906: "relations [A=a*b, a/2=r*sin alpha, b/2=r*cos alpha]", neuper@37906: (*^^^ these are the elements for the root-problem (in variants)*) neuper@37906: (*vvv these are elements required for subproblems*) neuper@37906: "boundVariable a","boundVariable b","boundVariable alpha", neuper@37906: "interval {x::real. 0 <= x & x <= 2*r}", neuper@37906: "interval {x::real. 0 <= x & x <= 2*r}", neuper@37906: "interval {x::real. 0 <= x & x <= pi}", neuper@37906: "errorBound (eps=(0::real))"] neuper@37906: (*specifying is not interesting for this example*) neuper@38058: val spec = ("DiffApp", ["maximum_of","function"], neuper@37906: ["DiffApp","max_by_calculus"]); neuper@37906: (*the empty model with descriptions for user-guidance by Model_Problem*) neuper@37906: val empty_model = [Given ["fixedValues []"], neuper@37906: Find ["maximum", "valuesFor"], neuper@37906: Relate ["relations []"]]; neuper@37906: neuper@37906: neuper@37906: (*!!!!!!!!!!!!!!!!! DON'T USE me FOR FINDING nxt !!!!!!!!!!!!!!!!!!*) neuper@37906: val (p,_,f,nxt,_,pt) = CalcTreeTEST [(elems, spec)]; neuper@37906: (*val nxt = ("Model_Problem", ...*) neuper@37924: val pbl = get_obj g_pbl pt (fst p); (writeln o (itms2str_ ctxt)) pbl; neuper@37906: neuper@37906: val (p,_,f,nxt,_,pt) = me nxt p c pt; neuper@37906: (*nxt = Add_Given "fixedValues [r = Arbfix]"*) neuper@37924: val pbl = get_obj g_pbl pt (fst p); (writeln o (itms2str_ ctxt)) pbl; neuper@37906: (*[ neuper@37906: (0 ,[] ,false ,#Given ,Inc fixedValues [] ,(??.empty, [])), neuper@37906: (0 ,[] ,false ,#Find ,Inc maximum ,(??.empty, [])), neuper@37906: (0 ,[] ,false ,#Find ,Inc valuesFor ,(??.empty, [])), neuper@37906: (0 ,[] ,false ,#Relate ,Inc relations [] ,(??.empty, []))]*) neuper@37906: neuper@37906: (*the empty CalcHead is checked w.r.t the model and re-established as such*) neuper@37906: val (b,pt,ocalhd) = input_icalhd pt (p,"", empty_model, Pbl, e_spec); neuper@37924: val pbl = get_obj g_pbl pt (fst p); (writeln o (itms2str_ ctxt)) pbl; neuper@38031: if ocalhd2str ocalhd = "(Pbl, ??.empty, [\n(0 ,[] ,false ,#Given ,Inc fixedValues [] ,(??.empty, [])),\n(0 ,[] ,false ,#Find ,Inc maximum ,(??.empty, [])),\n(0 ,[] ,false ,#Find ,Inc valuesFor ,(??.empty, [])),\n(0 ,[] ,false ,#Relate ,Inc relations [] ,(??.empty, []))], [], \n(\"e_domID\", [\"e_pblID\"], [\"e_metID\"]) )" then () else error "informtest.sml: diff.behav. max 1"; neuper@37906: neuper@37906: (*there is one input to the model (could be more)*) neuper@37906: val (b,pt,ocalhd) = neuper@37906: input_icalhd pt (p,"", [Given ["fixedValues [r=Arbfix]"], neuper@37906: Find ["maximum", "valuesFor"], neuper@37906: Relate ["relations"]], Pbl, e_spec); neuper@37924: val pbl = get_obj g_pbl pt (fst p); (writeln o (itms2str_ ctxt)) pbl; neuper@37906: if ocalhd2str ocalhd = "(Pbl, ??.empty, [\n(1 ,[1,2,3] ,true ,#Given ,Cor fixedValues [r = Arbfix] ,(fix_, [[r = Arbfix]])),\n(0 ,[] ,false ,#Find ,Inc maximum ,(??.empty, [])),\n(0 ,[] ,false ,#Find ,Inc valuesFor ,(??.empty, [])),\n(0 ,[] ,false ,#Relate ,Inc relations [] ,(??.empty, []))], [], \n(\"e_domID\", [\"e_pblID\"], [\"e_metID\"]) )" then () neuper@38031: else error "informtest.sml: diff.behav. max 2"; neuper@37906: neuper@37906: (*this input is complete in variant 3, but the ME doesn't recognize FIXXXXME neuper@37906: val (b,pt''''',ocalhd) = neuper@37906: input_icalhd pt (p,"", [Given ["fixedValues [r=Arbfix]"], neuper@37906: Find ["maximum A", "valuesFor [a,b]"], neuper@37906: Relate ["relations [A=a*b, a/2=r*sin alpha, \ neuper@37906: \b/2=r*cos alpha]"]], Pbl, e_spec); neuper@37924: val pbl = get_obj g_pbl pt''''' (fst p); (writeln o (itms2str_ ctxt)) pbl; neuper@37906: if ocalhd2str ocalhd = ------------^^^^^^^^^^ missing !!!*) neuper@37906: neuper@37906: (*this input is complete in variant 1 (variant 3 does not work yet)*) neuper@37906: val (b,pt''''',ocalhd) = neuper@37906: input_icalhd pt (p,"", [Given ["fixedValues [r=Arbfix]"], neuper@37906: Find ["maximum A", "valuesFor [a,b]"], neuper@37906: Relate ["relations [A=a*b, \ neuper@37906: \(a/2)^^^2 + (b/2)^^^2 = r^^^2]"]], neuper@37906: Pbl, e_spec); neuper@37924: val pbl = get_obj g_pbl pt''''' (fst p); (writeln o (itms2str_ ctxt)) pbl; neuper@37906: neuper@37906: modifycalcheadOK2xml 111 (bool2str b) ocalhd; neuper@37906: *) wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- syntax error ------------------------------------------"; neuper@37906: "--------- syntax error ------------------------------------------"; neuper@37906: "--------- syntax error ------------------------------------------"; s1210629013@55445: reset_states (); neuper@41970: CalcTree [(["equality (x+1=(2::real))", "solveFor x","solutions L"], neuper@41970: ("Test", ["sqroot-test","univariate","equation","test"], neuper@37906: ["Test","squ-equ-test-subpbl1"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 = 2*) wneuper@59248: autoCalculate 1 (Step 1); refFormula 1 (get_pos 1 1);(*x + 1 + -1 * 2 = 0*); neuper@37906: neuper@37906: appendFormula 1 " x - "; (* syntax error in ' x - ' *) neuper@37906: val ((pt,_),_) = get_calc 1; wneuper@59279: val str = pr_ctree pr_short pt; neuper@37906: writeln str; neuper@37906: if str = ". ----- pblobj -----\n1. x + 1 = 2\n" then () neuper@38031: else error "inform.sml: diff.behav.appendFormula: syntax error"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- CAS-command on ([],Pbl) -------------------------------"; neuper@37906: "--------- CAS-command on ([],Pbl) -------------------------------"; neuper@37906: "--------- CAS-command on ([],Pbl) -------------------------------"; neuper@37906: val (p,_,f,nxt,_,pt) = neuper@37906: CalcTreeTEST [([], ("e_domID", ["e_pblID"], ["e_metID"]))]; neuper@37906: val ifo = "solve(x+1=2,x)"; neuper@37906: val (_,(_,c,(pt,p))) = inform ([],[],(pt,p)) "solve(x+1=2,x)"; neuper@37906: show_pt pt; neuper@37906: val nxt = ("Apply_Method",Apply_Method ["Test","squ-equ-test-subpbl1"]); neuper@37906: val (p,_,f,nxt,_,pt) = me nxt p [] pt; neuper@37906: if p = ([1], Frm) andalso f2str f = "x + 1 = 2" then () neuper@38031: else error "inform.sml: diff.behav. CAScmd ([],Pbl)"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- CAS-command on ([],Pbl) FE-interface ------------------"; neuper@37906: "--------- CAS-command on ([],Pbl) FE-interface ------------------"; neuper@37906: "--------- CAS-command on ([],Pbl) FE-interface ------------------"; s1210629013@55445: reset_states (); neuper@37906: CalcTree [([], ("e_domID", ["e_pblID"], ["e_metID"]))]; neuper@37906: Iterator 1; neuper@37906: moveActiveRoot 1; neuper@37906: replaceFormula 1 "solve(x+1=2,x)"; wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,p),_) = get_calc 1; neuper@37906: show_pt pt; neuper@37906: if p = ([], Res) then () neuper@38031: else error "inform.sml: diff.behav. CAScmd ([],Pbl) FE-interface"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- inform [rational,simplification] ----------------------"; neuper@37906: "--------- inform [rational,simplification] ----------------------"; neuper@37906: "--------- inform [rational,simplification] ----------------------"; s1210629013@55445: reset_states (); neuper@52105: CalcTree [(["Term (a * x / (b * x) + c * x / (d * x) + e / f)", "normalform N"], neuper@52105: ("Rational", ["rational", "simplification"], ["simplification", "of_rationals"]))]; neuper@37906: Iterator 1; moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; neuper@52105: neuper@52105: "--- (-1) give a preview on the calculation without any input"; neuper@52105: (* wneuper@59248: autoCalculate 1 CompleteCalc; neuper@52105: val ((pt, p), _) = get_calc 1; neuper@52105: show_pt pt; neuper@52105: [ neuper@52105: (([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)), neuper@52105: (([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f), neuper@52105: (([1], Res), a / b + c / d + e / f), <--- (1) input arbitrary neuper@52105: (([2], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([3], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))), neuper@52105: (([4], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f)), <--- (2) input next neuper@52105: (([], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f))] <--- (3) is also final result neuper@52105: EXAMPLE NOT OPTIMAL neuper@52105: *) neuper@52105: "--- (0) user input as the *first* step does not work, thus impdo at least 1 step"; wneuper@59248: autoCalculate 1 (Step 1); wneuper@59248: autoCalculate 1 (Step 1); neuper@52105: val ((pt, p), _) = get_calc 1; neuper@52105: (*show_pt pt; neuper@52105: [ neuper@52105: (([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)), neuper@52105: (([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f), neuper@52105: (([1], Res), a / b + c / d + e / f)] neuper@52105: *) neuper@52105: "--- (1) input an arbitrary next formula"; wneuper@59123: appendFormula 1 "((a * d) + (c * b)) / (b * d) + e / f" (*|> Future.join*); neuper@52105: val ((pt, p), _) = get_calc 1; neuper@52105: (*show_pt pt; neuper@52105: [ neuper@52105: (([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)), neuper@52105: (([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f), neuper@52105: (([1], Res), a / b + c / d + e / f), neuper@52105: (([2,1], Frm), a / b + c / d + e / f), neuper@52105: (([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([2,2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([2], Res), (a * d + c * b) / (b * d) + e / f)] neuper@52105: *) neuper@37906: val ((pt,p),_) = get_calc 1; neuper@52105: if p = ([2], Res) andalso (length o children o (get_nd pt)) (fst p) = 2 then () neuper@38031: else error ("inform.sml: [rational,simplification] 1"); neuper@37906: neuper@52105: "--- (2) input the next formula that would be presented by mat-engine"; neuper@52105: (* generate a preview: wneuper@59248: autoCalculate 1 (Step 1); neuper@52105: val ((pt, p), _) = get_calc 1; neuper@52105: show_pt pt; neuper@52105: [ neuper@52105: (([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)), neuper@52105: (([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f), neuper@52105: (([1], Res), a / b + c / d + e / f), neuper@52105: (([2,1], Frm), a / b + c / d + e / f), neuper@52105: (([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([2,2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f))] <--- input this neuper@52105: *) wneuper@59123: appendFormula 1 "(b * d * e + b * c * f + a * d * f) / (b * d * f)" (*|> Future.join*); neuper@52105: val ((pt, p), _) = get_calc 1; neuper@52105: (*show_pt pt; neuper@52105: [ neuper@52105: (([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)), neuper@52105: (([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f), neuper@52105: (([1], Res), a / b + c / d + e / f), neuper@52105: (([2,1], Frm), a / b + c / d + e / f), neuper@52105: (([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([2,2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f))] neuper@52105: *) neuper@52105: if p = ([3], Res) andalso (length o children o (get_nd pt)) (fst p) = 0 then () neuper@38031: else error ("inform.sml: [rational,simplification] 2"); neuper@37906: neuper@52105: "--- (3) input the exact final result"; wneuper@59123: appendFormula 1 "(b * d * e + b * c * f + a * d * f) / (b * d * f)" (*|> Future.join*); neuper@52105: val ((pt, p), _) = get_calc 1; neuper@52105: (*show_pt pt; neuper@52105: [ neuper@52105: (([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)), neuper@52105: (([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f), neuper@52105: (([1], Res), a / b + c / d + e / f), neuper@52105: (([2,1], Frm), a / b + c / d + e / f), neuper@52105: (([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([2,2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([4,1], Frm), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([4,1], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))), neuper@52105: (([4,2], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([4], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f))] neuper@52105: *) neuper@52105: if p = ([4], Res) andalso (length o children o (get_nd pt)) (fst p) = 2 then () neuper@38031: else error ("inform.sml: [rational,simplification] 3"); neuper@52105: neuper@52105: "--- (4) finish the calculation + check the postcondition (in the future)"; wneuper@59248: autoCalculate 1 CompleteCalc; neuper@52105: val ((pt, p), _) = get_calc 1; neuper@52105: val (t, asm) = get_obj g_result pt []; neuper@52105: if term2str t = "(a * d * f + b * c * f + b * d * e) / (b * d * f)" andalso neuper@52105: terms2str asm = "[\"b * d * f ~= 0\",\"d ~= 0\",\"b ~= 0\"," ^ neuper@52105: "\"a * x / (b * x) + c * x / (d * x) + e / f is_ratpolyexp\"]" neuper@52105: then () else error "inform [rational,simplification] changed at end"; neuper@52105: (*show_pt pt; neuper@52105: [ neuper@52105: (([], Frm), Simplify (a * x / (b * x) + c * x / (d * x) + e / f)), neuper@52105: (([1], Frm), a * x / (b * x) + c * x / (d * x) + e / f), neuper@52105: (([1], Res), a / b + c / d + e / f), neuper@52105: (([2,1], Frm), a / b + c / d + e / f), neuper@52105: (([2,1], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([2,2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([2], Res), (a * d + c * b) / (b * d) + e / f), neuper@52105: (([3], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([4,1], Frm), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([4,1], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))), neuper@52105: (([4,2], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([4], Res), (b * d * e + b * c * f + a * d * f) / (b * d * f)), neuper@52105: (([5], Res), (a * (d * f) + b * (c * f) + b * (d * e)) / (b * (d * f))), neuper@52105: (([6], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f)), neuper@52105: (([], Res), (a * d * f + b * c * f + b * d * e) / (b * d * f))] neuper@52105: *) wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- Take as 1st tac, start with (CAS input) ---------"; neuper@37906: "--------- Take as 1st tac, start with (CAS input) ---------"; neuper@37906: "--------- Take as 1st tac, start with (CAS input) ---------"; neuper@37906: val t = str2term "Diff (x^^^2 + x + 1, x)"; neuper@37906: case t of Const ("Diff.Diff", _) $ _ => () neuper@37906: | _ => raise neuper@37906: error "diff.sml behav.changed for CAS Diff (..., x)"; neuper@37906: atomty t; neuper@37906: "-----------------------------------------------------------------"; s1210629013@55445: (*1>*)reset_states (); neuper@37906: (*2>*)CalcTree [([], ("e_domID", ["e_pblID"], ["e_metID"]))]; neuper@37906: (*3>*)Iterator 1;moveActiveRoot 1; neuper@37906: "----- here the Headline has been finished"; neuper@37906: (*4>*)moveActiveFormula 1 ([],Pbl); neuper@37906: (*5>*)replaceFormula 1 "Diff (x^2 + x + 1, x)"; neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: val PblObj {probl, meth, spec, fmz, env, loc, ...} = get_obj I pt []; neuper@37926: val NONE = env; neuper@37926: val (SOME istate, NONE) = loc; wneuper@59111: default_print_depth 5; neuper@37906: writeln"-----------------------------------------------------------"; neuper@37906: spec; neuper@37924: writeln (itms2str_ ctxt probl); neuper@37924: writeln (itms2str_ ctxt meth); neuper@48895: writeln (istate2str (fst istate)); neuper@37906: neuper@37906: refFormula 1 ([],Pbl) (*--> correct CalcHead*); neuper@37906: (*081016 NOT necessary (but leave it in Java):*) wneuper@59248: (*6>*)(*completeCalcHead*)autoCalculate 1 CompleteCalcHead; neuper@37906: "----- here the CalcHead has been completed --- ONCE MORE ?????"; neuper@37906: neuper@37906: (***difference II***) neuper@37906: val ((pt,p),_) = get_calc 1; neuper@37906: (*val p = ([], Pbl)*) neuper@37906: val PblObj {probl, meth, spec, fmz, env, loc, ...} = get_obj I pt []; neuper@37926: val NONE = env; neuper@37926: val (SOME istate, NONE) = loc; wneuper@59111: default_print_depth 5; writeln (istate2str (fst istate)); default_print_depth 3; neuper@37906: (*ScrState ([], neuper@37926: [], NONE, neuper@37906: ??.empty, Sundef, false)*) wneuper@59111: default_print_depth 5; spec; default_print_depth 3; neuper@38050: (*("Isac", neuper@37906: ["derivative_of", "function"], neuper@37906: ["diff", "differentiate_on_R"]) : spec*) neuper@37924: writeln (itms2str_ ctxt probl); neuper@37906: (*[ neuper@37906: (1 ,[1] ,true ,#Given ,Cor functionTerm (x ^^^ 2 + x + 1) ,(f_, [x ^^^ 2 + x + 1])), neuper@37906: (2 ,[1] ,true ,#Given ,Cor differentiateFor x ,(v_, [x])), akargl@42176: (3 ,[1] ,true ,#Find ,Cor derivative f_'_f ,(f_'_f, [f_'_f]))]*) neuper@37924: writeln (itms2str_ ctxt meth); neuper@37906: (*[ neuper@37906: (1 ,[1] ,true ,#Given ,Cor functionTerm (x ^^^ 2 + x + 1) ,(f_, [x ^^^ 2 + x + 1])), neuper@37906: (2 ,[1] ,true ,#Given ,Cor differentiateFor x ,(v_, [x])), akargl@42176: (3 ,[1] ,true ,#Find ,Cor derivative f_'_f ,(f_'_f, [f_'_f]))]*) neuper@37906: writeln"-----------------------------------------------------------"; neuper@37906: (*7>*)fetchProposedTactic 1 (*--> Apply_Method*); neuper@37906: (*WN081028 fixed helpless by inform returning ...(.,Met)*) wneuper@59248: autoCalculate 1 CompleteCalc; neuper@37906: val ((pt,p),_) = get_calc 1; neuper@37906: val Form res = (#1 o pt_extract) (pt, ([],Res)); neuper@37906: show_pt pt; neuper@37906: if p = ([], Res) andalso term2str res = "1 + 2 * x" then () neuper@38031: else error "diff.sml behav.changed for Diff (x^2 + x + 1, x)"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- Take as 1st tac, start from exp -----------------------"; neuper@37906: "--------- Take as 1st tac, start from exp -----------------------"; neuper@37906: "--------- Take as 1st tac, start from exp -----------------------"; neuper@37906: (*the following input is copied from BridgeLog Java <==> SML, neuper@37906: omitting unnecessary inputs*) s1210629013@55445: (*1>*)reset_states (); akargl@42176: (*2>*)CalcTree [(["functionTerm (x^2 + x + 1)", "differentiateFor x", "derivative f_'_f"],("Isac",["derivative_of","function"],["diff","differentiate_on_R"]))]; neuper@37906: (*3>*)Iterator 1; moveActiveRoot 1; neuper@37906: wneuper@59248: (*6>*)(*completeCalcHead*)autoCalculate 1 CompleteCalcHead; neuper@37906: (***difference II***) neuper@37906: val ((pt,_),_) = get_calc 1; neuper@37906: val PblObj {probl, meth, spec, fmz, env, loc, ...} = get_obj I pt []; neuper@37926: val NONE = env; neuper@37926: val (SOME istate, NONE) = loc; wneuper@59111: default_print_depth 5; writeln (istate2str (fst istate)); default_print_depth 3; neuper@37906: (*ScrState ([], neuper@37926: [], NONE, neuper@37906: ??.empty, Sundef, false)*) wneuper@59111: default_print_depth 5; spec; default_print_depth 3; neuper@38050: (*("Isac", neuper@37906: ["derivative_of", "function"], neuper@37906: ["diff", "differentiate_on_R"]) : spec*) neuper@37924: writeln (itms2str_ ctxt probl); neuper@37906: (*[ neuper@37906: (1 ,[1] ,true ,#Given ,Cor functionTerm (x ^^^ 2 + x + 1) ,(f_, [x ^^^ 2 + x + 1])), neuper@37906: (2 ,[1] ,true ,#Given ,Cor differentiateFor x ,(v_, [x])), akargl@42176: (3 ,[1] ,true ,#Find ,Cor derivative f_'_f ,(f_'_f, [f_'_f]))]*) neuper@37924: writeln (itms2str_ ctxt meth); neuper@37906: (*[ neuper@37906: (1 ,[1] ,true ,#Given ,Cor functionTerm (x ^^^ 2 + x + 1) ,(f_, [x ^^^ 2 + x + 1])), neuper@37906: (2 ,[1] ,true ,#Given ,Cor differentiateFor x ,(v_, [x])), akargl@42176: (3 ,[1] ,true ,#Find ,Cor derivative f_'_f ,(f_'_f, [f_'_f]))]*) neuper@37906: writeln"-----------------------------------------------------------"; neuper@37906: (*7>*)fetchProposedTactic 1 (*--> Apply_Method*); wneuper@59248: autoCalculate 1 (Step 1); neuper@37906: val ((pt,p),_) = get_calc 1; neuper@37906: val Form res = (#1 o pt_extract) (pt, p); neuper@37906: if term2str res = "d_d x (x ^^^ 2 + x + 1)" then () neuper@38031: else error "diff.sml Diff (x^2 + x + 1, x) from exp"; wneuper@59252: DEconstrCalcTree 1; neuper@37906: neuper@37906: "--------- init_form, start with (CAS input) ---------------"; neuper@37906: "--------- init_form, start with (CAS input) ---------------"; neuper@37906: "--------- init_form, start with (CAS input) ---------------"; s1210629013@55445: reset_states (); neuper@37906: CalcTree [([], ("e_domID", ["e_pblID"], ["e_metID"]))]; neuper@37906: (*[[from sml: > @@@@@begin@@@@@ neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: Iterator 1; neuper@37906: (*[[from sml: > @@@@@begin@@@@@ neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: moveActiveRoot 1; neuper@37906: (*[[from sml: > @@@@@begin@@@@@ neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: getFormulaeFromTo 1 ([],Pbl) ([],Pbl) 0 false; neuper@37906: (*[[from sml: > @@@@@begin@@@@@ STILL CORRECT neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: ________________________________________________ neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: refFormula 1 ([],Pbl); neuper@37906: (*[[from sml: > @@@@@begin@@@@@ STILL CORRECT neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Problem (e_domID, [e_pblID]) neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: e_domID neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: e_pblID neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: e_metID neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: moveActiveFormula 1 ([],Pbl); neuper@37906: (*[[from sml: > @@@@@begin@@@@@ neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: replaceFormula 1 "Simplify (1+2)"; neuper@37906: (*[[from sml: > @@@@@begin@@@@@ neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: Met DIFFERENCE: Pbl neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: getFormulaeFromTo 1 ([],Pbl) ([],Pbl) 0 false(* DIFFERENCE: Pbl*); neuper@37906: (*@@@@@begin@@@@@ neuper@37906: 1 neuper@37906: neuper@37906: 1 neuper@37906: neuper@37906: neuper@37906: neuper@37906: neuper@37906: neuper@37906: Pbl neuper@37906: neuper@37906: neuper@37906: neuper@37906: Simplify (1 + 2) WORKS !!!!! neuper@37906: neuper@37906: neuper@37906: neuper@37906: neuper@37906: neuper@37906: @@@@@end@@@@@*) neuper@37906: getFormulaeFromTo 1 ([],Pbl) ([],Met) 0 false; neuper@37906: (*[[from sml: > @@@@@begin@@@@@ neuper@37906: [[from sml: 1 neuper@37906: [[from sml: neuper@37906: [[from sml: 1 neuper@37906: [[from sml: error in getFormulaeFromTo neuper@37906: [[from sml: neuper@37906: [[from sml: @@@@@end@@@@@*) neuper@37906: (*step into getFormulaeFromTo --- bug corrected...*) neuper@42423: neuper@42423: "--------- build fun check_err_patt ------------------------------"; neuper@42423: "--------- build fun check_err_patt ------------------------------"; neuper@42423: "--------- build fun check_err_patt ------------------------------"; neuper@42426: val subst = [(str2term "bdv", str2term "x")]: subst; neuper@42423: val rls = norm_Rational neuper@42423: val pat = parse_patt @{theory} "(?a + ?b)/(?b + ?c) = ?a / ?c"; neuper@42423: val (res, inf) = (str2term "(2 + 3)/(3 + 4)", str2term "2 / 4"); neuper@42423: val (res, inf) = (str2term "(2 + 3)/(3 + 4)", str2term "1 / 2"); neuper@42423: neuper@42426: val (res', _, _, rewritten) = (*rewritten: the lhs of the pattern matches in res*) neuper@42423: rew_sub thy 1 [] e_rew_ord e_rls false [] (Trueprop $ pat) res; neuper@42423: if rewritten then NONE else SOME "e_errpatID"; neuper@42423: neuper@42423: val norm_res = case rewrite_set_ (Isac()) false rls res' of neuper@42423: NONE => res' neuper@42423: | SOME (norm_res, _) => norm_res neuper@42423: neuper@42423: val norm_inf = case rewrite_set_ (Isac()) false rls inf of neuper@42423: NONE => inf neuper@42423: | SOME (norm_inf, _) => norm_inf; neuper@42423: neuper@42423: res' = inf; neuper@42423: norm_res = norm_inf; neuper@42423: neuper@42423: val pat = parse_patt @{theory} "(?a + ?b)/?a = ?b"; neuper@42423: val (res, inf) = (str2term "(2 + 3)/2", str2term "3"); neuper@42426: if check_err_patt (res, inf) subst ("errpatID", pat) rls = SOME "errpatID" neuper@42423: then () else error "error patt example1 changed"; neuper@42423: neuper@42423: val pat = parse_patt @{theory} "(?a + ?b)/(?a + ?c) = ?b / ?c"; neuper@42423: val (res, inf) = (str2term "(2 + 3)/(2 + 4)", str2term "3 / 4"); neuper@42426: if check_err_patt (res, inf) subst ("errpatID", pat) rls = SOME "errpatID" neuper@42423: then () else error "error patt example2 changed"; neuper@42423: neuper@42423: val pat = parse_patt @{theory} "(?a + ?b)/(?b + ?c) = ?a / ?c"; neuper@42423: val (res, inf) = (str2term "(2 + 3)/(3 + 4)", str2term "2 / 4"); neuper@42426: if check_err_patt (res, inf) subst ("errpatID", pat) rls = SOME "errpatID" neuper@42423: then () else error "error patt example3 changed"; neuper@42423: neuper@42423: val inf = str2term "1 / 2"; neuper@42426: if check_err_patt (res, inf) subst ("errpatID", pat) rls = SOME "errpatID" neuper@42423: then () else error "error patt example3 changed"; neuper@42423: neuper@42426: "--------- build fun check_err_patt ?bdv -------------------------"; neuper@42426: "--------- build fun check_err_patt ?bdv -------------------------"; neuper@42426: "--------- build fun check_err_patt ?bdv -------------------------"; neuper@42426: val subst = [(str2term "bdv", str2term "x")]: subst; neuper@42426: val t = str2term "d_d x (x ^^^ 2 + sin (x ^^^ 4))"; neuper@42426: val SOME (t, _) = rewrite_set_inst_ thy false subst norm_diff t; neuper@42426: if term2str t = "2 * x + cos (x ^^^ 4) * 4 * x ^^^ 3" then () neuper@42426: else error "build fun check_err_patt ?bdv changed 1"; neuper@42423: neuper@42426: val rls = norm_diff neuper@42426: val pat = parse_patt @{theory} "d_d ?bdv (sin ?u) = cos (d_d ?bdv ?u)"; neuper@42426: val (res, inf) = (str2term "2 * x + d_d x (sin (x ^^^ 4))", str2term "2 * x + cos (4 * x ^^^ 3)"); neuper@42426: neuper@42426: val (res', _, _, rewritten) = (*rewritten: the lhs of the pattern matches in res*) neuper@42426: rew_sub thy 1 subst e_rew_ord e_rls false [] (Trueprop $ pat) res; neuper@42426: if term2str res' = "2 * x + cos (d_d x (x ^^^ 4))" andalso rewritten then () neuper@42426: else error "build fun check_err_patt ?bdv changed 2"; neuper@42426: neuper@42426: val norm_res = case rewrite_set_inst_ (Isac()) false subst rls res' of neuper@42426: NONE => res' neuper@42426: | SOME (norm_res, _) => norm_res; neuper@42426: if term2str norm_res = "2 * x + cos (4 * x ^^^ 3)" then () neuper@42426: else error "build fun check_err_patt ?bdv changed 3"; neuper@42426: neuper@42426: val norm_inf = case rewrite_set_inst_ (Isac()) false subst rls inf of neuper@42426: NONE => inf neuper@42426: | SOME (norm_inf, _) => norm_inf; neuper@42426: if term2str norm_inf = "2 * x + cos (4 * x ^^^ 3)" then () neuper@42426: else error "build fun check_err_patt ?bdv changed 4"; neuper@42426: neuper@42426: res' = inf; neuper@42426: if norm_res = norm_inf then () neuper@42426: else error "build fun check_err_patt ?bdv changed 5"; neuper@42426: neuper@42426: if check_err_patt (res, inf) (subst: subst) ("errpatID": errpatID, pat) rls = SOME "errpatID" neuper@42426: then () else error "error patt example1 changed"; neuper@42426: neuper@42428: "--------- build fun check_error_patterns ------------------------"; neuper@42428: "--------- build fun check_error_patterns ------------------------"; neuper@42428: "--------- build fun check_error_patterns ------------------------"; neuper@42428: val (res, inf) = neuper@42428: (str2term "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))", neuper@42428: str2term "d_d x (x ^^^ 2) + cos (4 * x ^^^ 3)"); neuper@48790: val {errpats, nrls = rls, scr = Prog prog, ...} = get_met ["diff", "differentiate_on_R"] neuper@42426: neuper@42428: val env = [(str2term "v_v", str2term "x")]; neuper@42428: val errpats = neuper@42428: [e_errpat, (*generalised for testing*) neuper@42428: ("chain-rule-diff-both", neuper@42428: [parse_patt @{theory} "d_d ?bdv (sin ?u) = cos (d_d ?bdv ?u)", neuper@42428: parse_patt @{theory} "d_d ?bdv (cos ?u) = - sin (d_d ?bdv ?u)", neuper@42428: parse_patt @{theory} "d_d ?bdv (?u ^^^ ?n) = ?n * ?u ^^^ (?n - 1)", neuper@42428: parse_patt @{theory} "d_d ?bdv (LogExp.ln ?u) = 1 / ?u", neuper@42428: parse_patt @{theory} "d_d ?bdv (LogExp.ln ?u) = 1 / d_d ?bdv ?u"], neuper@42428: [@{thm diff_sin_chain}, @{thm diff_cos_chain}, @{thm diff_pow_chain}, neuper@42428: @{thm diff_ln_chain}, @{thm diff_exp_chain}])]: errpat list; neuper@42428: case check_error_patterns (res, inf) (prog, env) (errpats, rls) of SOME _ => () neuper@42428: | NONE => error "check_error_patterns broken"; wneuper@59252: DEconstrCalcTree 1; neuper@42428: neuper@42428: "--------- embed fun check_error_patterns ------------------------"; neuper@42428: "--------- embed fun check_error_patterns ------------------------"; neuper@42428: "--------- embed fun check_error_patterns ------------------------"; s1210629013@55445: reset_states (); neuper@42428: CalcTree neuper@42428: [(["functionTerm (x ^ 2 + sin (x ^ 4))", "differentiateFor x", "derivative f_f'"], neuper@42428: ("Isac", ["derivative_of","function"], ["diff","differentiate_on_R"]))]; neuper@42428: Iterator 1; neuper@42428: moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); wneuper@59248: autoCalculate 1 (Step 1);(*([1], Res), d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))*) wneuper@59248: (*autoCalculate 1 (Step 1);([2], Res), d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4)*) neuper@42428: neuper@42428: "~~~~~ fun appendFormula, args:"; val (cI, (ifo:cterm')) = (1, "d_d x (x ^ 2) + cos (4 * x ^ 3)"); neuper@42428: val cs = get_calc cI neuper@42428: val pos as (_,p_) = get_pos cI 1; (*pos = ([1], Res)*) neuper@42428: val cs' = neuper@42428: case step pos cs of neuper@42428: ("ok", cs') => cs'; neuper@42428: neuper@42428: val (_, _, (pt, ([2], Res))) = cs'; neuper@42428: (*show_pt pt; neuper@42428: [(([], Frm), Diff (x ^^^ 2 + sin (x ^^^ 4), x)), neuper@42428: (([1], Frm), d_d x (x ^^^ 2 + sin (x ^^^ 4))), neuper@42428: (([1], Res), d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))), <<=== input follos: "...+ cos(4.x^3)" neuper@42428: (([2], Res), d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4))] *) neuper@42428: neuper@42428: "~~~~~ fun inform, args:"; val ((cs as (_, _, ptp as (pt, pos as (p, p_))): calcstate'), istr) = neuper@42428: (cs', (encode ifo)); neuper@42428: val SOME f_in = parse (assoc_thy "Isac") istr wneuper@59188: val f_in = Thm.term_of f_in neuper@42428: val pos_pred = lev_back' pos neuper@42428: (* f_pred ---"step pos cs"---> f_succ in appendFormula neuper@42428: TODO.WN120517: one starting point for redesign of pos' *) neuper@42432: val (f_pred, f_succ) = (get_curr_formula (pt, pos_pred), get_curr_formula (pt, pos)); neuper@42428: neuper@42428: term2str f_pred = "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))"; neuper@42428: term2str f_succ = "d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4)"; neuper@42428: neuper@42428: f_succ = f_in; (* = false*) neuper@42428: cas_input f_in; (* = NONE*) neuper@42428: val msg_calcstate' = compare_step ([], [], (pt, pos_pred)) f_in neuper@42428: val ("no derivation found", calcstate') = msg_calcstate'; neuper@42428: val pp = par_pblobj pt p neuper@48790: val {errpats, nrls, scr = Prog prog, ...} = get_met (get_obj g_metID pt pp) neuper@42428: val ScrState (env, _, _, _, _, _) = get_istate pt pos; neuper@42428: case check_error_patterns (f_pred, f_in) (prog, env) (errpats, nrls) of neuper@42428: SOME errpatID => ("error pattern #" ^ errpatID ^ "#", calcstate') neuper@42428: | NONE => msg_calcstate'; neuper@42428: neuper@42428: "~~~~~ from inform return val:"; val () = (); neuper@42428: case check_error_patterns (f_pred, f_in) (prog, env) (errpats, nrls) of neuper@42428: SOME errpatID => () neuper@42428: | NONE => error "check_error_patterns broken"; neuper@42428: neuper@42428: "--- final check:"; neuper@42428: case inform cs' (encode ifo) of neuper@42428: ("error pattern #chain-rule-diff-both#", calcstate') => () neuper@42428: | _ => error "inform with (positive) check_error_patterns broken" neuper@42428: neuper@48895: "--------- build fun get_fillpats --------------------------------"; neuper@48895: "--------- build fun get_fillpats --------------------------------"; neuper@48895: "--------- build fun get_fillpats --------------------------------"; neuper@48895: (*cause for this test was: wrong thy in Build_Thydata.thy in neuper@48895: insert_fillpats ["IsacKnowledge", "Diff", "Theorems", "diff_sin_chain"]*) neuper@48895: val f_curr = str2term "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" neuper@48895: val errpatID = "chain-rule-diff-both" neuper@48895: val {errpats, scr = Prog prog, ...} = get_met ["diff", "differentiate_on_R"] neuper@48895: val env = neuper@48895: [(str2term "f_f", str2term "x ^^^ 2 + sin (x ^^^ 4)"), neuper@48895: (str2term "v_v", str2term "x"), neuper@48895: (str2term "f_f'", str2term "d_d x (x ^^^ 2 + sin (x ^^^ 4))")] neuper@48895: val subst = get_bdv_subst prog env neuper@48895: val errpatthms = errpats neuper@48895: |> filter ((curry op = errpatID) o (#1: errpat -> errpatID)) neuper@48895: |> map (#3: errpat -> thm list) neuper@48895: |> flat; neuper@48895: "~~~~~ fun get_fillpats, args:"; val (subst, form, errpatID, thm) = neuper@48895: (subst, f_curr, errpatID, hd (*simulate beginning of "map"*) errpatthms); neuper@48895: val thmDeriv = Thm.get_name_hint thm neuper@48895: val (part, thyID) = thy_containing_thm thmDeriv neuper@48895: val theID = [part, thyID, "Theorems", thmID_of_derivation_name thmDeriv] neuper@48895: val Hthm {fillpats, ...} = get_the theID neuper@48895: val some = map (get_fillform subst (thm, form) errpatID) fillpats; neuper@48895: "~~~~~ fun get_fillform, args:"; neuper@48895: val ((subs_opt, subst), (thm, form), errpatID, (fillpatID, pat, erpaID)) = neuper@48895: (subst, (thm, form), errpatID, hd (*simulate beginning of "map"*) fillpats); neuper@48895: val (form', _, _, rewritten) = neuper@48895: rew_sub (Isac()) 1 subst e_rew_ord e_rls false [] (Trueprop $ pat) form; neuper@48895: "~~~~~ fun rew_sub, args:"; val (thy, i, bdv, tless, rls, put_asm, lrd:lrd list, r, t) = neuper@48895: ((Isac()), 1, subst, e_rew_ord, e_rls, false, [], (Trueprop $ pat), form); neuper@48895: val (lhs, rhs) = (HOLogic.dest_eq o HOLogic.dest_Trueprop neuper@48895: o Logic.strip_imp_concl) r; neuper@48895: (*/-------------catch the planned exception*) neuper@48895: (let neuper@48895: val r' = Envir.subst_term (Pattern.match thy (lhs, t) neuper@48895: (Vartab.empty, Vartab.empty)) r; neuper@48895: in 111 end neuper@48895: ) handle PATTERN (*because only a subterm matches*) => 111; neuper@48895: case t of t1 $ t2 => neuper@48895: let val (t2', asm2, lrd, rew2) = rew_sub thy i bdv tless rls put_asm (lrd@[R]) r t2 neuper@48895: in neuper@48895: if rew2 then (t1 $ t2', asm2, lrd, true) else neuper@48895: let val (t1', asm1, lrd, rew1) = rew_sub thy i bdv tless rls put_asm (lrd@[L]) r t1 neuper@48895: in if rew1 then (t1' $ t2, asm1, lrd, true) else (t1 $ t2,[], lrd, false) end neuper@48895: end; neuper@48895: (*catch the planned exception-------------/*) neuper@48895: neuper@48895: val t1 $ t2 = t; neuper@48895: val (t2', asm2, lrd, rew2) = rew_sub thy i bdv tless rls put_asm (lrd@[R]) r t2; neuper@48895: "~~~~~ fun rew_sub, args:"; val (thy, i, bdv, tless, rls, put_asm, lrd:lrd list, r, t) = neuper@48895: (thy, i, bdv, tless, rls, put_asm, (lrd@[R]), r, t2); neuper@48895: val (lhs, rhs) = (HOLogic.dest_eq o HOLogic.dest_Trueprop o Logic.strip_imp_concl) r; neuper@48895: val r' = Envir.subst_term (Pattern.match thy (lhs, t) (Vartab.empty, Vartab.empty)) r; neuper@48895: val p' = map HOLogic.dest_Trueprop ((fst o Logic.strip_prems) (Logic.count_prems r', [], r')); neuper@48895: val t' = (snd o HOLogic.dest_eq o HOLogic.dest_Trueprop o Logic.strip_imp_concl) r'; neuper@48895: if term2str t' = "cos (x ^^^ 4) * d_d x ?_dummy_1" then () neuper@48895: else error "get_fillpats changed 1" wneuper@59252: DEconstrCalcTree 1; neuper@48895: neuper@42430: "--------- embed fun find_fillpatterns ---------------------------"; neuper@42430: "--------- embed fun find_fillpatterns ---------------------------"; neuper@42430: "--------- embed fun find_fillpatterns ---------------------------"; s1210629013@55445: reset_states (); neuper@42430: CalcTree neuper@42430: [(["functionTerm (x ^ 2 + sin (x ^ 4))", "differentiateFor x", "derivative f_f'"], neuper@42430: ("Isac", ["derivative_of","function"], ["diff","differentiate_on_R"]))]; neuper@42430: Iterator 1; neuper@42430: moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); wneuper@59248: autoCalculate 1 (Step 1);(*([1], Res), d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))*) wneuper@59123: appendFormula 1 "d_d x (x ^ 2) + cos (4 * x ^ 3)" (*|> Future.join*); neuper@42430: (* error pattern #chain-rule-diff-both# *) neuper@42432: (*or neuper@42432: no derivation found *) neuper@42430: neuper@42433: "~~~~~ fun findFillpatterns, args:"; val (cI, errpatID) = (1, "chain-rule-diff-both"); neuper@42430: val ((pt, _), _) = get_calc cI neuper@42430: val pos = get_pos cI 1; neuper@42432: "~~~~~ fun find_fillpatterns, args:"; val ((pt, pos as (p, _)), errpatID) = ((pt, pos), errpatID); neuper@42432: val f_curr = get_curr_formula (pt, pos); (* = "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))"*) neuper@42430: val pp = par_pblobj pt p neuper@48895: val {errpats, scr = Prog prog, ...} = get_met (get_obj g_metID pt pp) neuper@42430: val ScrState (env, _, _, _, _, _) = get_istate pt pos neuper@42430: val subst = get_bdv_subst prog env neuper@42430: val errpatthms = errpats neuper@42430: |> filter ((curry op = errpatID) o (#1: errpat -> errpatID)) neuper@42430: |> map (#3: errpat -> thm list) neuper@42430: |> flat; neuper@42430: neuper@42430: case map (get_fillpats subst f_curr errpatID) errpatthms |> flat of neuper@42433: ("fill-d_d-arg", tm, thm, subs_opt) :: _ => if term2str tm = neuper@42432: "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4)) =\nd_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x ?_dummy_1" neuper@42432: then () else error "find_fillpatterns changed 1a" neuper@42432: | _ => error "find_fillpatterns changed 1b" neuper@42430: neuper@42430: "~~~~~ fun get_fillpats, args:"; val (subst, form, errpatID, thm) = neuper@42432: (subst, f_curr, errpatID, hd (*simulate beginning of "map"*) errpatthms); neuper@42430: val thmDeriv = Thm.get_name_hint thm neuper@42430: val (part, thyID) = thy_containing_thm thmDeriv neuper@42430: val theID = [part, thyID, "Theorems", thmID_of_derivation_name thmDeriv] neuper@42430: val Hthm {fillpats, ...} = get_the theID neuper@42433: val some = map (get_fillform subst (thm, form) errpatID) fillpats; neuper@42430: neuper@42430: case some |> filter is_some |> map the of neuper@42433: ("fill-d_d-arg", tm, thm, subsopt) :: _ => if term2str tm = neuper@42432: "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4)) =\nd_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x ?_dummy_1" neuper@42432: then () else error "find_fillpatterns changed 2a" neuper@42432: | _ => error "find_fillpatterns changed 2b" neuper@42430: neuper@42433: "~~~~~ fun get_fillform, args:"; neuper@42433: val ((subs_opt, subst), (thm, form), errpatID, (fillpatID, pat, erpaID)) = neuper@42433: (subst, (thm, form), errpatID, hd (*simulate beginning of "map"*) fillpats); neuper@42433: val (form', _, _, rewritten) = neuper@42432: rew_sub (Isac()) 1 subst e_rew_ord e_rls false [] (Trueprop $ pat) form; neuper@42432: neuper@42432: if term2str form' = "d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x ?_dummy_1" then () neuper@42432: else error "find_fillpatterns changed 3"; neuper@42432: neuper@42433: "~~~~~ to findFillpatterns return val:"; val (fillpats) = neuper@42433: (map (get_fillpats (subs_opt, subst) f_curr errpatID) errpatthms |> flat) (*only from "hd errpatthms"*); neuper@42432: neuper@42450: "vvv--- dropped this code WN120730"; neuper@42433: val msg = "fill patterns " ^ neuper@42433: ((map ((apsnd term2str) o quad2pair) fillpats) |> map pair2str_ |> strs2str_); neuper@42450: msg = neuper@42432: "fill patterns #fill-d_d-arg#d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" ^ neuper@42432: " =\nd_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x ?_dummy_1" ^ neuper@42432: "#fill-both-args#d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" ^ neuper@42432: " =\nd_d x (x ^^^ 2) + cos ?_dummy_2 * d_d x ?_dummy_3" ^ neuper@42432: "#fill-d_d#d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" ^ neuper@42432: " =\nd_d x (x ^^^ 2) + cos (x ^^^ 4) * ?_dummy_1 x (x ^^^ 4)" ^ neuper@42432: "#fill-inner-deriv#d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" ^ neuper@42432: " =\nd_d x (x ^^^ 2) + cos (x ^^^ 4) * ?_dummy_1" ^ neuper@42450: "#fill-all#d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4)) = d_d x (x ^^^ 2) + ?_dummy_1#"; neuper@42450: "^^^--- dropped this code WN120730"; neuper@42450: neuper@42450: if (map #1 fillpats) = neuper@42450: ["fill-d_d-arg", "fill-both-args", "fill-d_d", "fill-inner-deriv", "fill-all"] neuper@42450: then () else error "find_fillpatterns changed 4b"; wneuper@59252: DEconstrCalcTree 1; neuper@42450: neuper@42437: "--------- build fun is_exactly_equal, inputFillFormula ----------"; neuper@42437: "--------- build fun is_exactly_equal, inputFillFormula ----------"; neuper@42437: "--------- build fun is_exactly_equal, inputFillFormula ----------"; s1210629013@55445: reset_states (); neuper@42437: CalcTree neuper@42437: [(["functionTerm (x ^ 2 + sin (x ^ 4))", "differentiateFor x", "derivative f_f'"], neuper@42437: ("Isac", ["derivative_of","function"], ["diff","differentiate_on_R"]))]; neuper@42437: Iterator 1; neuper@42437: moveActiveRoot 1; wneuper@59248: autoCalculate 1 CompleteCalcHead; wneuper@59248: autoCalculate 1 (Step 1); wneuper@59248: autoCalculate 1 (Step 1);(*([1], Res), d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))*) wneuper@59123: appendFormula 1 "d_d x (x ^ 2) + cos (4 * x ^ 3)" (*|> Future.join*); (*<<<<<<<=========================*) neuper@42437: (* the check for errpat is maximally liberal (whole term modulo "nrls" from "type met"), neuper@42437: would recognize "cos (4 * x ^ (4 - 1)) + 2 * x" as well. neuper@42437: results in error pattern #chain-rule-diff-both# neuper@42437: instead of no derivation found *) neuper@42437: val ((pt,pos), _) = get_calc 1; neuper@42437: val p = get_pos 1 1; neuper@42437: val (Form f, _, asms) = pt_extract (pt, p); neuper@42437: wneuper@59253: if p = ([1], Res) andalso term2str f = "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" then wneuper@59253: case get_obj g_tac pt (fst p) of Rewrite_Inst (["(bdv, x)"], wneuper@59253: ("diff_sum", thm)) => wneuper@59253: if (term2str o Thm.prop_of) thm = "d_d ?bdv (?u + ?v) = d_d ?bdv ?u + d_d ?bdv ?v" then () wneuper@59253: else error "embed fun get_fillform changed 11" wneuper@59253: | _ => error "embed fun get_fillform changed 12" wneuper@59253: else error "embed fun get_fillform changed 13"; neuper@42437: neuper@42437: findFillpatterns 1 "chain-rule-diff-both"; (*<<<<<<<=================================*) neuper@42437: (* fill patterns #fill-d_d-arg#d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4)) = neuper@42437: d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x ?_dummy_1#fill-both-args#...#...#... *) neuper@42437: val ((pt,pos),_) = get_calc 1; neuper@42437: val p = get_pos 1 1; neuper@42437: neuper@42437: val (Form f, _, asms) = pt_extract (pt, p); wneuper@59253: if p = ([1], Res) andalso term2str f = "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" then wneuper@59253: case get_obj g_tac pt (fst p) of Rewrite_Inst (["(bdv, x)"], wneuper@59253: ("diff_sum", thm)) => wneuper@59253: if (term2str o Thm.prop_of) thm = "d_d ?bdv (?u + ?v) = d_d ?bdv ?u + d_d ?bdv ?v" then () wneuper@59253: else error "embed fun get_fillform changed 21" wneuper@59253: | _ => error "embed fun get_fillform changed 22" wneuper@59253: else error "embed fun get_fillform changed 23"; neuper@42437: neuper@42437: requestFillformula 1 ("chain-rule-diff-both", "fill-both-args");(*<<<<<<<============*) neuper@42437: (* ([1], Res) ([2], Res) ([2], Res) *) neuper@42437: val ((pt,pos),_) = get_calc 1; neuper@42437: val p = get_pos 1 1; neuper@42437: val (Form f, _, asms) = pt_extract (pt, p); wneuper@59253: if p = ([1], Res) andalso existpt [2] pt wneuper@59253: andalso term2str f = "d_d x (x ^^^ 2) + d_d x (sin (x ^^^ 4))" wneuper@59253: then case get_obj g_tac pt (fst p) of Rewrite_Inst (["(bdv, x)"], wneuper@59253: ("diff_sum", thm)) => wneuper@59253: if (term2str o Thm.prop_of) thm = "d_d ?bdv (?u + ?v) = d_d ?bdv ?u + d_d ?bdv ?v" then () wneuper@59253: else error "embed fun get_fillform changed 31" wneuper@59253: | _ => error "embed fun get_fillform changed 32" wneuper@59253: else error "embed fun get_fillform changed 33"; neuper@42437: neuper@42437: (* input a formula which exactly fills the gaps in a "fillformula" neuper@42437: presented to the learner immediately before by "requestFillformula (errpatID, fillpatID)": neuper@42437: errpatID: lhs of the respective thm = lhs of fillformula with fillpatID. neuper@42437: the respective thm is in the ctree ................ neuper@42437: *) neuper@42437: "~~~~~ fun inputFillFormula, args:"; val (cI, ifo) = neuper@42437: (1, "d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4)"); neuper@42437: val ((pt, _), _) = get_calc cI neuper@42437: val pos = get_pos cI 1; neuper@42437: neuper@42437: "~~~~~ fun is_exactly_equal, args:"; val ((pt, pos as (p, p_)), istr) = ((pt, pos), ifo); neuper@42437: val SOME ifo = parseNEW (assoc_thy "Isac" |> thy2ctxt) istr neuper@42437: val p' = lev_on p; neuper@42437: val tac = get_obj g_tac pt p'; wneuper@59252: val Rewrite_Inst ([bbb as "(bdv, x)"], ("diff_sin_chain", ttt)) = tac; wneuper@59253: if (term2str o Thm.prop_of) ttt = "d_d ?bdv (sin ?u) = cos ?u * d_d ?bdv ?u" then () wneuper@59252: else error "inputFillFormula changed 10"; neuper@42437: val Appl rew = applicable_in pos pt tac; neuper@42437: val Rewrite_Inst' (_, _, _, _, _, _, _, (res, _)) = rew; neuper@42437: neuper@42437: "~~~~~ to inputFillFormula return val:"; val ("ok", tac) = ("ok", tac); neuper@42437: val ("ok", (_, c, ptp as (_,p'))) = locatetac tac (pt, pos); neuper@42437: upd_calc cI (ptp, []); neuper@42437: upd_ipos cI 1 p'; neuper@42437: autocalculateOK2xml cI pos (if null c then p' else last_elem c) p'; neuper@42437: neuper@42437: "~~~~~ final check:"; neuper@42437: val ((pt, _),_) = get_calc 1; neuper@42437: val p = get_pos 1 1; neuper@42437: val (Form f, _, asms) = pt_extract (pt, p); wneuper@59253: if p = ([2], Res) andalso term2str f = "d_d x (x ^^^ 2) + cos (x ^^^ 4) * d_d x (x ^^^ 4)" wneuper@59253: then case get_obj g_tac pt (fst p) of Rewrite_Inst (["(bdv, x)"], wneuper@59253: ("diff_sin_chain", thm)) => wneuper@59253: if (term2str o Thm.prop_of) thm = "d_d ?bdv (sin ?u) = cos ?u * d_d ?bdv ?u" then () wneuper@59253: else error "inputFillFormula changed 111" wneuper@59253: | _ => error "inputFillFormula changed 112" wneuper@59253: else error "inputFillFormula changed 113"; neuper@42437: wneuper@59262: "--------- fun appl_adds -----------------------------------------"; wneuper@59262: "--------- fun appl_adds -----------------------------------------"; wneuper@59262: "--------- fun appl_adds -----------------------------------------"; wneuper@59262: (* val (dI, oris, ppc, pbt, selct::ss) = wneuper@59262: (dI, pors, probl, ppc, map itms2fstr probl); wneuper@59262: ...vvv wneuper@59262: *) wneuper@59262: (* val (dI, oris, ppc, pbt, (selct::ss))= wneuper@59262: (#1 (some_spec ospec spec), oris, []:itm list, wneuper@59262: ((#ppc o get_pbt) (#2 (some_spec ospec spec))),(imodel2fstr imodel)); wneuper@59262: val iii = appl_adds dI oris ppc pbt (selct::ss); wneuper@59262: tracing(itms2str_ thy iii); wneuper@59262: wneuper@59262: val itm = appl_add' dI oris ppc pbt selct; wneuper@59262: val ppc = insert_ppc' itm ppc; wneuper@59262: wneuper@59262: val _::selct::ss = (selct::ss); wneuper@59262: val itm = appl_add' dI oris ppc pbt selct; wneuper@59262: val ppc = insert_ppc' itm ppc; wneuper@59262: wneuper@59262: val _::selct::ss = (selct::ss); wneuper@59262: val itm = appl_add' dI oris ppc pbt selct; wneuper@59262: val ppc = insert_ppc' itm ppc; wneuper@59262: tracing(itms2str_ thy ppc); wneuper@59262: wneuper@59262: val _::selct::ss = (selct::ss); wneuper@59262: val itm = appl_add' dI oris ppc pbt selct; wneuper@59262: val ppc = insert_ppc' itm ppc; wneuper@59262: *) wneuper@59264: "--------- fun concat_deriv --------------------------------------"; wneuper@59264: "--------- fun concat_deriv --------------------------------------"; wneuper@59264: "--------- fun concat_deriv --------------------------------------"; wneuper@59264: (* wneuper@59264: val ({rew_ord, erls, rules,...}, fo, ifo) = wneuper@59264: (rep_rls Test_simplify, str2term "x+1+ -1*2=0", str2term "-2*1+(x+1)=0"); wneuper@59264: (tracing o trtas2str) fod'; wneuper@59264: > [" wneuper@59264: (x + 1 + -1 * 2 = 0, Thm ("radd_commute","?m + ?n = ?n + ?m"), (-1 * 2 + (x + 1) = 0, []))"," wneuper@59264: (-1 * 2 + (x + 1) = 0, Thm ("radd_commute","?m + ?n = ?n + ?m"), (-1 * 2 + (1 + x) = 0, []))"," wneuper@59264: (-1 * 2 + (1 + x) = 0, Thm ("radd_left_commute","?x + (?y + ?z) = ?y + (?x + ?z)"), (1 + (-1 * 2 + x) = 0, []))"," wneuper@59264: (1 + (-1 * 2 + x) = 0, Thm ("#mult_Float ((~1,0), (0,0)) __ ((2,0), (0,0))","-1 * 2 = -2"), (1 + (-2 + x) = 0, []))"] wneuper@59264: val it = () : unit wneuper@59264: (tracing o trtas2str) (map rev_deriv' rifod'); wneuper@59264: > [" wneuper@59264: (1 + (-2 + x) = 0, Thm ("sym_#mult_Float ((~2,0), (0,0)) __ ((1,0), (0,0))","-2 = -2 * 1"), (1 + (-2 * 1 + x) = 0, []))"," wneuper@59264: (1 + (-2 * 1 + x) = 0, Thm ("sym_radd_left_commute","?y + (?x + ?z) = ?x + (?y + ?z)"), (-2 * 1 + (1 + x) = 0, []))"," wneuper@59264: (-2 * 1 + (1 + x) = 0, Thm ("sym_radd_commute","?n + ?m = ?m + ?n"), (-2 * 1 + (x + 1) = 0, []))"] wneuper@59264: val it = () : unit wneuper@59264: *) wneuper@59264: "--------- handle an input formula -------------------------------"; wneuper@59264: "--------- handle an input formula -------------------------------"; wneuper@59264: "--------- handle an input formula -------------------------------"; wneuper@59264: (* wneuper@59264: Untersuchung zur Formeleingabe (appendFormula, replaceFormla) zu einer Anregung von Alan Krempler: wneuper@59264: Welche RICHTIGEN Formeln koennen NICHT abgeleitet werden, wneuper@59264: wenn Abteilungen nur auf gleichem Level gesucht werden ? wneuper@59264: WN.040216 wneuper@59264: wneuper@59264: Beispiele zum Equationsolver von Richard Lang aus /src/sml/kbtest/rlang.sml wneuper@59264: wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: "Schalk I s.87 Bsp 52a ((5*x)/(x - 2) - x/(x+2)=4)"; wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: 1. "5 * x / (x - 2) - x / (x + 2) = 4" wneuper@59264: ... wneuper@59264: 4. "12 * x + 4 * x ^^^ 2 = 4 * (-4 + x ^^^ 2)",Subproblem["normalize", "poly".. wneuper@59264: ... wneuper@59264: 4.3. "16 + 12 * x = 0", Subproblem["degree_1", "polynomial", "univariate".. wneuper@59264: ... wneuper@59264: 4.3.3. "[x = -4 / 3]")), Check_elementwise "Assumptions" wneuper@59264: ... wneuper@59264: "[x = -4 / 3]" wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: (1)..(6): keine 'richtige' Eingabe kann abgeleitet werden, die einen Summanden auf die andere Seite verschiebt [Ableitung ware in 4.3.n] wneuper@59264: wneuper@59264: (4.1)..(4.3): keine 'richtige' Eingabe kann abgeleitet werden, die einen Summanden auf die andere Seite verschiebt [Ableitung ware in 4.3.n] wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: wneuper@59264: wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: "Schalk I s.87 Bsp 55b (x/(x^^^2 - 6*x+9) - 1/(x^^^2 - 3*x) =1/x)"; wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: 1. "x / (x ^^^ 2 - 6 * x + 9) - 1 / (x ^^^ 2 - 3 * x) = 1 / x" wneuper@59264: ... wneuper@59264: 4. "(3 + (-1 * x + x ^^^ 2)) * x = 1 * (9 * x + (x ^^^ 3 + -6 * x ^^^ 2))" wneuper@59264: Subproblem["normalize", "polynomial", "univariate".. wneuper@59264: ... wneuper@59264: 4.4. "-6 * x + 5 * x ^^^ 2 = 0", Subproblem["bdv_only", "degree_2", "poly".. wneuper@59264: ... wneuper@59264: 4.4.4. "[x = 0, x = 6 / 5]", Check_elementwise "Assumptions" wneuper@59264: 4.4.5. "[x = 0, x = 6 / 5]" wneuper@59264: ... wneuper@59264: 5. "[x = 0, x = 6 / 5]", Check_elementwise "Assumptions" wneuper@59264: "[x = 6 / 5]" wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: (1)..(4): keine 'richtige' Eingabe kann abgeleitet werden, die einen Summanden auf die andere Seite schiebt [Ableitung waere in 4.4.x] wneuper@59264: wneuper@59264: (4.1)..(4.4.5): keine 'richtige' Eingabe kann abgeleitet werden, die dem Ergebnis "[x = 6 / 5]" aequivalent ist [Ableitung waere in 5.] wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: wneuper@59264: wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: "Schalk II s.56 Bsp 73b (sqrt(x+1)+sqrt(4*x+4)=sqrt(9*x+9))"; wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: 1. "sqrt (x + 1) + sqrt (4 * x + 4) = sqrt (9 * x + 9)" wneuper@59264: ... wneuper@59264: 6. "13 + 13 * x + -2 * sqrt ((4 + 4 * x) * (9 + 9 * x)) = 1 + x" wneuper@59264: Subproblem["sq", "root'", "univariate", "equation"] wneuper@59264: ... wneuper@59264: 6.6. "144 + 288 * x + 144 * x ^^^ 2 = 144 + x ^^^ 2 + 288 * x + 143 * x ^^^ 2" wneuper@59264: Subproblem["normalize", "polynomial", "univariate", "equation"] wneuper@59264: ... wneuper@59264: 6.6.3 "0 = 0" Subproblem["degree_0", "polynomial", "univariate", "equation"] wneuper@59264: ... Or_to_List wneuper@59264: 6.6.3.2 "UniversalList" wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: (1)..(6): keine 'richtige' Eingabe kann abgeleitet werden, die eine der Wurzeln auf die andere Seite verschieb [Ableitung ware in 6.6.n] wneuper@59264: wneuper@59264: (6.1)..(6.3): keine 'richtige' Eingabe kann abgeleitet werden, die einen Summanden auf die andere Seite verschiebt [Ableitung ware in 6.6.n] wneuper@59264: ------------------------------------------------------------------------------ wneuper@59264: *) wneuper@59264: (*sh. comments auf 498*) wneuper@59264: "--------- fun dropwhile' ----------------------------------------"; wneuper@59264: "--------- fun dropwhile' ----------------------------------------"; wneuper@59264: "--------- fun dropwhile' ----------------------------------------"; wneuper@59264: (* wneuper@59264: fun equal a b = a=b; wneuper@59264: val foder = [0,1,2,3,4,5]; val ifoder = [11,12,3,4,5]; wneuper@59264: val r_foder = rev foder; val r_ifoder = rev ifoder; wneuper@59264: dropwhile' equal r_foder r_ifoder; wneuper@59264: > vval it = ([0, 1, 2, 3], [3, 12, 11]) : int list * int list wneuper@59264: wneuper@59264: val foder = [3,4,5]; val ifoder = [11,12,3,4,5]; wneuper@59264: val r_foder = rev foder; val r_ifoder = rev ifoder; wneuper@59264: dropwhile' equal r_foder r_ifoder; wneuper@59264: > val it = ([3], [3, 12, 11]) : int list * int list wneuper@59264: wneuper@59264: val foder = [5]; val ifoder = [11,12,3,4,5]; wneuper@59264: val r_foder = rev foder; val r_ifoder = rev ifoder; wneuper@59264: dropwhile' equal r_foder r_ifoder; wneuper@59264: > val it = ([5], [5, 4, 3, 12, 11]) : int list * int list wneuper@59264: wneuper@59264: val foder = [10,11,12,13,14,15]; val ifoder = [11,12,3,4,5]; wneuper@59264: val r_foder = rev foder; val r_ifoder = rev ifoder; wneuper@59264: dropwhile' equal r_foder r_ifoder; wneuper@59264: > *** dropwhile': did not start with equal elements*)