wneuper@2854
|
1 |
(* tools for integration over the reals
|
wneuper@2854
|
2 |
author: Walther Neuper
|
wneuper@2854
|
3 |
050814, 08:51
|
wneuper@2854
|
4 |
(c) due to copyright terms
|
wneuper@2854
|
5 |
|
wneuper@2854
|
6 |
use"~/proto2/isac/src/sml/IsacKnowledge/Integrate.ML";
|
wneuper@2854
|
7 |
*)
|
wneuper@2854
|
8 |
|
wneuper@2854
|
9 |
(** interface isabelle -- isac **)
|
wneuper@2854
|
10 |
|
wneuper@2854
|
11 |
theory' := overwritel (!theory', [("Integrate.thy",Integrate.thy)]);
|
wneuper@2854
|
12 |
|
wneuper@2854
|
13 |
theorem' := overwritel (!theorem',
|
wneuper@2854
|
14 |
[("integral_const",num_str integral_const),
|
wneuper@2854
|
15 |
("integral_var",num_str integral_var),
|
wneuper@2854
|
16 |
("integral_add",num_str integral_add),
|
wneuper@2854
|
17 |
("integral_mult",num_str integral_mult),
|
wneuper@2916
|
18 |
("call_for_new_c",num_str call_for_new_c),
|
wneuper@2854
|
19 |
("integral_pow",num_str integral_pow)
|
wneuper@2854
|
20 |
]);
|
wneuper@2854
|
21 |
|
wneuper@2899
|
22 |
(** eval functions **)
|
wneuper@2899
|
23 |
|
wneuper@2899
|
24 |
val c = Free ("c", HOLogic.realT);
|
wneuper@2899
|
25 |
(*.create a new unique variable 'c..' in a term.*)
|
wneuper@2899
|
26 |
fun new_c term =
|
wneuper@2899
|
27 |
let fun selc var =
|
wneuper@2899
|
28 |
case (explode o id_of) var of
|
wneuper@2899
|
29 |
"c"::[] => true
|
wneuper@2899
|
30 |
| "c"::"_"::is => (case (int_of_str o implode) is of
|
wneuper@2899
|
31 |
Some _ => true
|
wneuper@2899
|
32 |
| None => false)
|
wneuper@2899
|
33 |
| _ => false;
|
wneuper@2899
|
34 |
fun get_coeff c = case (explode o id_of) c of
|
wneuper@2899
|
35 |
"c"::"_"::is => (the o int_of_str o implode) is
|
wneuper@2899
|
36 |
| _ => 0;
|
wneuper@2899
|
37 |
val cs = filter selc (vars term);
|
wneuper@2899
|
38 |
in
|
wneuper@2899
|
39 |
case cs of
|
wneuper@2899
|
40 |
[] => c
|
wneuper@2899
|
41 |
| [c] => Free ("c_2", HOLogic.realT)
|
wneuper@2899
|
42 |
| cs =>
|
wneuper@2899
|
43 |
let val max_coeff = maxl (map get_coeff cs)
|
wneuper@2899
|
44 |
in Free ("c_"^string_of_int (max_coeff + 1), HOLogic.realT) end
|
wneuper@2899
|
45 |
end;
|
wneuper@2899
|
46 |
|
wneuper@2899
|
47 |
(*("new_c", ("Integrate.new'_c", eval_new_c "new_c_"))*)
|
wneuper@2899
|
48 |
fun eval_new_c _ _ (p as (Const ("Integrate.new'_c",_) $ t)) _ =
|
wneuper@2899
|
49 |
Some ((term2str p) ^ " = " ^ term2str (new_c p),
|
wneuper@2899
|
50 |
Trueprop $ (mk_equality (p, new_c p)))
|
wneuper@2899
|
51 |
| eval_new_c _ _ _ _ = None;
|
wneuper@2899
|
52 |
|
wneuper@2899
|
53 |
calclist':= overwritel (!calclist',
|
wneuper@2910
|
54 |
[("new_c", ("Integrate.new'_c", eval_new_c "new_c_"))
|
wneuper@2899
|
55 |
]);
|
wneuper@2899
|
56 |
|
wneuper@2863
|
57 |
(** rulesets **)
|
wneuper@2863
|
58 |
|
wneuper@2863
|
59 |
val integration_rules =
|
wneuper@2863
|
60 |
prep_rls (Rls {id="integration_rules", preconds = [],
|
wneuper@2863
|
61 |
rew_ord = ("termlessI",termlessI),
|
wneuper@2863
|
62 |
erls = Rls {id="conditions_in_integration_rules",
|
wneuper@2863
|
63 |
preconds = [],
|
wneuper@2863
|
64 |
rew_ord = ("termlessI",termlessI),
|
wneuper@2863
|
65 |
erls = Erls,
|
wneuper@2863
|
66 |
srls = Erls, calc = [],
|
wneuper@2863
|
67 |
rules = [(*for rewriting conditions in Thm's*)
|
wneuper@2863
|
68 |
Calc ("Atools.occurs'_in",
|
wneuper@2863
|
69 |
eval_occurs_in "#occurs_in_"),
|
wneuper@2863
|
70 |
Thm ("not_true",num_str not_true),
|
wneuper@2863
|
71 |
Thm ("not_false",not_false)
|
wneuper@2863
|
72 |
],
|
wneuper@2863
|
73 |
scr = EmptyScr},
|
wneuper@2863
|
74 |
srls = Erls, calc = [],
|
wneuper@2863
|
75 |
rules = [
|
wneuper@2863
|
76 |
Thm ("integral_const",num_str integral_const),
|
wneuper@2863
|
77 |
Thm ("integral_var",num_str integral_var),
|
wneuper@2863
|
78 |
Thm ("integral_add",num_str integral_add),
|
wneuper@2863
|
79 |
Thm ("integral_mult",num_str integral_mult),
|
wneuper@2863
|
80 |
Thm ("integral_pow",num_str integral_pow),
|
wneuper@2863
|
81 |
Calc ("op +", eval_binop "#add_")(*for n+1*)
|
wneuper@2863
|
82 |
],
|
wneuper@2863
|
83 |
scr = EmptyScr});
|
wneuper@2916
|
84 |
val add_new_c =
|
wneuper@2916
|
85 |
prep_rls (Seq {id="add_new_c", preconds = [],
|
wneuper@2916
|
86 |
rew_ord = ("termlessI",termlessI),
|
wneuper@2916
|
87 |
erls = Rls {id="conditions_in_add_new_c",
|
wneuper@2916
|
88 |
preconds = [],
|
wneuper@2916
|
89 |
rew_ord = ("termlessI",termlessI),
|
wneuper@2916
|
90 |
erls = Erls,
|
wneuper@2916
|
91 |
srls = Erls, calc = [],
|
wneuper@2917
|
92 |
rules = [Calc ("Tools.matches", eval_matches""),
|
wneuper@2917
|
93 |
Thm ("not_true",num_str not_true),
|
wneuper@2917
|
94 |
Thm ("not_false",num_str not_false)
|
wneuper@2916
|
95 |
],
|
wneuper@2916
|
96 |
scr = EmptyScr},
|
wneuper@2916
|
97 |
srls = Erls, calc = [],
|
wneuper@2916
|
98 |
rules = [ Thm ("call_for_new_c", num_str call_for_new_c),
|
wneuper@2916
|
99 |
Calc("Integrate.new'_c", eval_new_c "new_c_")
|
wneuper@2916
|
100 |
],
|
wneuper@2916
|
101 |
scr = EmptyScr});
|
wneuper@2899
|
102 |
val integration =
|
wneuper@2899
|
103 |
prep_rls (Seq {id="integration", preconds = [],
|
wneuper@2899
|
104 |
rew_ord = ("termlessI",termlessI),
|
wneuper@2899
|
105 |
erls = Rls {id="conditions_in_integration",
|
wneuper@2899
|
106 |
preconds = [],
|
wneuper@2899
|
107 |
rew_ord = ("termlessI",termlessI),
|
wneuper@2899
|
108 |
erls = Erls,
|
wneuper@2899
|
109 |
srls = Erls, calc = [],
|
wneuper@2916
|
110 |
rules = [],
|
wneuper@2899
|
111 |
scr = EmptyScr},
|
wneuper@2899
|
112 |
srls = Erls, calc = [],
|
wneuper@2899
|
113 |
rules = [ Rls_ integration_rules,
|
wneuper@2916
|
114 |
Rls_ add_new_c,
|
wneuper@2916
|
115 |
Rls_ norm_Poly
|
wneuper@2899
|
116 |
],
|
wneuper@2899
|
117 |
scr = EmptyScr});
|
wneuper@2899
|
118 |
ruleset' := overwritel (!ruleset', [("integration_rules", integration_rules),
|
wneuper@2916
|
119 |
("add_new_c", add_new_c),
|
wneuper@2899
|
120 |
("integration", integration)]);
|
wneuper@2863
|
121 |
|
wneuper@2863
|
122 |
(** problems **)
|
wneuper@2863
|
123 |
|
wneuper@2863
|
124 |
store_pbt
|
wneuper@2863
|
125 |
(prep_pbt Integrate.thy
|
wneuper@2863
|
126 |
(["integrate","function"],
|
wneuper@2863
|
127 |
[("#Given" ,["functionTerm f_", "integrateBy v_"]),
|
wneuper@2863
|
128 |
("#Find" ,["antiDerivative F_"])
|
wneuper@2863
|
129 |
],
|
wneuper@2863
|
130 |
append_rls "e_rls" e_rls [(*for preds in where_*)],
|
wneuper@2863
|
131 |
Some "Integrate (f_, v_)",
|
wneuper@2872
|
132 |
[["Diff","integration"]]));
|
wneuper@2872
|
133 |
|
wneuper@2872
|
134 |
store_pbt
|
wneuper@2872
|
135 |
(prep_pbt Integrate.thy
|
wneuper@2872
|
136 |
(["named","integrate","function"],
|
wneuper@2872
|
137 |
[("#Given" ,["functionTerm f_", "integrateBy v_"]),
|
wneuper@2872
|
138 |
("#Find" ,["antiDerivative F_"])
|
wneuper@2872
|
139 |
],
|
wneuper@2872
|
140 |
append_rls "e_rls" e_rls [(*for preds in where_*)],
|
wneuper@2872
|
141 |
Some "Integrate (f_, v_)",
|
wneuper@2872
|
142 |
[["Diff","integration","named"]]));
|
wneuper@2863
|
143 |
|
wneuper@2854
|
144 |
(** methods **)
|
wneuper@2863
|
145 |
|
wneuper@2863
|
146 |
store_met
|
wneuper@2872
|
147 |
(prep_met Integrate.thy
|
wneuper@2872
|
148 |
(["Diff","integration"],
|
wneuper@2872
|
149 |
[("#Given" ,["functionTerm f_", "integrateBy v_"]),
|
wneuper@2872
|
150 |
("#Find" ,["antiDerivative F_"])
|
wneuper@2872
|
151 |
],
|
wneuper@2872
|
152 |
{rew_ord'="tless_true", rls'=Atools_erls, calc = [],
|
wneuper@2872
|
153 |
srls = e_rls,
|
wneuper@2872
|
154 |
prls=e_rls,
|
wneuper@2872
|
155 |
crls = Atools_erls, nrls = e_rls},
|
wneuper@2918
|
156 |
"Script IntegrationScript (f_::real) (v_::real) = \
|
wneuper@2918
|
157 |
\ (let t_ = Integral f_ D v_ \
|
wneuper@2918
|
158 |
\ in (Rewrite_Set_Inst [(bdv,v_)] integration False) (t_::real))"
|
wneuper@2872
|
159 |
));
|
wneuper@2872
|
160 |
|
wneuper@2872
|
161 |
store_met
|
wneuper@2872
|
162 |
(prep_met Integrate.thy
|
wneuper@2872
|
163 |
(["Diff","integration","named"],
|
wneuper@2872
|
164 |
[("#Given" ,["functionTerm f_", "integrateBy v_"]),
|
wneuper@2872
|
165 |
("#Find" ,["antiDerivative F_"])
|
wneuper@2872
|
166 |
],
|
wneuper@2872
|
167 |
{rew_ord'="tless_true", rls'=Atools_erls, calc = [],
|
wneuper@2872
|
168 |
srls = e_rls,
|
wneuper@2872
|
169 |
prls=e_rls,
|
wneuper@2872
|
170 |
crls = Atools_erls, nrls = e_rls},
|
wneuper@2918
|
171 |
"Script NamedIntegrationScript (f_::real) (v_::real) (F_::real) = \
|
wneuper@2918
|
172 |
\ (let t_ = (F_ = Integral f_ D v_) \
|
wneuper@2918
|
173 |
\ in (Rewrite_Set_Inst [(bdv,v_)] integration False) t_)"
|
wneuper@2863
|
174 |
));
|
wneuper@2863
|
175 |
|