test/Tools/isac/Knowledge/partial_fractions.sml
author Walther Neuper <wneuper@ist.tugraz.at>
Thu, 22 Dec 2016 11:36:20 +0100
changeset 59279 255c853ea2f0
parent 59253 f0bb15a046ae
child 59357 17bc5920c2fb
permissions -rwxr-xr-x
renamed Ctree.ptree --> Ctree.ctree
     1 (* Title:  partial fraction decomposition
     2    Author: Jan Rocnik
     3    (c) due to copyright terms
     4 *)
     5 
     6 "--------------------------------------------------------";
     7 "table of contents --------------------------------------";
     8 "--------------------------------------------------------";
     9 "----------- why helpless here ? ------------------------";
    10 "----------- why not nxt = Model_Problem here ? ---------";
    11 "----------- fun factors_from_solution ------------------";
    12 "----------- Logic.unvarify_global ----------------------";
    13 "----------- eval_drop_questionmarks --------------------";
    14 "----------- = me for met_partial_fraction --------------";
    15 "----------- autoCalculate for met_partial_fraction -----";
    16 "----------- progr.vers.2: check erls for multiply_ansatz";
    17 "----------- progr.vers.2: improve program --------------";
    18 "--------------------------------------------------------";
    19 "--------------------------------------------------------";
    20 "--------------------------------------------------------";
    21 
    22 
    23 "----------- why helpless here ? ------------------------";
    24 "----------- why helpless here ? ------------------------";
    25 "----------- why helpless here ? ------------------------";
    26 val fmz = ["filterExpression (X z = 3 / (z - 1/4 + -1/8 * (1/(z::real))))", 
    27   "stepResponse (x[n::real]::bool)"];
    28 val (dI,pI,mI) = ("Isac", ["Inverse", "Z_Transform", "SignalProcessing"], 
    29   ["SignalProcessing","Z_Transform","Inverse"]);
    30 val (p,_,f,nxt,_,pt)  = CalcTreeTEST [(fmz, (dI,pI,mI))]; 
    31 val (p,_,f,nxt,_,pt) = me nxt p [] pt; "Add_Given";
    32 val (p,_,f,nxt,_,pt) = me nxt p [] pt; "Add_Find";
    33 val (p,_,f,nxt,_,pt) = me nxt p [] pt; "Specify_Theory";
    34 val (p,_,f,nxt,_,pt) = me nxt p [] pt; "Specify_Problem";
    35 val (p,_,f,nxt,_,pt) = me nxt p [] pt; "Specify_Method";
    36 val (p,_,f,nxt,_,pt) = me nxt p [] pt; "nxt = Apply_Method";
    37 val (p,_,f,nxt,_,pt) = me nxt p [] pt; "nxt = Rewrite (ruleZY, Inverse_Z_Transform.ruleZY) --> X z = 3 / (z - 1 / 4 + -1 / 8 * (1 / z))";
    38 val (p''',_,f,nxt''',_,pt''') = me nxt p [] pt; "nxt = Rewrite_Set norm_Rational --> X' z = 3 / (z * (z - 1 / 4 + -1 / 8 * (1 / z)))";
    39 "~~~~~ fun me, args:"; val ((_,tac), (p:pos'), _, (pt:ctree)) = (nxt, p, [], pt);
    40 val ("ok", (_, _, ptp)) = locatetac tac (pt,p)
    41 val (pt, p) = ptp;
    42 "~~~~~ fun step, args:"; val (((ip as (_,p_)):pos'), ((ptp as (pt,p), tacis):calcstate)) = 
    43                            (p, ((pt, e_pos'),[]));
    44 val pIopt = get_pblID (pt,ip);
    45 ip = ([],Res); "false";
    46 tacis; " = []";
    47 pIopt; (* = SOME ["Inverse", "Z_Transform", "SignalProcessing"]*)
    48 member op = [Pbl,Met] p_ andalso is_none (get_obj g_env pt (fst p)); "false";
    49 (*nxt_solve_ (pt,ip); "WAS isalist2list applied to NON-list 'no_meth'"
    50    THIS MEANS: replace no_meth by [no_meth] in Script.*)
    51 (*WAS val ("helpless",_) = step p ((pt, e_pos'),[]) *)
    52 (*WAS val (p,_,f,nxt,_,pt) = me nxt p [] pt; "Empty_Tac instead SubProblem";*)
    53 
    54 "----------- why not nxt = Model_Problem here ? ---------";
    55 "----------- why not nxt = Model_Problem here ? ---------";
    56 "----------- why not nxt = Model_Problem here ? ---------";
    57 val (p,_,f,nxt,_,pt) = me nxt''' p''' [] pt'''; 
    58 "~~~~~ fun me, args:"; val (((_,tac):tac'_), (p:pos'), _, (pt:ctree)) = (nxt, p, c, pt);
    59 val ("ok", (_, _, ptp)) = locatetac tac (pt,p);
    60 val (pt, p) = ptp;
    61 "~~~~~ fun step, args:"; val (((ip as (_,p_)):pos'), ((ptp as (pt,p), tacis):calcstate)) =
    62                            (p, ((pt, e_pos'),[]));
    63 val pIopt = get_pblID (pt,ip);
    64 ip = ([],Res); " = false";
    65 tacis; " = []";                                         
    66 pIopt (* = SOME ["Inverse", "Z_Transform", "SignalProcessing"]*);
    67 member op = [Pbl,Met] p_ andalso is_none (get_obj g_env pt (fst p)); " = false";
    68 (*                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ leads into
    69 nxt_solve_, which is definitely WRONG (should be nxt_specify_ for FIND_ADD).
    70 This ERROR seems to be introduced together with ctxt, concerns Apply_Method without init_form.
    71 See TODO.txt
    72 *)
    73 
    74 "----------- fun factors_from_solution ------------------";
    75 "----------- fun factors_from_solution ------------------";
    76 "----------- fun factors_from_solution ------------------";
    77 val ctxt = Proof_Context.init_global @{theory Isac};
    78 val SOME t = parseNEW ctxt "factors_from_solution [(z::real) = 1 / 2, z = -1 / 4]";
    79 val SOME (_, t') = eval_factors_from_solution "" 0 t thy;
    80 if term2str t' =
    81  "factors_from_solution [z = 1 / 2, z = -1 / 4] = (z - 1 / 2) * (z - -1 / 4)"
    82 then () else error "factors_from_solution broken";
    83 
    84 "----------- Logic.unvarify_global ----------------------";
    85 "----------- Logic.unvarify_global ----------------------";
    86 "----------- Logic.unvarify_global ----------------------";
    87 val A_var = parseNEW ctxt "A::real" |> the |> Logic.varify_global
    88 val B_var = parseNEW ctxt "B::real" |> the |> Logic.varify_global
    89 
    90 val denom1 = parseNEW ctxt "(z + -1 * (1 / 2))::real" |> the;
    91 val denom2 = parseNEW ctxt "(z + -1 * (-1 / 4))::real" |> the;
    92 
    93 val test = HOLogic.mk_binop "Groups.plus_class.plus"
    94   (HOLogic.mk_binop "Fields.inverse_class.divide" (A_var, denom1),
    95    HOLogic.mk_binop "Fields.inverse_class.divide" (B_var, denom2));
    96 
    97 if term2str test = "?A / (z + -1 * (1 / 2)) + ?B / (z + -1 * (-1 / 4))" then ()
    98   else error "HOLogic.mk_binop broken ?";
    99 
   100 (* Logic.unvarify_global test
   101 ---> exception TERM raised (line 539 of "logic.ML"): Illegal fixed variable: "z"
   102 thus we need another fun var2free in termC.sml*)
   103 
   104 "----------- eval_drop_questionmarks --------------------";
   105 "----------- eval_drop_questionmarks --------------------";
   106 "----------- eval_drop_questionmarks --------------------";
   107 if term2str test = "?A / (z + -1 * (1 / 2)) + ?B / (z + -1 * (-1 / 4))"
   108 then () else error "test setup (ctxt!) probably changed";
   109 
   110 val t = Const ("Partial_Fractions.drop_questionmarks", HOLogic.realT --> HOLogic.realT) $ test;
   111 
   112 val SOME (_, t') = eval_drop_questionmarks "drop_questionmarks" 0 t @{theory Isac};
   113 if term2str t' = "drop_questionmarks (?A / (z + -1 * (1 / 2)) + ?B / (z + -1 * (-1 / 4))) =" ^
   114   "\nA / (z + -1 * (1 / 2)) + B / (z + -1 * (-1 / 4))"
   115 then () else error "eval_drop_questionmarks broken";
   116 
   117 "----------- = me for met_partial_fraction --------------";
   118 "----------- = me for met_partial_fraction --------------";
   119 "----------- = me for met_partial_fraction --------------";
   120   val fmz =                                             
   121     ["functionTerm (3 / (z * (z - 1 / 4 + -1 / 8 * (1 / z))))", 
   122       "solveFor z", "decomposedFunction p_p"];
   123   val (dI',pI',mI') =
   124     ("Partial_Fractions", 
   125       ["partial_fraction", "rational", "simplification"],
   126       ["simplification","of_rationals","to_partial_fraction"]);
   127   val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
   128   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   129   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   130   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   131   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   132   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   133   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   134   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   135   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   136   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   137   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   138   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   139   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   140   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   141   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   142   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   143   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   144   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   145   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   146   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   147   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   148   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   149   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   150   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   151   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   152   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   153   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   154   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   155   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   156   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   157   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   158   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   159   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   160   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   161   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   162   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   163   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   164   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   165   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   166   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   167   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   168   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   169   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   170   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   171   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   172   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   173   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   174   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   175   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   176   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   177   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   178   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   179   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   180   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   181   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   182   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   183   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   184   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   185   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   186   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   187   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   188   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   189   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   190   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   191   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   192   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   193   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   194   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   195   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   196   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   197   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   198   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   199   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   200   val (p,_,f,nxt,_,pt) = me nxt p [] pt; 
   201   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   202   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   203   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   204   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   205   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   206   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   207   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   208   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   209   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   210   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   211   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   212   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   213   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   214   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   215   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   216   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   217   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   218   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   219   val (p,_,f,nxt,_,pt) = me nxt p [] pt; 
   220 
   221 show_pt pt;
   222 if f2str f = "4 / (z - 1 / 2) + -4 / (z - -1 / 4)" then() 
   223 else error "= me .. met_partial_fraction broken";
   224 
   225 "----------- autoCalculate for met_partial_fraction -----";
   226 "----------- autoCalculate for met_partial_fraction -----";
   227 "----------- autoCalculate for met_partial_fraction -----";
   228 reset_states ();
   229   val fmz =                                             
   230     ["functionTerm (3 / (z * (z - 1 / 4 + -1 / 8 * (1 / z))))", 
   231       "solveFor z", "decomposedFunction p_p"];
   232   val (dI', pI', mI') =
   233     ("Partial_Fractions", 
   234       ["partial_fraction", "rational", "simplification"],
   235       ["simplification","of_rationals","to_partial_fraction"]);
   236 CalcTree [(fmz, (dI' ,pI' ,mI'))];
   237 Iterator 1;
   238 moveActiveRoot 1;
   239 autoCalculate 1 CompleteCalc; 
   240 
   241 val ((pt,p),_) = get_calc 1; val ip = get_pos 1 1;
   242 if p = ip andalso ip = ([], Res) then ()
   243   else error "autoCalculate for met_partial_fraction changed: final pos'";
   244 
   245 val (Form f, tac, asms) = pt_extract (pt, p);
   246 if term2str f = "4 / (z - 1 / 2) + -4 / (z - -1 / 4)" andalso
   247   terms2str' asms = "[~ matches (?a = 0) (3 = -3 * B / 4) | ~ lhs (3 = -3 * B / 4) is_poly_in B," ^
   248   "B = -4,lhs (3 + 3 / 4 * B = 0) is_poly_in B,lhs (3 + 3 / 4 * B = 0) has_degree_in B = 1," ^
   249   "B is_polyexp,A is_polyexp," ^
   250   "~ matches (?a = 0) (3 = 3 * A / 4) | ~ lhs (3 = 3 * A / 4) is_poly_in A," ^
   251   "A = 4,lhs (3 + -3 / 4 * A = 0) is_poly_in A,lhs (3 + -3 / 4 * A = 0) has_degree_in A = 1," ^
   252   "lhs (-1 + -2 * z + 8 * z ^^^ 2 = 0) has_degree_in z = 2," ^
   253   "lhs (-1 + -2 * z + 8 * z ^^^ 2 = 0) is_poly_in z,z = 1 / 2,z = -1 / 4,z is_polyexp]"
   254 then case tac of NONE => ()
   255   | _ => error "autoCalculate for met_partial_fraction changed: final result 1"
   256 else error "autoCalculate for met_partial_fraction changed: final result 2"
   257 
   258 show_pt pt;
   259 (*[
   260 (([], Frm), Problem (Partial_Fractions, [partial_fraction, rational, simplification])),
   261 (([1], Frm), 3 / (z * (z - 1 / 4 + -1 / 8 * (1 / z)))),
   262 (([1], Res), 24 / (-1 + -2 * z + 8 * z ^^^ 2)),
   263 (([2], Pbl), solve (-1 + -2 * z + 8 * z ^^^ 2 = 0, z)),
   264 (([2,1], Frm), -1 + -2 * z + 8 * z ^^^ 2 = 0),
   265 (([2,1], Res), z = (- -2 + sqrt (-2 ^^^ 2 - 4 * 8 * -1)) / (2 * 8) |
   266 z = (- -2 - sqrt (-2 ^^^ 2 - 4 * 8 * -1)) / (2 * 8)),
   267 (([2,2], Res), z = 1 / 2 | z = -1 / 4),
   268 (([2,3], Res), [z = 1 / 2, z = -1 / 4]),
   269 (([2,4], Res), [z = 1 / 2, z = -1 / 4]),
   270 (([2], Res), [z = 1 / 2, z = -1 / 4]),
   271 (([3], Frm), 3 / ((z - 1 / 2) * (z - -1 / 4))),
   272 (([3], Res), ?A / (z - 1 / 2) + ?B / (z - -1 / 4)),
   273 (([4], Frm), 3 / ((z - 1 / 2) * (z - -1 / 4)) = ?A / (z - 1 / 2) + ?B / (z - -1 / 4)),
   274 (([4], Res), 3 = ?A * (z - -1 / 4) + ?B * (z - 1 / 2)),
   275 (([5], Frm), 3 = A * (z - -1 / 4) + B * (z - 1 / 2)),
   276 (([5], Res), 3 = A * (1 / 2 - -1 / 4) + B * (1 / 2 - 1 / 2)),
   277 (([6], Res), 3 = 3 * A / 4),
   278 (([7], Pbl), solve (3 = 3 * A / 4, A)),
   279 (([7,1], Frm), 3 = 3 * A / 4),
   280 (([7,1], Res), 3 - 3 * A / 4 = 0),
   281 (([7,2], Res), 3 / 1 + -3 / 4 * A = 0),
   282 (([7,3], Res), 3 + -3 / 4 * A = 0),
   283 (([7,4], Pbl), solve (3 + -3 / 4 * A = 0, A)),
   284 (([7,4,1], Frm), 3 + -3 / 4 * A = 0),
   285 (([7,4,1], Res), A = -1 * 3 / (-3 / 4)),
   286 (([7,4,2], Res), A = -3 / (-3 / 4)),
   287 (([7,4,3], Res), A = 4),
   288 (([7,4,4], Res), [A = 4]),
   289 (([7,4,5], Res), [A = 4]),
   290 (([7,4], Res), [A = 4]),
   291 (([7], Res), [A = 4]),
   292 (([8], Frm), 3 = A * (z - -1 / 4) + B * (z - 1 / 2)),
   293 (([8], Res), 3 = A * (-1 / 4 - -1 / 4) + B * (-1 / 4 - 1 / 2)),
   294 (([9], Res), 3 = -3 * B / 4),
   295 (([10], Pbl), solve (3 = -3 * B / 4, B)),
   296 (([10,1], Frm), 3 = -3 * B / 4),
   297 (([10,1], Res), 3 - -3 * B / 4 = 0),
   298 (([10,2], Res), 3 / 1 + 3 / 4 * B = 0),
   299 (([10,3], Res), 3 + 3 / 4 * B = 0),
   300 (([10,4], Pbl), solve (3 + 3 / 4 * B = 0, B)),
   301 (([10,4,1], Frm), 3 + 3 / 4 * B = 0),
   302 (([10,4,1], Res), B = -1 * 3 / (3 / 4)),
   303 (([10,4,2], Res), B = -3 / (3 / 4)),
   304 (([10,4,3], Res), B = -4),
   305 (([10,4,4], Res), [B = -4]),
   306 (([10,4,5], Res), [B = -4]),
   307 (([10,4], Res), [B = -4]),
   308 (([10], Res), [B = -4]),
   309 (([11], Frm), A / (z - 1 / 2) + B / (z - -1 / 4)),
   310 (([11], Res), 4 / (z - 1 / 2) + -4 / (z - -1 / 4)),
   311 (([], Res), 4 / (z - 1 / 2) + -4 / (z - -1 / 4))] *)
   312 
   313 "----------- progr.vers.2: check erls for multiply_ansatz";
   314 "----------- progr.vers.2: check erls for multiply_ansatz";
   315 "----------- progr.vers.2: check erls for multiply_ansatz";
   316 (*test for outcommented 3 lines in script: is norm_Rational strong enough?*)
   317 val t = str2term "(3 / ((-1 + -2 * z + 8 * z ^^^ 2) *3/24)) = (3 / ((z - 1 / 2) * (z - -1 / 4)))";
   318 val SOME (t', _) = rewrite_set_ @{theory Isac} true ansatz_rls t;
   319 term2str t' = "3 / ((-1 + -2 * z + 8 * z ^^^ 2) * 3 / 24) =\n?A / (z - 1 / 2) + ?B / (z - -1 / 4)";
   320 
   321 val SOME (t'', _) = rewrite_set_ @{theory Isac} true multiply_ansatz t'; (*true*)
   322 term2str t'' = "(z - 1 / 2) * (z - -1 / 4) * 3 / ((-1 + -2 * z + 8 * z ^^^ 2) * 3 / 24) =\n" ^
   323   "?A * (z - -1 / 4) + ?B * (z - 1 / 2)"; (*true*)
   324 
   325 val SOME (t''', _) = rewrite_set_ @{theory Isac} true norm_Rational t''; 
   326 if term2str t''' = "3 = ?A * (1 + 4 * z) / 4 + ?B * (-1 + 2 * z) / 2" then () 
   327 else error "ansatz_rls - multiply_ansatz - norm_Rational broken"; 
   328 
   329 (*test for outcommented 3 lines in script: empower erls for x = a*b ==> ...*)
   330 val xxx = append_rls "multiply_ansatz_erls" norm_Rational 
   331   [Calc ("HOL.eq",eval_equal "#equal_")];
   332 
   333 val multiply_ansatz = prep_rls @{theory} (
   334   Rls {id = "multiply_ansatz", preconds = [], rew_ord = ("dummy_ord",dummy_ord), 
   335 	  erls = xxx,
   336 	  srls = Erls, calc = [], errpatts = [],
   337 	  rules = 
   338 	   [Thm ("multiply_2nd_order",num_str @{thm multiply_2nd_order})
   339 	   ], 
   340 	 scr = EmptyScr}:rls);
   341 
   342 rewrite_set_ thy true xxx @{term "a+b = a+(b::real)"}; (*SOME ok*)
   343 rewrite_set_ thy true multiply_ansatz @{term "a+b = a+(b::real)"}; (*why NONE?: GOON*)
   344 
   345 "----------- progr.vers.2: improve program --------------";
   346 "----------- progr.vers.2: improve program --------------";
   347 "----------- progr.vers.2: improve program --------------";
   348 (*WN120318 stopped due to much effort with the test above*)
   349      "Script PartFracScript (f_f::real) (zzz::real) =                    " ^(*f_f: 3 / (z * (z - 1 / 4 + -1 / 8 * (1 / z)), zzz: z*)
   350      " (let f_f = Take f_f;                                       " ^
   351      "   (num_orig::real) = get_numerator f_f;                    " ^(*num_orig: 3*)
   352      "   f_f = (Rewrite_Set norm_Rational False) f_f;             " ^(*f_f: 24 / (-1 + -2 * z + 8 * z ^^^ 2)*)
   353      "   (numer::real) = get_numerator f_f;                       " ^(*numer: 24*)
   354      "   (denom::real) = get_denominator f_f;                     " ^(*denom: -1 + -2 * z + 8 * z ^^^ 2*)
   355      "   (equ::bool) = (denom = (0::real));                       " ^(*equ: -1 + -2 * z + 8 * z ^^^ 2 = 0*)
   356      "   (L_L::bool list) = (SubProblem (PolyEq',                 " ^
   357      "     [abcFormula, degree_2, polynomial, univariate, equation], " ^
   358      "     [no_met]) [BOOL equ, REAL zzz]);                       " ^(*L_L: [z = 1 / 2, z = -1 / 4]*)
   359      "   (facs::real) = factors_from_solution L_L;                " ^(*facs: (z - 1 / 2) * (z - -1 / 4)*)
   360      "   (eql::real) = Take (num_orig / facs);                    " ^(*eql: 3 / ((z - 1 / 2) * (z - -1 / 4)) *) 
   361      "   (eqr::real) = (Try (Rewrite_Set ansatz_rls False)) eql;  " ^(*eqr: ?A / (z - 1 / 2) + ?B / (z - -1 / 4)*)
   362      "   (eq::bool) = Take (eql = eqr);                           " ^(*eq:  3 / ((z - 1 / 2) * (z - -1 / 4)) = ?A / (z - 1 / 2) + ?B / (z - -1 / 4)*)
   363 (*this has been tested below by rewrite_set_
   364      "   (eeeee::bool) = Take ((num_orig / denom * denom / numer) = (num_orig / facs));" ^(**)
   365      "   (eeeee::bool) = (Rewrite_Set ansatz_rls False) eeeee;" ^(**)
   366      "   eq = (Try (Rewrite_Set multiply_ansatz False)) eeeee;         " ^(*eq: 3 = ?A * (z - -1 / 4) + ?B * (z - 1 / 2)*) 
   367 NEXT try to outcomment the very next line..*)
   368      "   eq = (Try (Rewrite_Set equival_trans False)) eeeee;         " ^(*eq: 3 = ?A * (z - -1 / 4) + ?B * (z - 1 / 2)*) 
   369      "   eq = drop_questionmarks eq;                              " ^(*eq: 3 = A * (z - -1 / 4) + B * (z - 1 / 2)*)
   370      "   (z1::real) = (rhs (NTH 1 L_L));                          " ^(*z1: 1 / 2*)
   371      "   (z2::real) = (rhs (NTH 2 L_L));                          " ^(*z2: -1 / 4*)
   372      "   (eq_a::bool) = Take eq;                                  " ^(*eq_a: 3 = A * (z - -1 / 4) + B * (z - 1 / 2)*)
   373      "   eq_a = (Substitute [zzz = z1]) eq;                       " ^(*eq_a: 3 = A * (1 / 2 - -1 / 4) + B * (1 / 2 - 1 / 2)*)
   374      "   eq_a = (Rewrite_Set norm_Rational False) eq_a;           " ^(*eq_a: 3 = 3 * A / 4*)
   375      "   (sol_a::bool list) =                                     " ^
   376      "     (SubProblem (Isac', [univariate,equation], [no_met])   " ^
   377      "     [BOOL eq_a, REAL (A::real)]);                          " ^(*sol_a: [A = 4]*)
   378      "   (a::real) = (rhs (NTH 1 sol_a));                         " ^(*a: 4*)
   379      "   (eq_b::bool) = Take eq;                                  " ^(*eq_b: 3 = A * (z - -1 / 4) + B * (z - 1 / 2)*)
   380      "   eq_b = (Substitute [zzz = z2]) eq_b;                     " ^(*eq_b: *)
   381      "   eq_b = (Rewrite_Set norm_Rational False) eq_b;           " ^(*eq_b: *)
   382      "   (sol_b::bool list) =                                     " ^
   383      "     (SubProblem (Isac', [univariate,equation], [no_met])   " ^
   384      "     [BOOL eq_b, REAL (B::real)]);                          " ^(*sol_b: [B = -4]*)
   385      "   (b::real) = (rhs (NTH 1 sol_b));                         " ^(*b: -4*)
   386      "   eqr = drop_questionmarks eqr;                            " ^(*eqr: A / (z - 1 / 2) + B / (z - -1 / 4)*)
   387      "   (pbz::real) = Take eqr;                                  " ^(*pbz: A / (z - 1 / 2) + B / (z - -1 / 4)*)
   388      "   pbz = ((Substitute [A = a, B = b]) pbz)                  " ^(*pbz: 4 / (z - 1 / 2) + -4 / (z - -1 / 4)*)
   389      " in pbz)"
   390