src/Tools/isac/Knowledge/Diff.thy
author Walther Neuper <neuper@ist.tugraz.at>
Thu, 17 May 2012 16:44:13 +0200
changeset 42427 d28a071bb6db
parent 42426 fc042a668d7a
child 42449 36ac220da82e
permissions -rw-r--r--
intermed.
     1 (* differentiation over the reals
     2    author: Walther Neuper
     3    000516   
     4  *)
     5 
     6 theory Diff imports Calculus Trig LogExp Rational Root Poly Atools begin
     7 
     8 ML {*
     9 @{term "sin x"}
    10 *}
    11 
    12 consts
    13 
    14   d_d           :: "[real, real]=> real"
    15 (*sin, cos      :: "real => real"      already in Isabelle2009-2*)
    16 (*
    17   log, ln       :: "real => real"
    18   nlog          :: "[real, real] => real"
    19   exp           :: "real => real"         ("E'_ ^^^ _" 80)
    20 *)
    21   (*descriptions in the related problems*)
    22   derivativeEq  :: "bool => una"
    23 
    24   (*predicates*)
    25   primed        :: "'a => 'a" (*"primed A" -> "A'"*)
    26 
    27   (*the CAS-commands, eg. "Diff (2*x^^^3, x)", 
    28 			  "Differentiate (A = s * (a - s), s)"*)
    29   Diff           :: "[real * real] => real"
    30   Differentiate  :: "[bool * real] => bool"
    31 
    32   (*subproblem and script-name*)
    33   differentiate  :: "[ID * (ID list) * ID, real,real] => real"
    34                	   ("(differentiate (_)/ (_ _ ))" 9)
    35   DiffScr        :: "[real,real,  real] => real"
    36                    ("((Script DiffScr (_ _ =))// (_))" 9)
    37   DiffEqScr      :: "[bool,real,  bool] => bool"
    38                    ("((Script DiffEqScr (_ _ =))// (_))" 9)
    39 
    40 text {*a variant of the derivatives defintion:
    41 
    42   d_d            :: "(real => real) => (real => real)"
    43 
    44   advantages:
    45 (1) no variable 'bdv' on the meta-level required
    46 (2) chain_rule "d_d (%x. (u (v x))) = (%x. (d_d u)) (v x) * d_d v"
    47 (3) and no specialized chain-rules required like
    48     diff_sin_chain "d_d bdv (sin u)    = cos u * d_d bdv u"
    49 
    50   disadvantage: d_d (%x. 1 + x^2) = ... differs from high-school notation
    51 *}
    52 
    53 axioms(*axiomatization where*) (*stated as axioms, todo: prove as theorems
    54         'bdv' is a constant on the meta-level  *)
    55   diff_const:     "[| Not (bdv occurs_in a) |] ==> d_d bdv a = 0" (*and*)
    56   diff_var:       "d_d bdv bdv = 1" (*and*)
    57   diff_prod_const:"[| Not (bdv occurs_in u) |] ==>  
    58 					 d_d bdv (u * v) = u * d_d bdv v" (*and*)
    59 
    60   diff_sum:       "d_d bdv (u + v)     = d_d bdv u + d_d bdv v" (*and*)
    61   diff_dif:       "d_d bdv (u - v)     = d_d bdv u - d_d bdv v" (*and*)
    62   diff_prod:      "d_d bdv (u * v)     = d_d bdv u * v + u * d_d bdv v" (*and*)
    63   diff_quot:      "Not (v = 0) ==> (d_d bdv (u / v) =  
    64 	           (d_d bdv u * v - u * d_d bdv v) / v ^^^ 2)" (*and*)
    65 
    66   diff_sin:       "d_d bdv (sin bdv)   = cos bdv" (*and*)
    67   diff_sin_chain: "d_d bdv (sin u)     = cos u * d_d bdv u" (*and*)
    68   diff_cos:       "d_d bdv (cos bdv)   = - sin bdv" (*and*)
    69   diff_cos_chain: "d_d bdv (cos u)     = - sin u * d_d bdv u" (*and*)
    70   diff_pow:       "d_d bdv (bdv ^^^ n) = n * (bdv ^^^ (n - 1))" (*and*)
    71   diff_pow_chain: "d_d bdv (u ^^^ n)   = n * (u ^^^ (n - 1)) * d_d bdv u" (*and*)
    72   diff_ln:        "d_d bdv (ln bdv)    = 1 / bdv" (*and*)
    73   diff_ln_chain:  "d_d bdv (ln u)      = d_d bdv u / u" (*and*)
    74   diff_exp:       "d_d bdv (exp bdv)   = exp bdv" (*and*)
    75   diff_exp_chain: "d_d bdv (exp u)     = exp u * d_d x u" (*and*)
    76 (*
    77   diff_sqrt      "d_d bdv (sqrt bdv)  = 1 / (2 * sqrt bdv)"
    78   diff_sqrt_chain"d_d bdv (sqrt u)    = d_d bdv u / (2 * sqrt u)"
    79 *)
    80   (*...*)
    81 
    82   frac_conv:       "[| bdv occurs_in b; 0 < n |] ==>  
    83 		    a / (b ^^^ n) = a * b ^^^ (-n)" (*and*)
    84   frac_sym_conv:   "n < 0 ==> a * b ^^^ n = a / b ^^^ (-n)" (*and*)
    85 
    86   sqrt_conv_bdv:   "sqrt bdv = bdv ^^^ (1 / 2)" (*and*)
    87   sqrt_conv_bdv_n: "sqrt (bdv ^^^ n) = bdv ^^^ (n / 2)" (*and*)
    88   sqrt_conv:       "bdv occurs_in u ==> sqrt u = u ^^^ (1 / 2)" (*and*)
    89   sqrt_sym_conv:   "u ^^^ (a / 2) = sqrt (u ^^^ a)" (*and*)
    90 
    91   root_conv:       "bdv occurs_in u ==> nroot n u = u ^^^ (1 / n)" (*and*)
    92   root_sym_conv:   "u ^^^ (a / b) = nroot b (u ^^^ a)" (*and*)
    93 
    94   realpow_pow_bdv: "(bdv ^^^ b) ^^^ c = bdv ^^^ (b * c)"
    95 
    96 ML {*
    97 val thy = @{theory};
    98 
    99 (** eval functions **)
   100 
   101 fun primed (Const (id, T)) = Const (id ^ "'", T)
   102   | primed (Free (id, T)) = Free (id ^ "'", T)
   103   | primed t = error ("primed called with arg = '"^ term2str t ^"'");
   104 
   105 (*("primed", ("Diff.primed", eval_primed "#primed"))*)
   106 fun eval_primed _ _ (p as (Const ("Diff.primed",_) $ t)) _ =
   107     SOME ((term2str p) ^ " = " ^ term2str (primed t),
   108 	  Trueprop $ (mk_equality (p, primed t)))
   109   | eval_primed _ _ _ _ = NONE;
   110 
   111 calclist':= overwritel (!calclist', 
   112    [("primed", ("Diff.primed", eval_primed "#primed"))
   113     ]);
   114 *}
   115 ML {*
   116 (** rulesets **)
   117 
   118 (*.converts a term such that differentiation works optimally.*)
   119 val diff_conv =   
   120     Rls {id="diff_conv", 
   121 	 preconds = [], 
   122 	 rew_ord = ("termlessI",termlessI), 
   123 	 erls = append_rls "erls_diff_conv" e_rls 
   124 			   [Calc ("Atools.occurs'_in", eval_occurs_in ""),
   125 			    Thm ("not_true",num_str @{thm not_true}),
   126 			    Thm ("not_false",num_str @{thm not_false}),
   127 			    Calc ("Orderings.ord_class.less",eval_equ "#less_"),
   128 			    Thm ("and_true",num_str @{thm and_true}),
   129 			    Thm ("and_false",num_str @{thm and_false})
   130 			    ], 
   131 	 srls = Erls, calc = [],
   132 	 rules = [Thm ("frac_conv", num_str @{thm frac_conv}),
   133 		  Thm ("sqrt_conv_bdv", num_str @{thm sqrt_conv_bdv}),
   134 		  Thm ("sqrt_conv_bdv_n", num_str @{thm sqrt_conv_bdv_n}),
   135 		  Thm ("sqrt_conv", num_str @{thm sqrt_conv}),
   136 		  Thm ("root_conv", num_str @{thm root_conv}),
   137 		  Thm ("realpow_pow_bdv", num_str @{thm realpow_pow_bdv}),
   138 		  Calc ("Groups.times_class.times", eval_binop "#mult_"),
   139 		  Thm ("rat_mult",num_str @{thm rat_mult}),
   140 		  (*a / b * (c / d) = a * c / (b * d)*)
   141 		  Thm ("times_divide_eq_right",num_str @{thm times_divide_eq_right}),
   142 		  (*?x * (?y / ?z) = ?x * ?y / ?z*)
   143 		  Thm ("times_divide_eq_left",num_str @{thm times_divide_eq_left})
   144 		  (*?y / ?z * ?x = ?y * ?x / ?z*)
   145 		 ],
   146 	 scr = EmptyScr};
   147 *}
   148 ML {*
   149 (*.beautifies a term after differentiation.*)
   150 val diff_sym_conv =   
   151     Rls {id="diff_sym_conv", 
   152 	 preconds = [], 
   153 	 rew_ord = ("termlessI",termlessI), 
   154 	 erls = append_rls "erls_diff_sym_conv" e_rls 
   155 			   [Calc ("Orderings.ord_class.less",eval_equ "#less_")
   156 			    ], 
   157 	 srls = Erls, calc = [],
   158 	 rules = [Thm ("frac_sym_conv", num_str @{thm frac_sym_conv}),
   159 		  Thm ("sqrt_sym_conv", num_str @{thm sqrt_sym_conv}),
   160 		  Thm ("root_sym_conv", num_str @{thm root_sym_conv}),
   161 		  Thm ("sym_real_mult_minus1",
   162 		       num_str (@{thm real_mult_minus1} RS @{thm sym})),
   163 		      (*- ?z = "-1 * ?z"*)
   164 		  Thm ("rat_mult",num_str @{thm rat_mult}),
   165 		  (*a / b * (c / d) = a * c / (b * d)*)
   166 		  Thm ("times_divide_eq_right",num_str @{thm times_divide_eq_right}),
   167 		  (*?x * (?y / ?z) = ?x * ?y / ?z*)
   168 		  Thm ("times_divide_eq_left",num_str @{thm times_divide_eq_left}),
   169 		  (*?y / ?z * ?x = ?y * ?x / ?z*)
   170 		  Calc ("Groups.times_class.times", eval_binop "#mult_")
   171 		 ],
   172 	 scr = EmptyScr};
   173 
   174 (*..*)
   175 val srls_diff = 
   176     Rls {id="srls_differentiate..", 
   177 	 preconds = [], 
   178 	 rew_ord = ("termlessI",termlessI), 
   179 	 erls = e_rls, 
   180 	 srls = Erls, calc = [],
   181 	 rules = [Calc("Tools.lhs", eval_lhs "eval_lhs_"),
   182 		  Calc("Tools.rhs", eval_rhs "eval_rhs_"),
   183 		  Calc("Diff.primed", eval_primed "Diff.primed")
   184 		  ],
   185 	 scr = EmptyScr};
   186 *}
   187 ML {*
   188 (*..*)
   189 val erls_diff = 
   190     append_rls "erls_differentiate.." e_rls
   191                [Thm ("not_true",num_str @{thm not_true}),
   192 		Thm ("not_false",num_str @{thm not_false}),
   193 		
   194 		Calc ("Atools.ident",eval_ident "#ident_"),    
   195 		Calc ("Atools.is'_atom",eval_is_atom "#is_atom_"),
   196 		Calc ("Atools.occurs'_in",eval_occurs_in ""),
   197 		Calc ("Atools.is'_const",eval_const "#is_const_")
   198 		];
   199 
   200 (*.rules for differentiation, _no_ simplification.*)
   201 val diff_rules =
   202     Rls {id="diff_rules", preconds = [], rew_ord = ("termlessI",termlessI), 
   203 	 erls = erls_diff, srls = Erls, calc = [],
   204 	 rules = [Thm ("diff_sum",num_str @{thm diff_sum}),
   205 		  Thm ("diff_dif",num_str @{thm diff_dif}),
   206 		  Thm ("diff_prod_const",num_str @{thm diff_prod_const}),
   207 		  Thm ("diff_prod",num_str @{thm diff_prod}),
   208 		  Thm ("diff_quot",num_str @{thm diff_quot}),
   209 		  Thm ("diff_sin",num_str @{thm diff_sin}),
   210 		  Thm ("diff_sin_chain",num_str @{thm diff_sin_chain}),
   211 		  Thm ("diff_cos",num_str @{thm diff_cos}),
   212 		  Thm ("diff_cos_chain",num_str @{thm diff_cos_chain}),
   213 		  Thm ("diff_pow",num_str @{thm diff_pow}),
   214 		  Thm ("diff_pow_chain",num_str @{thm diff_pow_chain}),
   215 		  Thm ("diff_ln",num_str @{thm diff_ln}),
   216 		  Thm ("diff_ln_chain",num_str @{thm diff_ln_chain}),
   217 		  Thm ("diff_exp",num_str @{thm diff_exp}),
   218 		  Thm ("diff_exp_chain",num_str @{thm diff_exp_chain}),
   219 (*
   220 		  Thm ("diff_sqrt",num_str @{thm diff_sqrt}),
   221 		  Thm ("diff_sqrt_chain",num_str @{thm diff_sqrt_chain}),
   222 *)
   223 		  Thm ("diff_const",num_str @{thm diff_const}),
   224 		  Thm ("diff_var",num_str @{thm diff_var})
   225 		  ],
   226 	 scr = EmptyScr};
   227 *}
   228 ML {*
   229 (*.normalisation for checking user-input.*)
   230 val norm_diff = 
   231   Rls
   232     {id="diff_rls", preconds = [], rew_ord = ("termlessI",termlessI), 
   233      erls = Erls, srls = Erls, calc = [],
   234      rules = [Rls_ diff_rules, Rls_ norm_Poly ],
   235      scr = EmptyScr};
   236 
   237 ruleset' := 
   238 overwritelthy @{theory} (!ruleset', 
   239 	    [("diff_rules", prep_rls norm_diff),
   240 	     ("norm_diff", prep_rls norm_diff),
   241 	     ("diff_conv", prep_rls diff_conv),
   242 	     ("diff_sym_conv", prep_rls diff_sym_conv)
   243 	     ]);
   244 
   245 *}
   246 ML {*
   247 (** problem types **)
   248 
   249 store_pbt
   250  (prep_pbt thy "pbl_fun" [] e_pblID
   251  (["function"], [], e_rls, NONE, []));
   252 
   253 store_pbt
   254  (prep_pbt thy "pbl_fun_deriv" [] e_pblID
   255  (["derivative_of","function"],
   256   [("#Given" ,["functionTerm f_f","differentiateFor v_v"]),
   257    ("#Find"  ,["derivative f_f'"])
   258   ],
   259   append_rls "e_rls" e_rls [],
   260   SOME "Diff (f_f, v_v)", [["diff","differentiate_on_R"],
   261 			 ["diff","after_simplification"]]));
   262 
   263 (*here "named" is used differently from Integration"*)
   264 store_pbt
   265  (prep_pbt thy "pbl_fun_deriv_nam" [] e_pblID
   266  (["named","derivative_of","function"],
   267   [("#Given" ,["functionEq f_f","differentiateFor v_v"]),
   268    ("#Find"  ,["derivativeEq f_f'"])
   269   ],
   270   append_rls "e_rls" e_rls [],
   271   SOME "Differentiate (f_f, v_v)", [["diff","differentiate_equality"]]));
   272 *}
   273 ML {*
   274 
   275 (** methods **)
   276 
   277 store_met
   278  (prep_met thy "met_diff" [] e_metID
   279  (["diff"], [],
   280    {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
   281     crls = Atools_erls, errpats = [], nrls = norm_diff}, "empty_script"));
   282 
   283 store_met
   284  (prep_met thy "met_diff_onR" [] e_metID
   285  (["diff","differentiate_on_R"],
   286    [("#Given" ,["functionTerm f_f","differentiateFor v_v"]),
   287     ("#Find"  ,["derivative f_f'"])
   288     ],
   289    {rew_ord'="tless_true", rls' = erls_diff, calc = [], srls = e_rls, 
   290     prls=e_rls, crls = Atools_erls, errpats = [("chain-rule-diff-both",
   291       [parse_patt @{theory} "d_d ?bdv (sin ?u) = cos (d_d ?bdv ?u)",
   292       parse_patt @{theory} "d_d ?bdv (cos ?u) = - sin (d_d ?bdv ?u)",
   293       parse_patt @{theory} "d_d ?bdv (?u ^^^ ?n) = ?n * ?u ^^^ (?n - 1)",
   294       parse_patt @{theory} "d_d ?bdv (LogExp.ln ?u) = 1 / ?u",
   295       parse_patt @{theory} "d_d ?bdv (LogExp.ln ?u) = 1 / d_d ?bdv ?u"],
   296       [@{thm diff_sin_chain}, @{thm diff_cos_chain}, @{thm diff_pow_chain}, 
   297       @{thm diff_ln_chain}, @{thm  diff_exp_chain}])], nrls = norm_diff},
   298 "Script DiffScr (f_f::real) (v_v::real) =                          " ^
   299 " (let f_f' = Take (d_d v_v f_f)                                    " ^
   300 " in (((Try (Rewrite_Set_Inst [(bdv,v_v)] diff_conv False)) @@    " ^
   301 " (Repeat                                                        " ^
   302 "   ((Repeat (Rewrite_Inst [(bdv,v_v)] diff_sum        False)) Or " ^
   303 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_prod_const False)) Or " ^
   304 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_prod       False)) Or " ^
   305 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_quot       True )) Or " ^
   306 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_sin        False)) Or " ^
   307 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_sin_chain  False)) Or " ^
   308 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_cos        False)) Or " ^
   309 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_cos_chain  False)) Or " ^
   310 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_pow        False)) Or " ^
   311 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_pow_chain  False)) Or " ^
   312 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_ln         False)) Or " ^
   313 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_ln_chain   False)) Or " ^
   314 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_exp        False)) Or " ^
   315 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_exp_chain  False)) Or " ^
   316 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_const      False)) Or " ^
   317 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_var        False)) Or " ^
   318 "    (Repeat (Rewrite_Set             make_polynomial False)))) @@ " ^
   319 " (Try (Rewrite_Set_Inst [(bdv,v_v)] diff_sym_conv False)))) f_f')"
   320 ));
   321 *}
   322 ML {*
   323 store_met
   324  (prep_met thy "met_diff_simpl" [] e_metID
   325  (["diff","diff_simpl"],
   326    [("#Given" ,["functionTerm f_f","differentiateFor v_v"]),
   327     ("#Find"  ,["derivative f_f'"])
   328     ],
   329    {rew_ord'="tless_true", rls' = erls_diff, calc = [], srls = e_rls,
   330     prls=e_rls, crls = Atools_erls, errpats = [], nrls = norm_diff},
   331 "Script DiffScr (f_f::real) (v_v::real) =                          " ^
   332 " (let f_f' = Take (d_d v_v f_f)                                    " ^
   333 " in ((     " ^
   334 " (Repeat                                                        " ^
   335 "   ((Repeat (Rewrite_Inst [(bdv,v_v)] diff_sum        False)) Or " ^
   336 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_prod_const False)) Or " ^
   337 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_prod       False)) Or " ^
   338 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_quot       True )) Or " ^
   339 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_sin        False)) Or " ^
   340 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_sin_chain  False)) Or " ^
   341 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_cos        False)) Or " ^
   342 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_cos_chain  False)) Or " ^
   343 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_pow        False)) Or " ^
   344 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_pow_chain  False)) Or " ^
   345 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_ln         False)) Or " ^
   346 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_ln_chain   False)) Or " ^
   347 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_exp        False)) Or " ^
   348 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_exp_chain  False)) Or " ^
   349 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_const      False)) Or " ^
   350 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_var        False)) Or " ^
   351 "    (Repeat (Rewrite_Set             make_polynomial False))))  " ^
   352 " )) f_f')"
   353  ));
   354     
   355 store_met
   356  (prep_met thy "met_diff_equ" [] e_metID
   357  (["diff","differentiate_equality"],
   358    [("#Given" ,["functionEq f_f","differentiateFor v_v"]),
   359    ("#Find"  ,["derivativeEq f_f'"])
   360   ],
   361    {rew_ord'="tless_true", rls' = erls_diff, calc = [], 
   362     srls = srls_diff, prls=e_rls, crls=Atools_erls, errpats = [], nrls = norm_diff},
   363 "Script DiffEqScr (f_f::bool) (v_v::real) =                          " ^
   364 " (let f_f' = Take ((primed (lhs f_f)) = d_d v_v (rhs f_f))            " ^
   365 " in (((Try (Rewrite_Set_Inst [(bdv,v_v)] diff_conv False)) @@      " ^
   366 " (Repeat                                                          " ^
   367 "   ((Repeat (Rewrite_Inst [(bdv,v_v)] diff_sum        False)) Or   " ^
   368 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_dif        False)) Or   " ^
   369 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_prod_const False)) Or   " ^
   370 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_prod       False)) Or   " ^
   371 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_quot       True )) Or   " ^
   372 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_sin        False)) Or   " ^
   373 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_sin_chain  False)) Or   " ^
   374 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_cos        False)) Or   " ^
   375 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_cos_chain  False)) Or   " ^
   376 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_pow        False)) Or   " ^
   377 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_pow_chain  False)) Or   " ^
   378 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_ln         False)) Or   " ^
   379 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_ln_chain   False)) Or   " ^
   380 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_exp        False)) Or   " ^
   381 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_exp_chain  False)) Or   " ^
   382 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_const      False)) Or   " ^
   383 "    (Repeat (Rewrite_Inst [(bdv,v_v)] diff_var        False)) Or   " ^
   384 "    (Repeat (Rewrite_Set             make_polynomial False)))) @@ " ^
   385 " (Try (Rewrite_Set_Inst [(bdv,v_v)] diff_sym_conv False)))) f_f')"
   386 ));
   387 
   388 store_met
   389  (prep_met thy "met_diff_after_simp" [] e_metID
   390  (["diff","after_simplification"],
   391    [("#Given" ,["functionTerm f_f","differentiateFor v_v"]),
   392     ("#Find"  ,["derivative f_f'"])
   393     ],
   394    {rew_ord'="tless_true", rls' = e_rls, calc = [], srls = e_rls, prls=e_rls,
   395     crls=Atools_erls, errpats = [], nrls = norm_Rational},
   396 "Script DiffScr (f_f::real) (v_v::real) =                          " ^
   397 " (let f_f' = Take (d_d v_v f_f)                                    " ^
   398 " in ((Try (Rewrite_Set norm_Rational False)) @@                 " ^
   399 "     (Try (Rewrite_Set_Inst [(bdv,v_v)] diff_conv False)) @@     " ^
   400 "     (Try (Rewrite_Set_Inst [(bdv,v_v)] norm_diff False)) @@     " ^
   401 "     (Try (Rewrite_Set_Inst [(bdv,v_v)] diff_sym_conv False)) @@ " ^
   402 "     (Try (Rewrite_Set norm_Rational False))) f_f')"
   403 ));
   404 
   405 
   406 (** CAS-commands **)
   407 
   408 (*.handle cas-input like "Diff (a * x^3 + b, x)".*)
   409 (* val (t, pairl) = strip_comb (str2term "Diff (a * x^3 + b, x)");
   410    val [Const ("Product_Type.Pair", _) $ t $ bdv] = pairl;
   411    *)
   412 fun argl2dtss [Const ("Product_Type.Pair", _) $ t $ bdv] =
   413     [((term_of o the o (parse thy)) "functionTerm", [t]),
   414      ((term_of o the o (parse thy)) "differentiateFor", [bdv]),
   415      ((term_of o the o (parse thy)) "derivative", 
   416       [(term_of o the o (parse thy)) "f_f'"])
   417      ]
   418   | argl2dtss _ = error "Diff.ML: wrong argument for argl2dtss";
   419 castab := 
   420 overwritel (!castab, 
   421 	    [((term_of o the o (parse thy)) "Diff",  
   422 	      (("Isac", ["derivative_of","function"], ["no_met"]), 
   423 	       argl2dtss))
   424 	     ]);
   425 
   426 (*.handle cas-input like "Differentiate (A = s * (a - s), s)".*)
   427 (* val (t, pairl) = strip_comb (str2term "Differentiate (A = s * (a - s), s)");
   428    val [Const ("Product_Type.Pair", _) $ t $ bdv] = pairl;
   429    *)
   430 fun argl2dtss [Const ("Product_Type.Pair", _) $ t $ bdv] =
   431     [((term_of o the o (parse thy)) "functionEq", [t]),
   432      ((term_of o the o (parse thy)) "differentiateFor", [bdv]),
   433      ((term_of o the o (parse thy)) "derivativeEq", 
   434       [(term_of o the o (parse thy)) "f_f'::bool"])
   435      ]
   436   | argl2dtss _ = error "Diff.ML: wrong argument for argl2dtss";
   437 castab := 
   438 overwritel (!castab, 
   439 	    [((term_of o the o (parse thy)) "Differentiate",  
   440 	      (("Isac", ["named","derivative_of","function"], ["no_met"]), 
   441 	       argl2dtss))
   442 	     ]);
   443 *}
   444 
   445 end