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