src/Tools/isac/Knowledge/Diff.ML
author Walther Neuper <neuper@ist.tugraz.at>
Wed, 25 Aug 2010 16:20:07 +0200
branchisac-update-Isa09-2
changeset 37947 22235e4dbe5f
parent 37926 src/Tools/isac/IsacKnowledge/Diff.ML@e6fc98fbcb85
child 37952 9ddd1000b900
permissions -rw-r--r--
renamed isac's directories and Build_Isac.thy

Scripts --> ProgLang
ME --> Interpret
IsacKnowledge --> Knowledge
neuper@37906
     1
(* tools for differentiation
neuper@37906
     2
   WN.11.99
neuper@37906
     3
neuper@37947
     4
use"Knowledge/Diff.ML";
neuper@37906
     5
use"Diff.ML";
neuper@37906
     6
 *)
neuper@37906
     7
neuper@37906
     8
neuper@37906
     9
(** interface isabelle -- isac **)
neuper@37906
    10
neuper@37906
    11
theory' := overwritel (!theory', [("Diff.thy",Diff.thy)]);
neuper@37906
    12
neuper@37906
    13
neuper@37906
    14
(** eval functions **)
neuper@37906
    15
neuper@37906
    16
fun primed (Const (id, T)) = Const (id ^ "'", T)
neuper@37906
    17
  | primed (Free (id, T)) = Free (id ^ "'", T)
neuper@37906
    18
  | primed t = raise error ("primed called with arg = '"^ term2str t ^"'");
neuper@37906
    19
neuper@37906
    20
(*("primed", ("Diff.primed", eval_primed "#primed"))*)
neuper@37906
    21
fun eval_primed _ _ (p as (Const ("Diff.primed",_) $ t)) _ =
neuper@37926
    22
    SOME ((term2str p) ^ " = " ^ term2str (primed t),
neuper@37906
    23
	  Trueprop $ (mk_equality (p, primed t)))
neuper@37926
    24
  | eval_primed _ _ _ _ = NONE;
neuper@37906
    25
neuper@37906
    26
calclist':= overwritel (!calclist', 
neuper@37906
    27
   [("primed", ("Diff.primed", eval_primed "#primed"))
neuper@37906
    28
    ]);
neuper@37906
    29
neuper@37906
    30
neuper@37906
    31
(** rulesets **)
neuper@37906
    32
neuper@37906
    33
(*.converts a term such that differentiation works optimally.*)
neuper@37906
    34
val diff_conv =   
neuper@37906
    35
    Rls {id="diff_conv", 
neuper@37906
    36
	 preconds = [], 
neuper@37906
    37
	 rew_ord = ("termlessI",termlessI), 
neuper@37906
    38
	 erls = append_rls "erls_diff_conv" e_rls 
neuper@37906
    39
			   [Calc ("Atools.occurs'_in", eval_occurs_in ""),
neuper@37906
    40
			    Thm ("not_true",num_str not_true),
neuper@37906
    41
			    Thm ("not_false",num_str not_false),
neuper@37906
    42
			    Calc ("op <",eval_equ "#less_"),
neuper@37906
    43
			    Thm ("and_true",num_str and_true),
neuper@37906
    44
			    Thm ("and_false",num_str and_false)
neuper@37906
    45
			    ], 
neuper@37906
    46
	 srls = Erls, calc = [],
neuper@37906
    47
	 rules = [Thm ("frac_conv", num_str frac_conv),
neuper@37906
    48
		  Thm ("sqrt_conv_bdv", num_str sqrt_conv_bdv),
neuper@37906
    49
		  Thm ("sqrt_conv_bdv_n", num_str sqrt_conv_bdv_n),
neuper@37906
    50
		  Thm ("sqrt_conv", num_str sqrt_conv),
neuper@37906
    51
		  Thm ("root_conv", num_str root_conv),
neuper@37906
    52
		  Thm ("realpow_pow_bdv", num_str realpow_pow_bdv),
neuper@37906
    53
		  Calc ("op *", eval_binop "#mult_"),
neuper@37906
    54
		  Thm ("rat_mult",num_str rat_mult),
neuper@37906
    55
		  (*a / b * (c / d) = a * c / (b * d)*)
neuper@37906
    56
		  Thm ("real_times_divide1_eq",num_str real_times_divide1_eq),
neuper@37906
    57
		  (*?x * (?y / ?z) = ?x * ?y / ?z*)
neuper@37906
    58
		  Thm ("real_times_divide2_eq",num_str real_times_divide2_eq)
neuper@37906
    59
		  (*?y / ?z * ?x = ?y * ?x / ?z*)
neuper@37906
    60
		  (*
neuper@37906
    61
		  Thm ("", num_str ),*)
neuper@37906
    62
		 ],
neuper@37906
    63
	 scr = EmptyScr};
neuper@37906
    64
neuper@37906
    65
(*.beautifies a term after differentiation.*)
neuper@37906
    66
val diff_sym_conv =   
neuper@37906
    67
    Rls {id="diff_sym_conv", 
neuper@37906
    68
	 preconds = [], 
neuper@37906
    69
	 rew_ord = ("termlessI",termlessI), 
neuper@37906
    70
	 erls = append_rls "erls_diff_sym_conv" e_rls 
neuper@37906
    71
			   [Calc ("op <",eval_equ "#less_")
neuper@37906
    72
			    ], 
neuper@37906
    73
	 srls = Erls, calc = [],
neuper@37906
    74
	 rules = [Thm ("frac_sym_conv", num_str frac_sym_conv),
neuper@37906
    75
		  Thm ("sqrt_sym_conv", num_str sqrt_sym_conv),
neuper@37906
    76
		  Thm ("root_sym_conv", num_str root_sym_conv),
neuper@37906
    77
		  Thm ("sym_real_mult_minus1",
neuper@37906
    78
		       num_str (real_mult_minus1 RS sym)),
neuper@37906
    79
		      (*- ?z = "-1 * ?z"*)
neuper@37906
    80
		  Thm ("rat_mult",num_str rat_mult),
neuper@37906
    81
		  (*a / b * (c / d) = a * c / (b * d)*)
neuper@37906
    82
		  Thm ("real_times_divide1_eq",num_str real_times_divide1_eq),
neuper@37906
    83
		  (*?x * (?y / ?z) = ?x * ?y / ?z*)
neuper@37906
    84
		  Thm ("real_times_divide2_eq",num_str real_times_divide2_eq),
neuper@37906
    85
		  (*?y / ?z * ?x = ?y * ?x / ?z*)
neuper@37906
    86
		  Calc ("op *", eval_binop "#mult_")
neuper@37906
    87
		 ],
neuper@37906
    88
	 scr = EmptyScr};
neuper@37906
    89
neuper@37906
    90
(*..*)
neuper@37906
    91
val srls_diff = 
neuper@37906
    92
    Rls {id="srls_differentiate..", 
neuper@37906
    93
	 preconds = [], 
neuper@37906
    94
	 rew_ord = ("termlessI",termlessI), 
neuper@37906
    95
	 erls = e_rls, 
neuper@37906
    96
	 srls = Erls, calc = [],
neuper@37906
    97
	 rules = [Calc("Tools.lhs", eval_lhs "eval_lhs_"),
neuper@37906
    98
		  Calc("Tools.rhs", eval_rhs "eval_rhs_"),
neuper@37906
    99
		  Calc("Diff.primed", eval_primed "Diff.primed")
neuper@37906
   100
		  ],
neuper@37906
   101
	 scr = EmptyScr};
neuper@37906
   102
neuper@37906
   103
(*..*)
neuper@37906
   104
val erls_diff = 
neuper@37906
   105
    append_rls "erls_differentiate.." e_rls
neuper@37906
   106
               [Thm ("not_true",num_str not_true),
neuper@37906
   107
		Thm ("not_false",num_str not_false),
neuper@37906
   108
		
neuper@37906
   109
		Calc ("Atools.ident",eval_ident "#ident_"),    
neuper@37906
   110
		Calc ("Atools.is'_atom",eval_is_atom "#is_atom_"),
neuper@37906
   111
		Calc ("Atools.occurs'_in",eval_occurs_in ""),
neuper@37906
   112
		Calc ("Atools.is'_const",eval_const "#is_const_")
neuper@37906
   113
		];
neuper@37906
   114
neuper@37906
   115
(*.rules for differentiation, _no_ simplification.*)
neuper@37906
   116
val diff_rules =
neuper@37906
   117
    Rls {id="diff_rules", preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37906
   118
	 erls = erls_diff, srls = Erls, calc = [],
neuper@37906
   119
	 rules = [Thm ("diff_sum",num_str diff_sum),
neuper@37906
   120
		  Thm ("diff_dif",num_str diff_dif),
neuper@37906
   121
		  Thm ("diff_prod_const",num_str diff_prod_const),
neuper@37906
   122
		  Thm ("diff_prod",num_str diff_prod),
neuper@37906
   123
		  Thm ("diff_quot",num_str diff_quot),
neuper@37906
   124
		  Thm ("diff_sin",num_str diff_sin),
neuper@37906
   125
		  Thm ("diff_sin_chain",num_str diff_sin_chain),
neuper@37906
   126
		  Thm ("diff_cos",num_str diff_cos),
neuper@37906
   127
		  Thm ("diff_cos_chain",num_str diff_cos_chain),
neuper@37906
   128
		  Thm ("diff_pow",num_str diff_pow),
neuper@37906
   129
		  Thm ("diff_pow_chain",num_str diff_pow_chain),
neuper@37906
   130
		  Thm ("diff_ln",num_str diff_ln),
neuper@37906
   131
		  Thm ("diff_ln_chain",num_str diff_ln_chain),
neuper@37906
   132
		  Thm ("diff_exp",num_str diff_exp),
neuper@37906
   133
		  Thm ("diff_exp_chain",num_str diff_exp_chain),
neuper@37906
   134
(*
neuper@37906
   135
		  Thm ("diff_sqrt",num_str diff_sqrt),
neuper@37906
   136
		  Thm ("diff_sqrt_chain",num_str diff_sqrt_chain),
neuper@37906
   137
*)
neuper@37906
   138
		  Thm ("diff_const",num_str diff_const),
neuper@37906
   139
		  Thm ("diff_var",num_str diff_var)
neuper@37906
   140
		  ],
neuper@37906
   141
	 scr = EmptyScr};
neuper@37906
   142
neuper@37906
   143
(*.normalisation for checking user-input.*)
neuper@37906
   144
val norm_diff = 
neuper@37906
   145
    Rls {id="diff_rls", preconds = [], rew_ord = ("termlessI",termlessI), 
neuper@37906
   146
	 erls = Erls, srls = Erls, calc = [],
neuper@37906
   147
	 rules = [Rls_ diff_rules,
neuper@37906
   148
		  Rls_ norm_Poly
neuper@37906
   149
		  ],
neuper@37906
   150
	 scr = EmptyScr};
neuper@37906
   151
ruleset' := 
neuper@37906
   152
overwritelthy thy (!ruleset', 
neuper@37906
   153
	    [("diff_rules", prep_rls norm_diff),
neuper@37906
   154
	     ("norm_diff", prep_rls norm_diff),
neuper@37906
   155
	     ("diff_conv", prep_rls diff_conv),
neuper@37906
   156
	     ("diff_sym_conv", prep_rls diff_sym_conv)
neuper@37906
   157
	     ]);
neuper@37906
   158
neuper@37906
   159
neuper@37906
   160
(** problem types **)
neuper@37906
   161
neuper@37906
   162
store_pbt
neuper@37906
   163
 (prep_pbt Diff.thy "pbl_fun" [] e_pblID
neuper@37926
   164
 (["function"], [], e_rls, NONE, []));
neuper@37906
   165
neuper@37906
   166
store_pbt
neuper@37906
   167
 (prep_pbt Diff.thy "pbl_fun_deriv" [] e_pblID
neuper@37906
   168
 (["derivative_of","function"],
neuper@37906
   169
  [("#Given" ,["functionTerm f_","differentiateFor v_"]),
neuper@37906
   170
   ("#Find"  ,["derivative f_'_"])
neuper@37906
   171
  ],
neuper@37906
   172
  append_rls "e_rls" e_rls [],
neuper@37926
   173
  SOME "Diff (f_, v_)", [["diff","differentiate_on_R"],
neuper@37906
   174
			 ["diff","after_simplification"]]));
neuper@37906
   175
neuper@37906
   176
(*here "named" is used differently from Integration"*)
neuper@37906
   177
store_pbt
neuper@37906
   178
 (prep_pbt Diff.thy "pbl_fun_deriv_nam" [] e_pblID
neuper@37906
   179
 (["named","derivative_of","function"],
neuper@37906
   180
  [("#Given" ,["functionEq f_","differentiateFor v_"]),
neuper@37906
   181
   ("#Find"  ,["derivativeEq f_'_"])
neuper@37906
   182
  ],
neuper@37906
   183
  append_rls "e_rls" e_rls [],
neuper@37926
   184
  SOME "Differentiate (f_, v_)", [["diff","differentiate_equality"]]));
neuper@37906
   185
neuper@37906
   186
neuper@37906
   187
(** methods **)
neuper@37906
   188
neuper@37906
   189
store_met
neuper@37906
   190
 (prep_met Diff.thy "met_diff" [] e_metID
neuper@37906
   191
 (["diff"], [],
neuper@37906
   192
   {rew_ord'="tless_true",rls'=Atools_erls,calc = [], srls = e_rls, prls=e_rls,
neuper@37906
   193
    crls = Atools_erls, nrls = norm_diff}, "empty_script"));
neuper@37906
   194
neuper@37906
   195
store_met
neuper@37906
   196
 (prep_met Diff.thy "met_diff_onR" [] e_metID
neuper@37906
   197
 (["diff","differentiate_on_R"],
neuper@37906
   198
   [("#Given" ,["functionTerm f_","differentiateFor v_"]),
neuper@37906
   199
    ("#Find"  ,["derivative f_'_"])
neuper@37906
   200
    ],
neuper@37906
   201
   {rew_ord'="tless_true", rls' = erls_diff, calc = [], srls = e_rls, 
neuper@37906
   202
    prls=e_rls, crls = Atools_erls, nrls = norm_diff},
neuper@37906
   203
"Script DiffScr (f_::real) (v_::real) =                          \
neuper@37906
   204
\ (let f'_ = Take (d_d v_ f_)                                    \
neuper@37906
   205
\ in (((Try (Rewrite_Set_Inst [(bdv,v_)] diff_conv False)) @@    \
neuper@37906
   206
\ (Repeat                                                        \
neuper@37906
   207
\   ((Repeat (Rewrite_Inst [(bdv,v_)] diff_sum        False)) Or \
neuper@37906
   208
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod_const False)) Or \
neuper@37906
   209
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod       False)) Or \
neuper@37906
   210
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_quot       True )) Or \
neuper@37906
   211
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin        False)) Or \
neuper@37906
   212
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin_chain  False)) Or \
neuper@37906
   213
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos        False)) Or \
neuper@37906
   214
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos_chain  False)) Or \
neuper@37906
   215
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow        False)) Or \
neuper@37906
   216
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow_chain  False)) Or \
neuper@37906
   217
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln         False)) Or \
neuper@37906
   218
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln_chain   False)) Or \
neuper@37906
   219
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp        False)) Or \
neuper@37906
   220
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp_chain  False)) Or \
neuper@37906
   221
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_const      False)) Or \
neuper@37906
   222
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_var        False)) Or \
neuper@37906
   223
\    (Repeat (Rewrite_Set             make_polynomial False)))) @@ \
neuper@37906
   224
\ (Try (Rewrite_Set_Inst [(bdv,v_)] diff_sym_conv False)))) f'_)"
neuper@37906
   225
));
neuper@37906
   226
neuper@37906
   227
store_met
neuper@37906
   228
 (prep_met Diff.thy "met_diff_simpl" [] e_metID
neuper@37906
   229
 (["diff","diff_simpl"],
neuper@37906
   230
   [("#Given" ,["functionTerm f_","differentiateFor v_"]),
neuper@37906
   231
    ("#Find"  ,["derivative f_'_"])
neuper@37906
   232
    ],
neuper@37906
   233
   {rew_ord'="tless_true", rls' = erls_diff, calc = [], srls = e_rls,
neuper@37906
   234
    prls=e_rls, crls = Atools_erls, nrls = norm_diff},
neuper@37906
   235
"Script DiffScr (f_::real) (v_::real) =                          \
neuper@37906
   236
\ (let f'_ = Take (d_d v_ f_)                                    \
neuper@37906
   237
\ in ((     \
neuper@37906
   238
\ (Repeat                                                        \
neuper@37906
   239
\   ((Repeat (Rewrite_Inst [(bdv,v_)] diff_sum        False)) Or \
neuper@37906
   240
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod_const False)) Or \
neuper@37906
   241
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod       False)) Or \
neuper@37906
   242
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_quot       True )) Or \
neuper@37906
   243
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin        False)) Or \
neuper@37906
   244
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin_chain  False)) Or \
neuper@37906
   245
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos        False)) Or \
neuper@37906
   246
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos_chain  False)) Or \
neuper@37906
   247
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow        False)) Or \
neuper@37906
   248
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow_chain  False)) Or \
neuper@37906
   249
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln         False)) Or \
neuper@37906
   250
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln_chain   False)) Or \
neuper@37906
   251
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp        False)) Or \
neuper@37906
   252
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp_chain  False)) Or \
neuper@37906
   253
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_const      False)) Or \
neuper@37906
   254
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_var        False)) Or \
neuper@37906
   255
\    (Repeat (Rewrite_Set             make_polynomial False))))  \
neuper@37906
   256
\ )) f'_)"
neuper@37906
   257
 ));
neuper@37906
   258
neuper@37906
   259
(*-----------------------------------------------------------------
neuper@37906
   260
 "Script DiffScr (f_::real) (v_::real) =                \
neuper@37906
   261
 \(Repeat                                           \
neuper@37906
   262
 \   ((Repeat (Rewrite_Inst [(bdv,v_)] diff_sum        False)) Or \
neuper@37906
   263
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod_const False)) Or \
neuper@37906
   264
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod       False)) Or \
neuper@37906
   265
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_quot       True )) Or \
neuper@37906
   266
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin        False)) Or \
neuper@37906
   267
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin_chain  False)) Or \
neuper@37906
   268
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos        False)) Or \
neuper@37906
   269
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos_chain  False)) Or \
neuper@37906
   270
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow        False)) Or \
neuper@37906
   271
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow_chain  False)) Or \
neuper@37906
   272
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln         False)) Or \
neuper@37906
   273
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln_chain   False)) Or \
neuper@37906
   274
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp        False)) Or \
neuper@37906
   275
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp_chain  False)) Or \
neuper@37906
   276
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_const      False)) Or \
neuper@37906
   277
 \    (Repeat (Rewrite_Inst [(bdv,v_)] diff_var        False)) Or \
neuper@37906
   278
 \    (Repeat (Rewrite_Set             make_polynomial False)))) \
neuper@37906
   279
 \ (f_::real)"
neuper@37906
   280
*)
neuper@37906
   281
    
neuper@37906
   282
store_met
neuper@37906
   283
 (prep_met Diff.thy "met_diff_equ" [] e_metID
neuper@37906
   284
 (["diff","differentiate_equality"],
neuper@37906
   285
   [("#Given" ,["functionEq f_","differentiateFor v_"]),
neuper@37906
   286
   ("#Find"  ,["derivativeEq f_'_"])
neuper@37906
   287
  ],
neuper@37906
   288
   {rew_ord'="tless_true", rls' = erls_diff, calc = [], 
neuper@37906
   289
    srls = srls_diff, prls=e_rls, crls=Atools_erls, nrls = norm_diff},
neuper@37906
   290
"Script DiffEqScr (f_::bool) (v_::real) =                          \
neuper@37906
   291
\ (let f'_ = Take ((primed (lhs f_)) = d_d v_ (rhs f_))            \
neuper@37906
   292
\ in (((Try (Rewrite_Set_Inst [(bdv,v_)] diff_conv False)) @@      \
neuper@37906
   293
\ (Repeat                                                          \
neuper@37906
   294
\   ((Repeat (Rewrite_Inst [(bdv,v_)] diff_sum        False)) Or   \
neuper@37906
   295
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_dif        False)) Or   \
neuper@37906
   296
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod_const False)) Or   \
neuper@37906
   297
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_prod       False)) Or   \
neuper@37906
   298
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_quot       True )) Or   \
neuper@37906
   299
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin        False)) Or   \
neuper@37906
   300
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_sin_chain  False)) Or   \
neuper@37906
   301
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos        False)) Or   \
neuper@37906
   302
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_cos_chain  False)) Or   \
neuper@37906
   303
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow        False)) Or   \
neuper@37906
   304
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_pow_chain  False)) Or   \
neuper@37906
   305
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln         False)) Or   \
neuper@37906
   306
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_ln_chain   False)) Or   \
neuper@37906
   307
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp        False)) Or   \
neuper@37906
   308
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_exp_chain  False)) Or   \
neuper@37906
   309
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_const      False)) Or   \
neuper@37906
   310
\    (Repeat (Rewrite_Inst [(bdv,v_)] diff_var        False)) Or   \
neuper@37906
   311
\    (Repeat (Rewrite_Set             make_polynomial False)))) @@ \
neuper@37906
   312
\ (Try (Rewrite_Set_Inst [(bdv,v_)] diff_sym_conv False)))) f'_)"
neuper@37906
   313
));
neuper@37906
   314
neuper@37906
   315
    
neuper@37906
   316
store_met
neuper@37906
   317
 (prep_met Diff.thy "met_diff_after_simp" [] e_metID
neuper@37906
   318
 (["diff","after_simplification"],
neuper@37906
   319
   [("#Given" ,["functionTerm f_","differentiateFor v_"]),
neuper@37906
   320
    ("#Find"  ,["derivative f_'_"])
neuper@37906
   321
    ],
neuper@37906
   322
   {rew_ord'="tless_true", rls' = e_rls, calc = [], srls = e_rls, prls=e_rls,
neuper@37906
   323
    crls=Atools_erls, nrls = norm_Rational},
neuper@37906
   324
"Script DiffScr (f_::real) (v_::real) =                          \
neuper@37906
   325
\ (let f'_ = Take (d_d v_ f_)                                    \
neuper@37906
   326
\ in ((Try (Rewrite_Set norm_Rational False)) @@                 \
neuper@37906
   327
\     (Try (Rewrite_Set_Inst [(bdv,v_)] diff_conv False)) @@     \
neuper@37906
   328
\     (Try (Rewrite_Set_Inst [(bdv,v_)] norm_diff False)) @@     \
neuper@37906
   329
\     (Try (Rewrite_Set_Inst [(bdv,v_)] diff_sym_conv False)) @@ \
neuper@37906
   330
\     (Try (Rewrite_Set norm_Rational False))) f'_)"
neuper@37906
   331
));
neuper@37906
   332
neuper@37906
   333
neuper@37906
   334
(** CAS-commands **)
neuper@37906
   335
neuper@37906
   336
(*.handle cas-input like "Diff (a * x^3 + b, x)".*)
neuper@37906
   337
(* val (t, pairl) = strip_comb (str2term "Diff (a * x^3 + b, x)");
neuper@37906
   338
   val [Const ("Pair", _) $ t $ bdv] = pairl;
neuper@37906
   339
   *)
neuper@37906
   340
fun argl2dtss [Const ("Pair", _) $ t $ bdv] =
neuper@37906
   341
    [((term_of o the o (parse thy)) "functionTerm", [t]),
neuper@37906
   342
     ((term_of o the o (parse thy)) "differentiateFor", [bdv]),
neuper@37906
   343
     ((term_of o the o (parse thy)) "derivative", 
neuper@37906
   344
      [(term_of o the o (parse thy)) "f_'_"])
neuper@37906
   345
     ]
neuper@37906
   346
  | argl2dtss _ = raise error "Diff.ML: wrong argument for argl2dtss";
neuper@37906
   347
castab := 
neuper@37906
   348
overwritel (!castab, 
neuper@37906
   349
	    [((term_of o the o (parse thy)) "Diff",  
neuper@37906
   350
	      (("Isac.thy", ["derivative_of","function"], ["no_met"]), 
neuper@37906
   351
	       argl2dtss))
neuper@37906
   352
	     ]);
neuper@37906
   353
neuper@37906
   354
(*.handle cas-input like "Differentiate (A = s * (a - s), s)".*)
neuper@37906
   355
(* val (t, pairl) = strip_comb (str2term "Differentiate (A = s * (a - s), s)");
neuper@37906
   356
   val [Const ("Pair", _) $ t $ bdv] = pairl;
neuper@37906
   357
   *)
neuper@37906
   358
fun argl2dtss [Const ("Pair", _) $ t $ bdv] =
neuper@37906
   359
    [((term_of o the o (parse thy)) "functionEq", [t]),
neuper@37906
   360
     ((term_of o the o (parse thy)) "differentiateFor", [bdv]),
neuper@37906
   361
     ((term_of o the o (parse thy)) "derivativeEq", 
neuper@37906
   362
      [(term_of o the o (parse thy)) "f_'_::bool"])
neuper@37906
   363
     ]
neuper@37906
   364
  | argl2dtss _ = raise error "Diff.ML: wrong argument for argl2dtss";
neuper@37906
   365
castab := 
neuper@37906
   366
overwritel (!castab, 
neuper@37906
   367
	    [((term_of o the o (parse thy)) "Differentiate",  
neuper@37906
   368
	      (("Isac.thy", ["named","derivative_of","function"], ["no_met"]), 
neuper@37906
   369
	       argl2dtss))
neuper@37906
   370
	     ]);