test/Tools/isac/Knowledge/integrate.sml
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 08 Sep 2010 16:47:22 +0200
branchisac-update-Isa09-2
changeset 37991 028442673981
parent 37981 b2877b9d455a
child 37994 eb4c556a525b
permissions -rw-r--r--
tuned src + test

find . -type f -exec sed -i s/nadd_divide_distrib/add_divide_distrib/g {} \;
find . -type f -exec sed -i s/"\.thy\""/"\""/g {} \;
find . -type f -exec sed -i s/" indexname_ord"/" Term_Ord.indexname_ord"/g {} \;
find . -type f -exec sed -i s/"(string_of_cterm o cterm_of(sign_of thy))"/"(Syntax.string_of_term (thy2ctxt thy))"/g {} \;
find . -type f -exec sed -i s/" L_"/" L_L"/g {} \;
find . -type f -exec sed -i s/" L_:"/" L_L:"/g {} \;
find . -type f -exec sed -i s/"e_;"/"e_e;"/g {} \;
find . -type f -exec sed -i s/"v_)"/"v_v)"/g {} \;
find . -type f -exec sed -i s/"v_:"/"v_v:"/g {} \;
neuper@37906
     1
(* tests on integration over the reals
neuper@37906
     2
   author: Walther Neuper
neuper@37906
     3
   050814, 08:51
neuper@37906
     4
   (c) due to copyright terms
neuper@37906
     5
neuper@37906
     6
use"../smltest/IsacKnowledge/integrate.sml";
neuper@37906
     7
use"integrate.sml";
neuper@37906
     8
*)
neuper@37906
     9
val thy = Integrate.thy;
neuper@37906
    10
neuper@37906
    11
"-----------------------------------------------------------------";
neuper@37906
    12
"table of contents -----------------------------------------------";
neuper@37906
    13
"-----------------------------------------------------------------";
neuper@37906
    14
"----------- parsing ---------------------------------------------";
neuper@37906
    15
"----------- integrate by rewriting ------------------------------";
neuper@37906
    16
"----------- test add_new_c, is_f_x ------------------------------";
neuper@37906
    17
"----------- simplify by ruleset reducing make_ratpoly_in --------";
neuper@37906
    18
"----------- simplify by ruleset extending make_polynomial_in ----";
neuper@37906
    19
"----------- integrate by ruleset --------------------------------";
neuper@37906
    20
"----------- rewrite 3rd integration in 7.27 ---------------------";
neuper@37906
    21
"----------- check probem type -----------------------------------";
neuper@37906
    22
"----------- check Scripts ---------------------------------------";
neuper@37906
    23
"----------- me method [diff,integration] ------------------------";
neuper@37906
    24
"----------- me method [diff,integration,named] ------------------";
neuper@37906
    25
"----------- me method [diff,integration,named] Biegelinie.Q -----";
neuper@37906
    26
"----------- interSteps [diff,integration] -----------------------";
neuper@37906
    27
"----------- method analog to rls 'integration' ------------------";
neuper@37906
    28
"----------- Ambiguous input: Integral ?u + ?v D ?bdv = ..--------";
neuper@37906
    29
"----------- CAS input -------------------------------------------";
neuper@37906
    30
"-----------------------------------------------------------------";
neuper@37906
    31
"-----------------------------------------------------------------";
neuper@37906
    32
"-----------------------------------------------------------------";
neuper@37906
    33
neuper@37906
    34
neuper@37906
    35
neuper@37906
    36
"----------- parsing ---------------------------------------------";
neuper@37906
    37
"----------- parsing ---------------------------------------------";
neuper@37906
    38
"----------- parsing ---------------------------------------------";
neuper@37924
    39
fun str2term str = (term_of o the o (parse Integrate.thy)) str;
neuper@37934
    40
fun term2s t = Syntax.string_of_term (thy2ctxt' "Integrate") t;
neuper@37906
    41
    
neuper@37924
    42
val t = str2term "Integral x D x";
neuper@37924
    43
val t = str2term "Integral x^^^2 D x";
neuper@37906
    44
atomty t;
neuper@37906
    45
neuper@37924
    46
val t = str2term "ff x is_f_x";
neuper@37906
    47
case t of Const ("Integrate.is'_f'_x", _) $ _ => ()
neuper@37906
    48
	| _ => raise error "integrate.sml: parsing: ff x is_f_x";
neuper@37906
    49
neuper@37906
    50
neuper@37906
    51
"----------- integrate by rewriting ------------------------------";
neuper@37906
    52
"----------- integrate by rewriting ------------------------------";
neuper@37906
    53
"----------- integrate by rewriting ------------------------------";
neuper@37906
    54
val conditions_in_integration_rules =
neuper@37906
    55
Rls {id="conditions_in_integration_rules", 
neuper@37906
    56
     preconds = [], 
neuper@37906
    57
     rew_ord = ("termlessI",termlessI), 
neuper@37906
    58
     erls = Erls, 
neuper@37906
    59
     srls = Erls, calc = [],
neuper@37906
    60
     rules = [(*for rewriting conditions in Thm's*)
neuper@37906
    61
	      Calc ("Atools.occurs'_in", 
neuper@37906
    62
		    eval_occurs_in "#occurs_in_"),
neuper@37970
    63
	      Thm ("not_true",num_str @{thm not_true}),
neuper@37970
    64
	      Thm ("not_false",num_str @{thm not_false})
neuper@37906
    65
	      ],
neuper@37906
    66
     scr = EmptyScr};
neuper@37924
    67
val subs = [(str2term "bdv", str2term "x")];
neuper@37906
    68
fun rewrit thm str = 
neuper@37906
    69
    fst (the (rewrite_inst_ Integrate.thy tless_true 
neuper@37906
    70
			   conditions_in_integration_rules 
neuper@37906
    71
			   true subs thm str));
neuper@37924
    72
val str = rewrit integral_const (str2term "Integral 1 D x"); term2s str;
neuper@37924
    73
val str = rewrit integral_const (str2term  "Integral M'/EJ D x"); term2s str;
neuper@37924
    74
val str = (rewrit integral_const (str2term "Integral x D x")) 
neuper@37924
    75
    handle OPTION => str2term "no_rewrite";
neuper@37906
    76
neuper@37924
    77
val str = rewrit integral_var (str2term "Integral x D x"); term2s str;
neuper@37924
    78
val str = (rewrit integral_var (str2term "Integral a D x"))
neuper@37924
    79
    handle OPTION => str2term "no_rewrite";
neuper@37906
    80
neuper@37924
    81
val str = rewrit integral_add (str2term "Integral x + 1 D x"); term2s str;
neuper@37906
    82
neuper@37924
    83
val str = rewrit integral_mult (str2term "Integral M'/EJ * x^^^3 D x");term2s str;
neuper@37924
    84
val str = (rewrit integral_mult (str2term "Integral x * x D x"))
neuper@37924
    85
    handle OPTION => str2term "no_rewrite";
neuper@37906
    86
neuper@37924
    87
val str = rewrit integral_pow (str2term "Integral x^^^3 D x"); term2s str;
neuper@37906
    88
neuper@37906
    89
neuper@37906
    90
"----------- test add_new_c, is_f_x ------------------------------";
neuper@37906
    91
"----------- test add_new_c, is_f_x ------------------------------";
neuper@37906
    92
"----------- test add_new_c, is_f_x ------------------------------";
neuper@37906
    93
val term = str2term "x^^^2*c + c_2";
neuper@37906
    94
val cc = new_c term;
neuper@37906
    95
if term2str cc = "c_3" then () else raise error "integrate.sml: new_c ???";
neuper@37906
    96
neuper@37926
    97
val SOME (id,t') = eval_add_new_c "" "Integrate.add'_new'_c" term thy;
neuper@37906
    98
if term2str t' = "x ^^^ 2 * c + c_2 = x ^^^ 2 * c + c_2 + c_3" then ()
neuper@37906
    99
else raise error "intergrate.sml: diff. eval_add_new_c";
neuper@37906
   100
neuper@37906
   101
val cc = ("Integrate.add'_new'_c", eval_add_new_c "add_new_c_");
neuper@37926
   102
val SOME (thmstr, thm) = get_calculation1_ thy cc term;
neuper@37906
   103
neuper@37926
   104
val SOME (t',_) = rewrite_set_ thy true add_new_c term;
neuper@37906
   105
if term2str t' = "x ^^^ 2 * c + c_2 + c_3" then ()
neuper@37906
   106
else raise error "intergrate.sml: diff. rewrite_set add_new_c 1";
neuper@37906
   107
neuper@37906
   108
val term = str2term "ff x = x^^^2*c + c_2";
neuper@37926
   109
val SOME (t',_) = rewrite_set_ thy true add_new_c term;
neuper@37906
   110
if term2str t' = "ff x = x ^^^ 2 * c + c_2 + c_3" then ()
neuper@37906
   111
else raise error "intergrate.sml: diff. rewrite_set add_new_c 2";
neuper@37906
   112
neuper@37906
   113
neuper@37906
   114
(*WN080222 replace call_new_c with add_new_c----------------------
neuper@37924
   115
val term = str2term "new_c (c * x^^^2 + c_2)";
neuper@37926
   116
val SOME (_,t') = eval_new_c 0 0 term 0;
neuper@37906
   117
if term2s t' = "new_c c * x ^^^ 2 + c_2 = c_3" then ()
neuper@37906
   118
else raise error "integrate.sml: eval_new_c ???";
neuper@37906
   119
neuper@37924
   120
val t = str2term "matches (?u + new_c ?v) (x ^^^ 2 / 2)";
neuper@37926
   121
val SOME (_,t') = eval_matches "" "Tools.matches" t thy; term2s t';
neuper@37906
   122
if term2s t' = "matches (?u + new_c ?v) (x ^^^ 2 / 2) = False" then ()
neuper@37906
   123
else raise error "integrate.sml: matches new_c = False";
neuper@37906
   124
neuper@37924
   125
val t = str2term "matches (?u + new_c ?v) (x ^^^ 2 / 2 + new_c x ^^^ 2 / 2)";
neuper@37926
   126
val SOME (_,t') = eval_matches "" "Tools.matches" t thy; term2s t';
neuper@37906
   127
if term2s t'="matches (?u + new_c ?v) (x ^^^ 2 / 2 + new_c x ^^^ 2 / 2) = True"
neuper@37906
   128
then () else raise error "integrate.sml: matches new_c = True";
neuper@37906
   129
neuper@37924
   130
val t = str2term "ff x is_f_x";
neuper@37926
   131
val SOME (_,t') = eval_is_f_x "" "" t thy; term2s t';
neuper@37906
   132
if term2s t' = "(ff x is_f_x) = True" then ()
neuper@37906
   133
else raise error "integrate.sml: eval_is_f_x --> true";
neuper@37906
   134
neuper@37924
   135
val t = str2term "q_0/2 * L * x is_f_x";
neuper@37926
   136
val SOME (_,t') = eval_is_f_x "" "" t thy; term2s t';
neuper@37906
   137
if term2s t' = "(q_0 / 2 * L * x is_f_x) = False" then ()
neuper@37906
   138
else raise error "integrate.sml: eval_is_f_x --> false";
neuper@37906
   139
neuper@37906
   140
val conditions_in_integration =
neuper@37906
   141
Rls {id="conditions_in_integration", 
neuper@37970
   142
     preconds = [], 
neuper@37970
   143
     rew_ord = ("termlessI",termlessI), 
neuper@37970
   144
     erls = Erls, 
neuper@37970
   145
     srls = Erls, calc = [],
neuper@37970
   146
     rules = [Calc ("Tools.matches",eval_matches ""),
neuper@37970
   147
      	Calc ("Integrate.is'_f'_x", 
neuper@37970
   148
      	      eval_is_f_x "is_f_x_"),
neuper@37970
   149
      	Thm ("not_true",num_str @{thm not_true}),
neuper@37970
   150
      	Thm ("not_false",num_str @{thm not_false})
neuper@37970
   151
      	],
neuper@37970
   152
     scr = EmptyScr};
neuper@37906
   153
fun rewrit thm t = 
neuper@37906
   154
    fst (the (rewrite_inst_ Integrate.thy tless_true 
neuper@37906
   155
			    conditions_in_integration true subs thm t));
neuper@37924
   156
val t = rewrit call_for_new_c (str2term "x ^^^ 2 / 2"); term2s t;
neuper@37906
   157
val t = (rewrit call_for_new_c t)
neuper@37924
   158
    handle OPTION =>  str2term "no_rewrite";
neuper@37906
   159
neuper@37906
   160
val t = rewrit call_for_new_c 
neuper@37924
   161
	       (str2term "ff x = q_0/2 *L*x"); term2s t;
neuper@37906
   162
val t = (rewrit call_for_new_c 
neuper@37924
   163
	       (str2term "ff x = q_0 / 2 * L * x + new_c q_0 / 2 * L * x"))
neuper@37924
   164
    handle OPTION => (*NOT:  + new_c ..=..!!*)str2term "no_rewrite";
neuper@37906
   165
--------------------------------------------------------------------*)
neuper@37906
   166
neuper@37906
   167
neuper@37906
   168
"----------- simplify by ruleset reducing make_ratpoly_in --------";
neuper@37906
   169
"----------- simplify by ruleset reducing make_ratpoly_in --------";
neuper@37906
   170
"----------- simplify by ruleset reducing make_ratpoly_in --------";
neuper@37906
   171
val thy = Isac.thy;
neuper@37906
   172
val subs = [(str2term"bdv",str2term"x")];
neuper@37906
   173
val t = str2term "1/EI * (L * q_0 * x / 2 + -1 * q_0 * x^^^2 / 2)";
neuper@37906
   174
neuper@37906
   175
"----- stepwise from the rulesets in simplify_Integral and below-----";
neuper@37906
   176
(*###*)val rls = norm_Rational_noadd_fractions;
neuper@37906
   177
case rewrite_set_inst_ thy true subs rls t of
neuper@37926
   178
    SOME _ => raise error "integrate.sml simplify by ruleset norm_Rational_.#2"
neuper@37926
   179
  | NONE => ();
neuper@37906
   180
(* WN051028 Rational.ML 'rat_mult_div_pow' with erls = e_rls
neuper@37906
   181
applies 'rat_mult_poly_r'="?c is_polyexp ==> ?a / ?b * ?c = ?a * ?c / ?b"
neuper@37906
   182
to "(L * q_0 * x / 2 + -1 * q_0 * x ^^^ 2 / 2) / EI"
neuper@37906
   183
and keeps "..." is_polyexp" as an assumption.
neuper@37906
   184
AFTER CORRECTION in Integrate.ML as above*)
neuper@37906
   185
neuper@37906
   186
(*###*)val rls = order_add_mult_in;
neuper@37926
   187
val SOME (t,[]) = rewrite_set_ thy true rls t;
neuper@37906
   188
if term2str t = "1 / EI * (L * (q_0 * x) / 2 + -1 * (q_0 * x ^^^ 2) / 2)"then()
neuper@37906
   189
else raise error "integrate.sml simplify by ruleset order_add_mult_in #2";
neuper@37906
   190
neuper@37906
   191
(*###*)val rls = discard_parentheses;
neuper@37926
   192
val SOME (t,[]) = rewrite_set_ thy true rls t;
neuper@37906
   193
if term2str t = "1 / EI * (L * q_0 * x / 2 + -1 * q_0 * x ^^^ 2 / 2)" then ()
neuper@37906
   194
else raise error "integrate.sml simplify by ruleset discard_parenth.. #3";
neuper@37906
   195
neuper@37970
   196
val rls = 
neuper@37970
   197
    (append_rls "separate_bdv"
neuper@37970
   198
 	       collect_bdv
neuper@37970
   199
 	       [Thm ("separate_bdv", num_str @{thm separate_bdv}),
neuper@37970
   200
 		(*"?a * ?bdv / ?b = ?a / ?b * ?bdv"*)
neuper@37970
   201
 		Thm ("separate_bdv_n", num_str @{thm separate_bdv_n}),
neuper@37970
   202
 		Thm ("separate_1_bdv", num_str @{thm separate_1_bdv}),
neuper@37970
   203
 		(*"?bdv / ?b = (1 / ?b) * ?bdv"*)
neuper@37970
   204
 		Thm ("separate_1_bdv_n", num_str @{thm separate_1_bdv_n})
neuper@37970
   205
               ]);
neuper@37926
   206
val SOME (t,[]) = rewrite_set_inst_ thy true subs rls t;
neuper@37906
   207
if term2str t = "1 / EI * (L * q_0 / 2 * x + -1 * q_0 / 2 * x ^^^ 2)" then ()
neuper@37906
   208
else raise error "integrate.sml simplify by ruleset separate_bdv.. #4";
neuper@37906
   209
neuper@37906
   210
neuper@37906
   211
val t = str2term "1/EI * (L * q_0 * x / 2 + -1 * q_0 * x^^^2 / 2)";
neuper@37906
   212
val rls = simplify_Integral;
neuper@37926
   213
val SOME (t,[]) = rewrite_set_inst_ thy true subs rls t;
neuper@37906
   214
if term2str t = "1 / EI * (L * q_0 / 2 * x + -1 * q_0 / 2 * x ^^^ 2)" then ()
neuper@37906
   215
else raise error "integrate.sml, simplify_Integral #99";
neuper@37906
   216
neuper@37906
   217
"........... 2nd integral ........................................";
neuper@37906
   218
"........... 2nd integral ........................................";
neuper@37906
   219
"........... 2nd integral ........................................";
neuper@37906
   220
val t = str2term 
neuper@37906
   221
	    "Integral 1 / EI * (L * q_0 / 2 * (x ^^^ 2 / 2) + \
neuper@37906
   222
	    \-1 * q_0 / 2 * (x ^^^ 3 / 3)) D x";
neuper@37906
   223
val rls = simplify_Integral;
neuper@37926
   224
val SOME (t,[]) = rewrite_set_inst_ thy true subs rls t;
neuper@37906
   225
if term2str t = 
neuper@37906
   226
   "Integral 1 / EI * (L * q_0 / 4 * x ^^^ 2 + -1 * q_0 / 6 * x ^^^ 3) D x"
neuper@37906
   227
then () else raise error "integrate.sml, simplify_Integral #198";
neuper@37906
   228
neuper@37906
   229
val rls = integration_rules;
neuper@37926
   230
val SOME (t,[]) = rewrite_set_ thy true rls t;
neuper@37906
   231
if term2str t = 
neuper@37906
   232
   "1 / EI * (L * q_0 / 4 * (x ^^^ 3 / 3) + -1 * q_0 / 6 * (x ^^^ 4 / 4))"
neuper@37906
   233
then () else raise error "integrate.sml, simplify_Integral #199";
neuper@37906
   234
neuper@37906
   235
neuper@37906
   236
neuper@37906
   237
"----------- simplify by ruleset extending make_polynomial_in ----";
neuper@37906
   238
"----------- simplify by ruleset extending make_polynomial_in ----";
neuper@37906
   239
"----------- simplify by ruleset extending make_polynomial_in ----";
neuper@37906
   240
trace_rewrite:=true;
neuper@37906
   241
trace_rewrite:=false;
neuper@37906
   242
(*postponed: see *)
neuper@37906
   243
neuper@37906
   244
neuper@37906
   245
"----------- integrate by ruleset --------------------------------";
neuper@37906
   246
"----------- integrate by ruleset --------------------------------";
neuper@37906
   247
"----------- integrate by ruleset --------------------------------";
neuper@37906
   248
val rls = "integration_rules";
neuper@37906
   249
val subs = [("bdv","x::real")];
neuper@37906
   250
fun rewrit_sinst subs rls str = 
neuper@37991
   251
    fst (the (rewrite_set_inst "Integrate" true subs rls str));
neuper@37906
   252
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
neuper@37906
   253
val str = rewrit_sinst subs rls "Integral x D x";
neuper@37906
   254
val str = rewrit_sinst subs rls "Integral c * x ^^^ 2 + c_2 D x";
neuper@37906
   255
if str = "c * (x ^^^ 3 / 3) + c_2 * x"
neuper@37906
   256
then () else raise error "integrate.sml: diff.behav. in integration_rules";
neuper@37906
   257
neuper@37906
   258
val rls = "add_new_c";
neuper@37906
   259
val str = rewrit_sinst subs rls "c * (x ^^^ 3 / 3) + c_2 * x";
neuper@37906
   260
if str = "c * (x ^^^ 3 / 3) + c_2 * x + c_3" then () 
neuper@37906
   261
else raise error "integrate.sml: diff.behav. in add_new_c simpl.";
neuper@37906
   262
neuper@37906
   263
val str = rewrit_sinst subs rls "F x = x ^^^ 3 / 3 + x";
neuper@37906
   264
if str = "F x = x ^^^ 3 / 3 + x + c"(*not "F x + c =..."*) then () 
neuper@37906
   265
else raise error "integrate.sml: diff.behav. in add_new_c equation";
neuper@37906
   266
neuper@37906
   267
val rls = "simplify_Integral";
neuper@37906
   268
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
neuper@37906
   269
val str = "ff x = c * x + -1 * q_0 * (x ^^^ 2 / 2) + c_2";
neuper@37906
   270
val str = rewrit_sinst subs rls str;
neuper@37906
   271
if str = "ff x = c_2 + c * x + -1 * q_0 / 2 * x ^^^ 2"
neuper@37906
   272
then () else raise error "integrate.sml: diff.behav. in simplify_I #1";
neuper@37906
   273
neuper@37906
   274
val rls = "integration";
neuper@37906
   275
(*~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
neuper@37906
   276
val str = rewrit_sinst subs rls "Integral c * x ^^^ 2 + c_2 D x";
neuper@37906
   277
if str = "c_3 + c_2 * x + c / 3 * x ^^^ 3"
neuper@37906
   278
then () else raise error "integrate.sml: diff.behav. in integration #1";
neuper@37906
   279
neuper@37906
   280
val str = rewrit_sinst subs rls "Integral 3*x^^^2 + 2*x + 1 D x";
neuper@37906
   281
if str = "c + x + x ^^^ 2 + x ^^^ 3" then () 
neuper@37906
   282
else raise error "integrate.sml: diff.behav. in integration #2";
neuper@37906
   283
neuper@37906
   284
val str = rewrit_sinst subs rls 
neuper@37906
   285
"Integral 1 / EI * (L * q_0 / 2 * x + -1 * q_0 / 2 * x ^^^ 2) D x";
neuper@37906
   286
if str =
neuper@37906
   287
   "c + 1 / EI * (L * q_0 / 4 * x ^^^ 2 + -1 * q_0 / 6 * x ^^^ 3)"
neuper@37906
   288
then () else raise error "integrate.sml: diff.behav. in integration #3";
neuper@37906
   289
neuper@37906
   290
val str = "Integral "^str^" D x";
neuper@37906
   291
val str = rewrit_sinst subs rls str;
neuper@37906
   292
if str =
neuper@37906
   293
   "c_2 + c * x + 1 / EI * (L * q_0 / 12 * x ^^^ 3 + -1 * q_0 / 24 * x ^^^ 4)"
neuper@37906
   294
then () else raise error "integrate.sml: diff.behav. in integration #4";
neuper@37906
   295
neuper@37906
   296
neuper@37906
   297
"----------- rewrite 3rd integration in 7.27 ---------------------";
neuper@37906
   298
"----------- rewrite 3rd integration in 7.27 ---------------------";
neuper@37906
   299
"----------- rewrite 3rd integration in 7.27 ---------------------";
neuper@37906
   300
val thy = Isac.thy (*because of Undeclared constant "Biegelinie.EI*);
neuper@37906
   301
val bdv = [(str2term"bdv", str2term"x")];
neuper@37906
   302
val t = str2term
neuper@37906
   303
	    "Integral 1 / EI * ((L * q_0 * x + -1 * q_0 * x ^^^ 2) / 2) D x";
neuper@37926
   304
val SOME(t,_)= rewrite_set_inst_ thy true bdv simplify_Integral t;
neuper@37906
   305
if term2str t = 
neuper@37906
   306
   "Integral 1 / EI * (L * q_0 / 2 * x + -1 * q_0 / 2 * x ^^^ 2) D x" then ()
neuper@37906
   307
else raise error "integrate.sml 3rd integration in 7.27, simplify_Integral";
neuper@37906
   308
neuper@37926
   309
val SOME(t,_)= rewrite_set_inst_ thy true bdv integration t;
neuper@37906
   310
if term2str t = "c + 1 / EI * (L * q_0 / 4 * x ^^^ 2 + -1 * q_0 / 6 * x ^^^ 3)"
neuper@37906
   311
then () else raise error "integrate.sml 3rd integration in 7.27, integration";
neuper@37906
   312
neuper@37906
   313
neuper@37906
   314
"----------- check probem type -----------------------------------";
neuper@37906
   315
"----------- check probem type -----------------------------------";
neuper@37906
   316
"----------- check probem type -----------------------------------";
neuper@37981
   317
val model = {Given =["functionTerm f_", "integrateBy v_v"],
neuper@37906
   318
	     Where =[],
neuper@37906
   319
	     Find  =["antiDerivative F_"],
neuper@37906
   320
	     With  =[],
neuper@37906
   321
	     Relate=[]}:string ppc;
neuper@37906
   322
val chkmodel = ((map (the o (parse Integrate.thy))) o ppc2list) model;
neuper@37906
   323
val t1 = (term_of o hd) chkmodel;
neuper@37906
   324
val t2 = (term_of o hd o tl) chkmodel;
neuper@37906
   325
val t3 = (term_of o hd o tl o tl) chkmodel;
neuper@37906
   326
case t3 of Const ("Integrate.antiDerivative", _) $ _ => ()
neuper@37906
   327
	 | _ => raise error "integrate.sml: Integrate.antiDerivative ???";
neuper@37906
   328
neuper@37981
   329
val model = {Given =["functionTerm f_", "integrateBy v_v"],
neuper@37906
   330
	     Where =[],
neuper@37906
   331
	     Find  =["antiDerivativeName F_"],
neuper@37906
   332
	     With  =[],
neuper@37906
   333
	     Relate=[]}:string ppc;
neuper@37906
   334
val chkmodel = ((map (the o (parse Integrate.thy))) o ppc2list) model;
neuper@37906
   335
val t1 = (term_of o hd) chkmodel;
neuper@37906
   336
val t2 = (term_of o hd o tl) chkmodel;
neuper@37906
   337
val t3 = (term_of o hd o tl o tl) chkmodel;
neuper@37906
   338
case t3 of Const ("Integrate.antiDerivativeName", _) $ _ => ()
neuper@37906
   339
	 | _ => raise error "integrate.sml: Integrate.antiDerivativeName";
neuper@37906
   340
neuper@37906
   341
"----- compare 'Find's from problem, script, formalization -------";
neuper@37906
   342
val {ppc,...} = get_pbt ["named","integrate","function"];
neuper@37906
   343
val ("#Find", (Const ("Integrate.antiDerivativeName", _),
neuper@37906
   344
	       F1_ as Free ("F_", F1_type))) = last_elem ppc;
neuper@37906
   345
val {scr = Script sc,... } = get_met ["diff","integration","named"];
neuper@37906
   346
val [_,_, F2_] = formal_args sc;
neuper@37906
   347
if F1_ = F2_ then () else raise error "integrate.sml: unequal find's";
neuper@37906
   348
neuper@37906
   349
val ((dsc as Const ("Integrate.antiDerivativeName", _)) 
neuper@37924
   350
	 $ Free ("ff", F3_type)) = str2term "antiDerivativeName ff";
neuper@37906
   351
if is_dsc dsc then () else raise error "integrate.sml: no description";
neuper@37906
   352
if F1_type = F3_type then () 
neuper@37906
   353
else raise error "integrate.sml: unequal types in find's";
neuper@37906
   354
neuper@37906
   355
show_ptyps();
neuper@37906
   356
val pbl = get_pbt ["integrate","function"];
neuper@37926
   357
case #cas pbl of SOME (Const ("Integrate.Integrate",_) $ _) => ()
neuper@37906
   358
	 | _ => raise error "integrate.sml: Integrate.Integrate ???";
neuper@37906
   359
neuper@37906
   360
neuper@37906
   361
"----------- check Scripts ---------------------------------------";
neuper@37906
   362
"----------- check Scripts ---------------------------------------";
neuper@37906
   363
"----------- check Scripts ---------------------------------------";
neuper@37906
   364
val str = 
neuper@37991
   365
"Script IntegrationScript (f_::real) (v_v::real) =               \
neuper@37981
   366
\  (let t_ = Take (Integral f_ D v_v)                                 \
neuper@37991
   367
\   in (Rewrite_Set_Inst [(bdv,v_v)] integration False) (t_::real))";
neuper@37906
   368
val sc = ((inst_abs thy) o term_of o the o (parse thy)) str;
neuper@37906
   369
atomty sc;
neuper@37906
   370
neuper@37906
   371
val str = 
neuper@37991
   372
"Script NamedIntegrationScript (f_::real) (v_v::real) (F_::real=>real) = \
neuper@37981
   373
\  (let t_ = Take (F_ v_v = Integral f_ D v_v)                         \
neuper@37991
   374
\   in (Rewrite_Set_Inst [(bdv,v_v)] integration False) t_)";
neuper@37906
   375
val sc = ((inst_abs thy) o term_of o the o (parse thy)) str;
neuper@37906
   376
atomty sc;
neuper@37906
   377
show_mets();
neuper@37906
   378
neuper@37906
   379
neuper@37906
   380
"----------- me method [diff,integration] ---------------------";
neuper@37906
   381
"----------- me method [diff,integration] ---------------------";
neuper@37906
   382
"----------- me method [diff,integration] ---------------------";
neuper@37906
   383
(*exp_CalcInt_No-1.xml*)
neuper@37906
   384
val fmz = ["functionTerm (x^^^2 + 1)", 
neuper@37906
   385
	   "integrateBy x","antiDerivative FF"];
neuper@37906
   386
val (dI',pI',mI') =
neuper@37991
   387
  ("Integrate",["integrate","function"],
neuper@37906
   388
   ["diff","integration"]);
neuper@37906
   389
val p = e_pos'; val c = []; 
neuper@37906
   390
val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
neuper@37906
   391
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   392
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   393
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   394
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   395
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   396
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   397
val (p,_,f,nxt,_,pt) = me nxt p c pt(*nxt <- Apply_Method*);
neuper@37906
   398
val (p,_,f,nxt,_,pt) = me nxt p c pt; f2str f;
neuper@37906
   399
val (p,_,f,nxt,_,pt) = me nxt p c pt; f2str f;
neuper@37906
   400
val (p,_,f,nxt,_,pt) = me nxt p c pt; f2str f;
neuper@37906
   401
if f2str f = "c + x + 1 / 3 * x ^^^ 3" then ()
neuper@37906
   402
else raise error "integrate.sml: method [diff,integration]";
neuper@37906
   403
neuper@37906
   404
neuper@37906
   405
"----------- me method [diff,integration,named] ------------------";
neuper@37906
   406
"----------- me method [diff,integration,named] ------------------";
neuper@37906
   407
"----------- me method [diff,integration,named] ------------------";
neuper@37906
   408
(*exp_CalcInt_No-2.xml*)
neuper@37906
   409
val fmz = ["functionTerm (x^^^2 + 1)", 
neuper@37906
   410
	   "integrateBy x","antiDerivativeName F"];
neuper@37906
   411
val (dI',pI',mI') =
neuper@37991
   412
  ("Integrate",["named","integrate","function"],
neuper@37906
   413
   ["diff","integration","named"]);
neuper@37906
   414
val p = e_pos'; val c = []; 
neuper@37906
   415
val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
neuper@37906
   416
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   417
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   418
val (p,_,f,nxt,_,pt) = me nxt p c pt(*nxt <- Add_Find *);
neuper@37906
   419
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   420
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   421
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   422
val (p,_,f,nxt,_,pt) = me nxt p c pt(*nxt <- Apply_Method*);
neuper@37906
   423
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   424
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   425
val (p,_,f,nxt,_,pt) = me nxt p c pt; f2str f;
neuper@37906
   426
if f2str f = "F x = c + x + 1 / 3 * x ^^^ 3" then() 
neuper@37906
   427
else raise error "integrate.sml: method [diff,integration,named]";
neuper@37906
   428
neuper@37906
   429
neuper@37906
   430
"----------- me method [diff,integration,named] Biegelinie.Q -----";
neuper@37906
   431
"----------- me method [diff,integration,named] Biegelinie.Q -----";
neuper@37906
   432
"----------- me method [diff,integration,named] Biegelinie.Q -----";
neuper@37906
   433
(*exp_CalcInt_No-3.xml*)
neuper@37906
   434
val fmz = ["functionTerm (- q_0)", 
neuper@37906
   435
	   "integrateBy x","antiDerivativeName Q"];
neuper@37906
   436
val (dI',pI',mI') =
neuper@37991
   437
  ("Biegelinie",["named","integrate","function"],
neuper@37906
   438
   ["diff","integration","named"]);
neuper@37906
   439
val p = e_pos'; val c = [];
neuper@37906
   440
val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
neuper@37906
   441
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   442
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   443
(*Error Tac Q not in ...*)
neuper@37906
   444
val (p,_,f,nxt,_,pt) = me nxt p c pt(*nxt <- Add_Find *);
neuper@37906
   445
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   446
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   447
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   448
val (p,_,f,nxt,_,pt) = me nxt p c pt(*nxt <- Apply_Method*);
neuper@37906
   449
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   450
val (p,_,f,nxt,_,pt) = me nxt p c pt;
neuper@37906
   451
val (p,_,f,nxt,_,pt) = me nxt p c pt; f2str f;
neuper@37906
   452
neuper@37906
   453
if f2str f = "Q x = c + -1 * q_0 * x" then() 
neuper@37906
   454
else raise error "integrate.sml: method [diff,integration,named] .Q";
neuper@37906
   455
neuper@37906
   456
neuper@37906
   457
"----------- interSteps [diff,integration] -----------------------";
neuper@37906
   458
"----------- interSteps [diff,integration] -----------------------";
neuper@37906
   459
"----------- interSteps [diff,integration] -----------------------";
neuper@37906
   460
states:=[];
neuper@37906
   461
CalcTree
neuper@37906
   462
[(["functionTerm (x^2 + 1)","integrateBy x","antiDerivative FF"], 
neuper@37991
   463
  ("Integrate",["integrate","function"],
neuper@37906
   464
  ["diff","integration"]))];
neuper@37906
   465
Iterator 1;
neuper@37906
   466
moveActiveRoot 1;
neuper@37906
   467
autoCalculate 1 CompleteCalc;
neuper@37906
   468
val ((pt,p),_) = get_calc 1; show_pt pt;
neuper@37906
   469
neuper@37906
   470
interSteps 1 ([1],Res);
neuper@37906
   471
val ((pt,p),_) = get_calc 1; show_pt pt;
neuper@37906
   472
if existpt' ([1,3], Res) pt then ()
neuper@37906
   473
else raise error "integrate.sml: interSteps on Rewrite_Set_Inst 1";
neuper@37906
   474
neuper@37906
   475
neuper@37906
   476
"----------- method analog to rls 'integration' ------------------";
neuper@37906
   477
"----------- method analog to rls 'integration' ------------------";
neuper@37906
   478
"----------- method analog to rls 'integration' ------------------";
neuper@37906
   479
store_met
neuper@37906
   480
    (prep_met Integrate.thy "met_testint" [] e_metID
neuper@37906
   481
	      (["diff","integration","test"],
neuper@37981
   482
	       [("#Given" ,["functionTerm f_", "integrateBy v_v"]),
neuper@37906
   483
		("#Find"  ,["antiDerivative F_"])
neuper@37906
   484
		],
neuper@37906
   485
	       {rew_ord'="tless_true", rls'=Atools_erls, calc = [], 
neuper@37906
   486
		srls = e_rls, 
neuper@37906
   487
		prls=e_rls,
neuper@37906
   488
	     crls = Atools_erls, nrls = e_rls},
neuper@37991
   489
"Script IntegrationScript (f_::real) (v_v::real) =             \
neuper@37991
   490
\  (((Rewrite_Set_Inst [(bdv,v_v)] integration_rules False) @@ \
neuper@37991
   491
\    (Rewrite_Set_Inst [(bdv,v_v)] add_new_c False)         @@ \
neuper@37991
   492
\    (Rewrite_Set_Inst [(bdv,v_v)] simplify_Integral False)) (f_::real))"
neuper@37906
   493
));
neuper@37906
   494
neuper@37906
   495
states:=[];
neuper@37906
   496
CalcTree
neuper@37906
   497
[(["functionTerm (Integral x^2 + 1 D x)","integrateBy x",
neuper@37906
   498
   "antiDerivative FF"], 
neuper@37991
   499
  ("Integrate",["integrate","function"],
neuper@37906
   500
  ["diff","integration","test"]))];
neuper@37906
   501
Iterator 1;
neuper@37906
   502
moveActiveRoot 1;
neuper@37906
   503
autoCalculate 1 CompleteCalcHead;
neuper@37906
   504
neuper@37906
   505
fetchProposedTactic 1  (*..Apply_Method*);
neuper@37906
   506
autoCalculate 1 (Step 1);
neuper@37906
   507
getTactic 1 ([1], Frm)  (*still empty*);
neuper@37906
   508
neuper@37906
   509
fetchProposedTactic 1  (*Rewrite_Set_Inst integration_rules*);
neuper@37906
   510
autoCalculate 1 (Step 1);
neuper@37906
   511
neuper@37906
   512
fetchProposedTactic 1  (*Rewrite_Set_Inst add_new_c*);
neuper@37906
   513
autoCalculate 1 (Step 1);
neuper@37906
   514
neuper@37906
   515
fetchProposedTactic 1  (*Rewrite_Set_Inst simplify_Integral*);
neuper@37906
   516
autoCalculate 1 (Step 1);
neuper@37906
   517
neuper@37906
   518
autoCalculate 1 CompleteCalc;
neuper@37906
   519
val ((pt,p),_) = get_calc 1; show_pt pt;
neuper@37906
   520
if existpt' ([3], Res) pt then ()
neuper@37906
   521
else raise error  "integrate.sml: test-script doesnt work";
neuper@37906
   522
neuper@37906
   523
neuper@37906
   524
"----------- Ambiguous input: Integral ?u + ?v D ?bdv = ..--------";
neuper@37906
   525
"----------- Ambiguous input: Integral ?u + ?v D ?bdv = ..--------";
neuper@37906
   526
"----------- Ambiguous input: Integral ?u + ?v D ?bdv = ..--------";
neuper@37906
   527
states:=[];
neuper@37906
   528
CalcTree
neuper@37906
   529
[(["functionTerm (x^2 + 1)","integrateBy x","antiDerivative FF"], 
neuper@37991
   530
  ("Integrate",["integrate","function"],
neuper@37906
   531
  ["diff","integration"]))];
neuper@37906
   532
Iterator 1;
neuper@37906
   533
moveActiveRoot 1;
neuper@37906
   534
autoCalculate 1 CompleteCalc;
neuper@37906
   535
val ((pt,p),_) = get_calc 1; show_pt pt;
neuper@37906
   536
neuper@37906
   537
interSteps 1 ([1],Res);
neuper@37906
   538
val ((pt,p),_) = get_calc 1; show_pt pt;
neuper@37906
   539
interSteps 1 ([1,1],Res);
neuper@37906
   540
val ((pt,p),_) = get_calc 1; show_pt pt;
neuper@37906
   541
getTactic 1 ([1,1,1],Frm);
neuper@37906
   542
neuper@37906
   543
val str = (unenclose o string_of_thm) integral_add;
neuper@37906
   544
writeln str;
neuper@37906
   545
(*
neuper@37906
   546
read_cterm (sign_of thy) (str,(TVar(("DUMMY",0),[])));
neuper@37906
   547
neuper@37906
   548
*** More than one term is type correct:
neuper@37906
   549
*** ((Integral (?u + ?v) D ?bdv) =
neuper@37906
   550
***  (Integral ?u D (?bdv + (Integral ?v D ?bdv))))
neuper@37906
   551
                ###^^^###
neuper@37906
   552
*** ((Integral (?u + ?v) D ?bdv) =
neuper@37906
   553
***  ((Integral ?u D ?bdv) + (Integral ?v D ?bdv)))
neuper@37906
   554
*)
neuper@37906
   555
neuper@37906
   556
if existpt' ([1,1,5], Res) pt then ()
neuper@37906
   557
else raise error "integrate.sml: interSteps on Rewrite_Set_Inst 2";
neuper@37906
   558
neuper@37906
   559
"----------- CAS input -------------------------------------------";
neuper@37906
   560
"----------- CAS input -------------------------------------------";
neuper@37906
   561
"----------- CAS input -------------------------------------------";
neuper@37906
   562
val t = str2term "Integrate (x^^^2 + x + 1, x)";
neuper@37906
   563
case t of Const ("Integrate.Integrate", _) $ _ => ()
neuper@37906
   564
	| _ => raise error "diff.sml behav.changed for Integrate (..., x)";
neuper@37906
   565
atomty t;
neuper@37906
   566
neuper@37906
   567
states:=[];
neuper@37906
   568
CalcTree [([], ("e_domID", ["e_pblID"], ["e_metID"]))];
neuper@37906
   569
Iterator 1;
neuper@37906
   570
moveActiveRoot 1;
neuper@37906
   571
replaceFormula 1 "Integrate (x^2 + x + 1, x)";
neuper@37906
   572
autoCalculate 1 CompleteCalc;
neuper@37906
   573
val ((pt,p),_) = get_calc 1;
neuper@37906
   574
val Form res = (#1 o pt_extract) (pt, ([],Res));
neuper@37906
   575
show_pt pt;
neuper@37906
   576
(* WN070703 does not work like Diff due to error in next-pos
neuper@37906
   577
if p = ([], Res) andalso term2str res = "5 * a" then ()
neuper@37906
   578
else raise error "diff.sml behav.changed for Integrate (x^2 + x + 1, x)";
neuper@37934
   579
*)