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 |
]);
|