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
|