105 val SOME (t, asm3) = |
105 val SOME (t, asm3) = |
106 Rewrite.rewrite_ thy ro er true (TermC.num_str @{thm rule1}) t; |
106 Rewrite.rewrite_ thy ro er true (TermC.num_str @{thm rule1}) t; |
107 term2str t = "- ?u [- ?n - 1] + \<alpha> ^^^ ?n * ?u [?n] + ?\<delta> [?n]"; |
107 term2str t = "- ?u [- ?n - 1] + \<alpha> ^^^ ?n * ?u [?n] + ?\<delta> [?n]"; |
108 (*- real *) |
108 (*- real *) |
109 term2str t; |
109 term2str t; |
110 *} |
110 \<close> |
111 ML {* terms2str (asm1 @ asm2 @ asm3); *} |
111 ML \<open>terms2str (asm1 @ asm2 @ asm3);\<close> |
112 |
112 |
113 section{*Prepare Steps for TP-based programming Language\label{sec:prepstep}*} |
113 section\<open>Prepare Steps for TP-based programming Language\label{sec:prepstep}\<close> |
114 text{* |
114 text\<open> |
115 \par \noindent The following sections are challenging with the CTP-based |
115 \par \noindent The following sections are challenging with the CTP-based |
116 possibilities of building the program. The goal is realized in |
116 possibilities of building the program. The goal is realized in |
117 Section~\ref{spec-meth} and Section~\ref{prog-steps}. |
117 Section~\ref{spec-meth} and Section~\ref{prog-steps}. |
118 \par The reader is advised to jump between the subsequent subsections and |
118 \par The reader is advised to jump between the subsequent subsections and |
119 the respective steps in Section~\ref{prog-steps}. By comparing |
119 the respective steps in Section~\ref{prog-steps}. By comparing |
120 Section~\ref{sec:calc:ztrans} the calculation can be comprehended step |
120 Section~\ref{sec:calc:ztrans} the calculation can be comprehended step |
121 by step. |
121 by step. |
122 *} |
122 \<close> |
123 |
123 |
124 subsection {*Prepare Expression\label{prep-expr}*} |
124 subsection \<open>Prepare Expression\label{prep-expr}\<close> |
125 text{*\noindent We try two different notations and check which of them |
125 text\<open>\noindent We try two different notations and check which of them |
126 Isabelle can handle best.*} |
126 Isabelle can handle best.\<close> |
127 ML {* |
127 ML \<open> |
128 val ctxt = Proof_Context.init_global @{theory}; |
128 val ctxt = Proof_Context.init_global @{theory}; |
129 val ctxt = Stool.declare_constraints' [@{term "z::real"}] ctxt; |
129 val ctxt = Stool.declare_constraints' [@{term "z::real"}] ctxt; |
130 |
130 |
131 val SOME fun1 = |
131 val SOME fun1 = |
132 TermC.parseNEW ctxt "X z = 3 / (z - 1/4 + -1/8 * z ^^^ -1)"; term2str fun1; |
132 TermC.parseNEW ctxt "X z = 3 / (z - 1/4 + -1/8 * z ^^^ -1)"; term2str fun1; |
133 val SOME fun1' = |
133 val SOME fun1' = |
134 TermC.parseNEW ctxt "X z = 3 / (z - 1/4 + -1/8 * (1/z))"; term2str fun1'; |
134 TermC.parseNEW ctxt "X z = 3 / (z - 1/4 + -1/8 * (1/z))"; term2str fun1'; |
135 *} |
135 \<close> |
136 |
136 |
137 subsubsection {*Prepare Numerator and Denominator*} |
137 subsubsection \<open>Prepare Numerator and Denominator\<close> |
138 text{*\noindent The partial fraction decomposition is only possible if we |
138 text\<open>\noindent The partial fraction decomposition is only possible if we |
139 get the bound variable out of the numerator. Therefor we divide |
139 get the bound variable out of the numerator. Therefor we divide |
140 the expression by $z$. Follow up the Calculation at |
140 the expression by $z$. Follow up the Calculation at |
141 Section~\ref{sec:calc:ztrans} line number 02.*} |
141 Section~\ref{sec:calc:ztrans} line number 02.\<close> |
142 |
142 |
143 axiomatization where |
143 axiomatization where |
144 ruleZY: "(X z = a / b) = (X' z = a / (z * b))" |
144 ruleZY: "(X z = a / b) = (X' z = a / (z * b))" |
145 |
145 |
146 ML {* |
146 ML \<open> |
147 val (thy, ro, er) = (@{theory}, tless_true, eval_rls); |
147 val (thy, ro, er) = (@{theory}, tless_true, eval_rls); |
148 val SOME (fun2, asm1) = |
148 val SOME (fun2, asm1) = |
149 Rewrite.rewrite_ thy ro er true @{thm ruleZY} fun1; term2str fun2; |
149 Rewrite.rewrite_ thy ro er true @{thm ruleZY} fun1; term2str fun2; |
150 val SOME (fun2', asm1) = |
150 val SOME (fun2', asm1) = |
151 Rewrite.rewrite_ thy ro er true @{thm ruleZY} fun1'; term2str fun2'; |
151 Rewrite.rewrite_ thy ro er true @{thm ruleZY} fun1'; term2str fun2'; |
161 Rewrite.rewrite_set_ @{theory} false norm_Rational fun2'; |
161 Rewrite.rewrite_set_ @{theory} false norm_Rational fun2'; |
162 term2str fun3'; |
162 term2str fun3'; |
163 (* |
163 (* |
164 * OK - workaround! |
164 * OK - workaround! |
165 *) |
165 *) |
166 *} |
166 \<close> |
167 |
167 |
168 subsubsection {*Get the Argument of the Expression X'*} |
168 subsubsection \<open>Get the Argument of the Expression X'\<close> |
169 text{*\noindent We use \texttt{grep} for finding possibilities how we can |
169 text\<open>\noindent We use \texttt{grep} for finding possibilities how we can |
170 extract the bound variable in the expression. \ttfamily Atools.thy, |
170 extract the bound variable in the expression. \ttfamily Atools.thy, |
171 Tools.thy \normalfont contain general utilities: \ttfamily |
171 Tools.thy \normalfont contain general utilities: \ttfamily |
172 eval\_argument\_in, eval\_rhs, eval\_lhs,\ldots \normalfont |
172 eval\_argument\_in, eval\_rhs, eval\_lhs,\ldots \normalfont |
173 \ttfamily grep -r "fun eva\_" * \normalfont shows all functions |
173 \ttfamily grep -r "fun eva\_" * \normalfont shows all functions |
174 witch can be used in a script. Lookup this files how to build |
174 witch can be used in a script. Lookup this files how to build |
175 and handle such functions. |
175 and handle such functions. |
176 \par The next section shows how to introduce such a function. |
176 \par The next section shows how to introduce such a function. |
177 *} |
177 \<close> |
178 |
178 |
179 subsubsection{*Decompose the Given Term Into lhs and rhs*} |
179 subsubsection\<open>Decompose the Given Term Into lhs and rhs\<close> |
180 ML {* |
180 ML \<open> |
181 val (_, expr) = HOLogic.dest_eq fun3'; term2str expr; |
181 val (_, expr) = HOLogic.dest_eq fun3'; term2str expr; |
182 val (_, denom) = |
182 val (_, denom) = |
183 HOLogic.dest_bin "Rings.divide_class.divide" (type_of expr) expr; |
183 HOLogic.dest_bin "Rings.divide_class.divide" (type_of expr) expr; |
184 term2str denom = "-1 + -2 * z + 8 * z ^^^ 2"; |
184 term2str denom = "-1 + -2 * z + 8 * z ^^^ 2"; |
185 *} |
185 \<close> |
186 |
186 |
187 text{*\noindent We have rhs\footnote{Note: lhs means \em Left Hand Side |
187 text\<open>\noindent We have rhs\footnote{Note: lhs means \em Left Hand Side |
188 \normalfont and rhs means \em Right Hand Side \normalfont and indicates |
188 \normalfont and rhs means \em Right Hand Side \normalfont and indicates |
189 the left or the right part of an equation.} in the Script language, but |
189 the left or the right part of an equation.} in the Script language, but |
190 we need a function which gets the denominator of a fraction.*} |
190 we need a function which gets the denominator of a fraction.\<close> |
191 |
191 |
192 subsubsection{*Get the Denominator and Numerator out of a Fraction*} |
192 subsubsection\<open>Get the Denominator and Numerator out of a Fraction\<close> |
193 text{*\noindent The self written functions in e.g. \texttt{get\_denominator} |
193 text\<open>\noindent The self written functions in e.g. \texttt{get\_denominator} |
194 should become a constant for the Isabelle parser:*} |
194 should become a constant for the Isabelle parser:\<close> |
195 |
195 |
196 consts |
196 consts |
197 get_denominator :: "real => real" |
197 get_denominator :: "real => real" |
198 get_numerator :: "real => real" |
198 get_numerator :: "real => real" |
199 |
199 |
200 text {*\noindent With the above definition we run into problems when we parse |
200 text \<open>\noindent With the above definition we run into problems when we parse |
201 the Script \texttt{InverseZTransform}. This leads to \em ambiguous |
201 the Script \texttt{InverseZTransform}. This leads to \em ambiguous |
202 parse trees. \normalfont We avoid this by moving the definition |
202 parse trees. \normalfont We avoid this by moving the definition |
203 to \ttfamily Rational.thy \normalfont and re-building {\sisac}. |
203 to \ttfamily Rational.thy \normalfont and re-building {\sisac}. |
204 \par \noindent ATTENTION: From now on \ttfamily |
204 \par \noindent ATTENTION: From now on \ttfamily |
205 Build\_Inverse\_Z\_Transform \normalfont mimics a build from scratch; |
205 Build\_Inverse\_Z\_Transform \normalfont mimics a build from scratch; |
206 it only works due to re-building {\sisac} several times (indicated |
206 it only works due to re-building {\sisac} several times (indicated |
207 explicitly). |
207 explicitly). |
208 *} |
208 \<close> |
209 |
209 |
210 ML {* |
210 ML \<open> |
211 (* |
211 (* |
212 *("get_denominator", |
212 *("get_denominator", |
213 * ("Rational.get_denominator", eval_get_denominator "")) |
213 * ("Rational.get_denominator", eval_get_denominator "")) |
214 *) |
214 *) |
215 fun eval_get_denominator (thmid:string) _ |
215 fun eval_get_denominator (thmid:string) _ |
237 (Const ("Rings.divide_class.divide", _) $num |
237 (Const ("Rings.divide_class.divide", _) $num |
238 $denom )) thy = |
238 $denom )) thy = |
239 SOME (TermC.mk_thmid thmid (term_to_string''' thy num) "", |
239 SOME (TermC.mk_thmid thmid (term_to_string''' thy num) "", |
240 HOLogic.Trueprop $ (TermC.mk_equality (t, num))) |
240 HOLogic.Trueprop $ (TermC.mk_equality (t, num))) |
241 | eval_get_numerator _ _ _ _ = NONE; |
241 | eval_get_numerator _ _ _ _ = NONE; |
242 *} |
242 \<close> |
243 |
243 |
244 text {*\noindent We discovered several problems by implementing the |
244 text \<open>\noindent We discovered several problems by implementing the |
245 \ttfamily get\_numerator \normalfont function. Remember when |
245 \ttfamily get\_numerator \normalfont function. Remember when |
246 putting new functions to {\sisac}, put them in a thy file and rebuild |
246 putting new functions to {\sisac}, put them in a thy file and rebuild |
247 {\sisac}, also put them in the ruleset for the script!*} |
247 {\sisac}, also put them in the ruleset for the script!\<close> |
248 |
248 |
249 subsection {*Solve Equation\label{sec:solveq}*} |
249 subsection \<open>Solve Equation\label{sec:solveq}\<close> |
250 text {*\noindent We have to find the zeros of the term, therefor we use our |
250 text \<open>\noindent We have to find the zeros of the term, therefor we use our |
251 \ttfamily get\_denominator \normalfont function from the step before |
251 \ttfamily get\_denominator \normalfont function from the step before |
252 and try to solve the second order equation. (Follow up the Calculation |
252 and try to solve the second order equation. (Follow up the Calculation |
253 in Section~\ref{sec:calc:ztrans} Subproblem 2) Note: This type of |
253 in Section~\ref{sec:calc:ztrans} Subproblem 2) Note: This type of |
254 equation is too general for the present program. |
254 equation is too general for the present program. |
255 \par We know that this equation can be categorized as \em univariate |
255 \par We know that this equation can be categorized as \em univariate |
256 equation \normalfont and solved with the functions {\sisac} provides |
256 equation \normalfont and solved with the functions {\sisac} provides |
257 for this equation type. Later on {\sisac} should determine the type |
257 for this equation type. Later on {\sisac} should determine the type |
258 of the given equation self.*} |
258 of the given equation self.\<close> |
259 ML {* |
259 ML \<open> |
260 val denominator = TermC.parseNEW ctxt "z^^^2 - 1/4*z - 1/8 = 0"; |
260 val denominator = TermC.parseNEW ctxt "z^^^2 - 1/4*z - 1/8 = 0"; |
261 val fmz = ["equality (z^^^2 - 1/4*z - 1/8 = (0::real))", |
261 val fmz = ["equality (z^^^2 - 1/4*z - 1/8 = (0::real))", |
262 "solveFor z", |
262 "solveFor z", |
263 "solutions L"]; |
263 "solutions L"]; |
264 val (dI',pI',mI') =("Isac", ["univariate","equation"], ["no_met"]); |
264 val (dI',pI',mI') =("Isac", ["univariate","equation"], ["no_met"]); |
265 *} |
265 \<close> |
266 text {*\noindent Check if the given equation matches the specification of this |
266 text \<open>\noindent Check if the given equation matches the specification of this |
267 equation type.*} |
267 equation type.\<close> |
268 ML {* |
268 ML \<open> |
269 Specify.match_pbl fmz (Specify.get_pbt ["univariate","equation"]); |
269 Specify.match_pbl fmz (Specify.get_pbt ["univariate","equation"]); |
270 *} |
270 \<close> |
271 |
271 |
272 text{*\noindent We switch up to the {\sisac} Context and try to solve the |
272 text\<open>\noindent We switch up to the {\sisac} Context and try to solve the |
273 equation with a more specific type definition.*} |
273 equation with a more specific type definition.\<close> |
274 |
274 |
275 ML {* |
275 ML \<open> |
276 Context.theory_name thy = "Isac"; |
276 Context.theory_name thy = "Isac"; |
277 val denominator = TermC.parseNEW ctxt "-1 + -2 * z + 8 * z ^^^ 2 = 0"; |
277 val denominator = TermC.parseNEW ctxt "-1 + -2 * z + 8 * z ^^^ 2 = 0"; |
278 val fmz = (*specification*) |
278 val fmz = (*specification*) |
279 ["equality (-1 + -2 * z + 8 * z ^^^ 2 = (0::real))",(*equality*) |
279 ["equality (-1 + -2 * z + 8 * z ^^^ 2 = (0::real))",(*equality*) |
280 "solveFor z", (*bound variable*) |
280 "solveFor z", (*bound variable*) |
319 (* |
319 (* |
320 * [z = 1 / 2, z = -1 / 4] |
320 * [z = 1 / 2, z = -1 / 4] |
321 *) |
321 *) |
322 Chead.show_pt pt; |
322 Chead.show_pt pt; |
323 val SOME f = parseNEW ctxt "[z=1/2, z=-1/4]"; |
323 val SOME f = parseNEW ctxt "[z=1/2, z=-1/4]"; |
324 *} |
324 \<close> |
325 |
325 |
326 subsection {*Partial Fraction Decomposition\label{sec:pbz}*} |
326 subsection \<open>Partial Fraction Decomposition\label{sec:pbz}\<close> |
327 text{*\noindent We go on with the decomposition of our expression. Follow up the |
327 text\<open>\noindent We go on with the decomposition of our expression. Follow up the |
328 Calculation in Section~\ref{sec:calc:ztrans} Step~3 and later on |
328 Calculation in Section~\ref{sec:calc:ztrans} Step~3 and later on |
329 Subproblem~1.*} |
329 Subproblem~1.\<close> |
330 subsubsection {*Solutions of the Equation*} |
330 subsubsection \<open>Solutions of the Equation\<close> |
331 text{*\noindent We get the solutions of the before solved equation in a list.*} |
331 text\<open>\noindent We get the solutions of the before solved equation in a list.\<close> |
332 |
332 |
333 ML {* |
333 ML \<open> |
334 val SOME solutions = parseNEW ctxt "[z=1/2, z=-1/4]"; |
334 val SOME solutions = parseNEW ctxt "[z=1/2, z=-1/4]"; |
335 term2str solutions; |
335 term2str solutions; |
336 atomty solutions; |
336 atomty solutions; |
337 *} |
337 \<close> |
338 |
338 |
339 subsubsection {*Get Solutions out of a List*} |
339 subsubsection \<open>Get Solutions out of a List\<close> |
340 text {*\noindent In {\sisac}'s TP-based programming language: |
340 text \<open>\noindent In {\sisac}'s TP-based programming language: |
341 \begin{verbatim} |
341 \begin{verbatim} |
342 let $ $ s_1 = NTH 1 $ solutions; $ s_2 = NTH 2... $ |
342 let $ $ s_1 = NTH 1 $ solutions; $ s_2 = NTH 2... $ |
343 \end{verbatim} |
343 \end{verbatim} |
344 can be useful. |
344 can be useful. |
345 *} |
345 \<close> |
346 |
346 |
347 ML {* |
347 ML \<open> |
348 val Const ("List.list.Cons", _) $ s_1 $ (Const ("List.list.Cons", _) |
348 val Const ("List.list.Cons", _) $ s_1 $ (Const ("List.list.Cons", _) |
349 $ s_2 $ Const ("List.list.Nil", _)) = solutions; |
349 $ s_2 $ Const ("List.list.Nil", _)) = solutions; |
350 term2str s_1; |
350 term2str s_1; |
351 term2str s_2; |
351 term2str s_2; |
352 *} |
352 \<close> |
353 |
353 |
354 text{*\noindent The ansatz for the \em Partial Fraction Decomposition \normalfont |
354 text\<open>\noindent The ansatz for the \em Partial Fraction Decomposition \normalfont |
355 requires to get the denominators of the partial fractions out of the |
355 requires to get the denominators of the partial fractions out of the |
356 Solutions as: |
356 Solutions as: |
357 \begin{itemize} |
357 \begin{itemize} |
358 \item $Denominator_{1}=z-Zeropoint_{1}$ |
358 \item $Denominator_{1}=z-Zeropoint_{1}$ |
359 \item $Denominator_{2}=z-Zeropoint_{2}$ |
359 \item $Denominator_{2}=z-Zeropoint_{2}$ |
360 \item \ldots |
360 \item \ldots |
361 \end{itemize} |
361 \end{itemize} |
362 *} |
362 \<close> |
363 |
363 |
364 ML {* |
364 ML \<open> |
365 val xx = HOLogic.dest_eq s_1; |
365 val xx = HOLogic.dest_eq s_1; |
366 val s_1' = HOLogic.mk_binop "Groups.minus_class.minus" xx; |
366 val s_1' = HOLogic.mk_binop "Groups.minus_class.minus" xx; |
367 val xx = HOLogic.dest_eq s_2; |
367 val xx = HOLogic.dest_eq s_2; |
368 val s_2' = HOLogic.mk_binop "Groups.minus_class.minus" xx; |
368 val s_2' = HOLogic.mk_binop "Groups.minus_class.minus" xx; |
369 term2str s_1'; |
369 term2str s_1'; |
370 term2str s_2'; |
370 term2str s_2'; |
371 *} |
371 \<close> |
372 |
372 |
373 text {*\noindent For the programming language a function collecting all the |
373 text \<open>\noindent For the programming language a function collecting all the |
374 above manipulations is helpful.*} |
374 above manipulations is helpful.\<close> |
375 |
375 |
376 ML {* |
376 ML \<open> |
377 fun fac_from_sol s = |
377 fun fac_from_sol s = |
378 let val (lhs, rhs) = HOLogic.dest_eq s |
378 let val (lhs, rhs) = HOLogic.dest_eq s |
379 in HOLogic.mk_binop "Groups.minus_class.minus" (lhs, rhs) end; |
379 in HOLogic.mk_binop "Groups.minus_class.minus" (lhs, rhs) end; |
380 *} |
380 \<close> |
381 |
381 |
382 ML {* |
382 ML \<open> |
383 fun mk_prod prod [] = |
383 fun mk_prod prod [] = |
384 if prod = e_term |
384 if prod = e_term |
385 then error "mk_prod called with []" |
385 then error "mk_prod called with []" |
386 else prod |
386 else prod |
387 | mk_prod prod (t :: []) = |
387 | mk_prod prod (t :: []) = |
587 val SOME numerator = parseNEW ctxt "3::real"; |
587 val SOME numerator = parseNEW ctxt "3::real"; |
588 |
588 |
589 val expr' = HOLogic.mk_binop |
589 val expr' = HOLogic.mk_binop |
590 "Rings.divide_class.divide" (numerator, denominator'); |
590 "Rings.divide_class.divide" (numerator, denominator'); |
591 term2str expr'; |
591 term2str expr'; |
592 *} |
592 \<close> |
593 |
593 |
594 subsubsection {*Apply the Partial Fraction Decomposion Ansatz*} |
594 subsubsection \<open>Apply the Partial Fraction Decomposion Ansatz\<close> |
595 |
595 |
596 text{*\noindent We use the Ansatz of the Partial Fraction Decomposition for our |
596 text\<open>\noindent We use the Ansatz of the Partial Fraction Decomposition for our |
597 expression 2nd order. Follow up the calculation in |
597 expression 2nd order. Follow up the calculation in |
598 Section~\ref{sec:calc:ztrans} Step~03.*} |
598 Section~\ref{sec:calc:ztrans} Step~03.\<close> |
599 |
599 |
600 ML {*Context.theory_name thy = "Isac"*} |
600 ML \<open>Context.theory_name thy = "Isac"\<close> |
601 |
601 |
602 text{*\noindent We define two axiomatization, the first one is the main ansatz, |
602 text\<open>\noindent We define two axiomatization, the first one is the main ansatz, |
603 the next one is just an equivalent transformation of the resulting |
603 the next one is just an equivalent transformation of the resulting |
604 equation. Both axiomatizations were moved to \ttfamily |
604 equation. Both axiomatizations were moved to \ttfamily |
605 Partial\_Fractions.thy \normalfont and got their own rulesets. In later |
605 Partial\_Fractions.thy \normalfont and got their own rulesets. In later |
606 programs it is possible to use the rulesets and the machine will find |
606 programs it is possible to use the rulesets and the machine will find |
607 the correct ansatz and equivalent transformation itself.*} |
607 the correct ansatz and equivalent transformation itself.\<close> |
608 |
608 |
609 axiomatization where |
609 axiomatization where |
610 ansatz_2nd_order: "n / (a*b) = A/a + B/b" and |
610 ansatz_2nd_order: "n / (a*b) = A/a + B/b" and |
611 equival_trans_2nd_order: "(n/(a*b) = A/a + B/b) = (n = A*b + B*a)" |
611 equival_trans_2nd_order: "(n/(a*b) = A/a + B/b) = (n = A*b + B*a)" |
612 |
612 |
613 text{*\noindent We use our \ttfamily ansatz\_2nd\_order \normalfont to rewrite |
613 text\<open>\noindent We use our \ttfamily ansatz\_2nd\_order \normalfont to rewrite |
614 our expression and get an equation with our expression on the left |
614 our expression and get an equation with our expression on the left |
615 and the partial fractions of it on the right hand side.*} |
615 and the partial fractions of it on the right hand side.\<close> |
616 |
616 |
617 ML {* |
617 ML \<open> |
618 val SOME (t1,_) = |
618 val SOME (t1,_) = |
619 rewrite_ @{theory} e_rew_ord e_rls false |
619 rewrite_ @{theory} e_rew_ord e_rls false |
620 @{thm ansatz_2nd_order} expr'; |
620 @{thm ansatz_2nd_order} expr'; |
621 term2str t1; atomty t1; |
621 term2str t1; atomty t1; |
622 val eq1 = HOLogic.mk_eq (expr', t1); |
622 val eq1 = HOLogic.mk_eq (expr', t1); |
623 term2str eq1; |
623 term2str eq1; |
624 *} |
624 \<close> |
625 |
625 |
626 text{*\noindent Eliminate the denominators by multiplying the left and the |
626 text\<open>\noindent Eliminate the denominators by multiplying the left and the |
627 right hand side of the equation with the main denominator. This is an |
627 right hand side of the equation with the main denominator. This is an |
628 simple equivalent transformation. Later on we use an own ruleset |
628 simple equivalent transformation. Later on we use an own ruleset |
629 defined in \ttfamily Partial\_Fractions.thy \normalfont for doing this. |
629 defined in \ttfamily Partial\_Fractions.thy \normalfont for doing this. |
630 Follow up the calculation in Section~\ref{sec:calc:ztrans} Step~04.*} |
630 Follow up the calculation in Section~\ref{sec:calc:ztrans} Step~04.\<close> |
631 |
631 |
632 ML {* |
632 ML \<open> |
633 val SOME (eq2,_) = |
633 val SOME (eq2,_) = |
634 rewrite_ @{theory} e_rew_ord e_rls false |
634 rewrite_ @{theory} e_rew_ord e_rls false |
635 @{thm equival_trans_2nd_order} eq1; |
635 @{thm equival_trans_2nd_order} eq1; |
636 term2str eq2; |
636 term2str eq2; |
637 *} |
637 \<close> |
638 |
638 |
639 text{*\noindent We use the existing ruleset \ttfamily norm\_Rational \normalfont |
639 text\<open>\noindent We use the existing ruleset \ttfamily norm\_Rational \normalfont |
640 for simplifications on expressions.*} |
640 for simplifications on expressions.\<close> |
641 |
641 |
642 ML {* |
642 ML \<open> |
643 val SOME (eq3,_) = rewrite_set_ @{theory} false norm_Rational eq2; |
643 val SOME (eq3,_) = rewrite_set_ @{theory} false norm_Rational eq2; |
644 term2str eq3; |
644 term2str eq3; |
645 (* |
645 (* |
646 * ?A ?B not simplified |
646 * ?A ?B not simplified |
647 *) |
647 *) |
648 *} |
648 \<close> |
649 |
649 |
650 text{*\noindent In Example~\ref{eg:gap} of my thesis I'm describing a problem about |
650 text\<open>\noindent In Example~\ref{eg:gap} of my thesis I'm describing a problem about |
651 simplifications. The problem that we would like to have only a specific degree |
651 simplifications. The problem that we would like to have only a specific degree |
652 of simplification occurs right here, in the next step.*} |
652 of simplification occurs right here, in the next step.\<close> |
653 |
653 |
654 ML {* |
654 ML \<open> |
655 trace_rewrite := false; |
655 trace_rewrite := false; |
656 val SOME fract1 = |
656 val SOME fract1 = |
657 parseNEW ctxt "(z - 1/2)*(z - -1/4) * (A/(z - 1/2) + B/(z - -1/4))"; |
657 parseNEW ctxt "(z - 1/2)*(z - -1/4) * (A/(z - 1/2) + B/(z - -1/4))"; |
658 (* |
658 (* |
659 * A B ! |
659 * A B ! |
680 * MANDATORY: simplify (and remove denominator) otherwise 3 = 0 |
680 * MANDATORY: simplify (and remove denominator) otherwise 3 = 0 |
681 *) |
681 *) |
682 val SOME (eq3'' ,_) = |
682 val SOME (eq3'' ,_) = |
683 rewrite_set_ @{theory} false norm_Rational eq3'; |
683 rewrite_set_ @{theory} false norm_Rational eq3'; |
684 term2str eq3''; |
684 term2str eq3''; |
685 *} |
685 \<close> |
686 |
686 |
687 text{*\noindent Still working at {\sisac}\ldots*} |
687 text\<open>\noindent Still working at {\sisac}\ldots\<close> |
688 |
688 |
689 ML {* Context.theory_name thy = "Isac" *} |
689 ML \<open>Context.theory_name thy = "Isac"\<close> |
690 |
690 |
691 subsubsection {*Build a Rule-Set for the Ansatz*} |
691 subsubsection \<open>Build a Rule-Set for the Ansatz\<close> |
692 text {*\noindent The \emph{ansatz} rules violate the principle that each |
692 text \<open>\noindent The \emph{ansatz} rules violate the principle that each |
693 variable on the right-hand-side must also occur on the |
693 variable on the right-hand-side must also occur on the |
694 left-hand-side of the rule: A, B, etc. don't do that. Thus the |
694 left-hand-side of the rule: A, B, etc. don't do that. Thus the |
695 rewriter marks these variables with question marks: ?A, ?B, etc. |
695 rewriter marks these variables with question marks: ?A, ?B, etc. |
696 These question marks can be dropped by \ttfamily fun |
696 These question marks can be dropped by \ttfamily fun |
697 drop\_questionmarks\normalfont.*} |
697 drop\_questionmarks\normalfont.\<close> |
698 |
698 |
699 ML {* |
699 ML \<open> |
700 val ansatz_rls = prep_rls @{theory} ( |
700 val ansatz_rls = prep_rls @{theory} ( |
701 Rls {id = "ansatz_rls", preconds = [], rew_ord = ("dummy_ord",dummy_ord), |
701 Rls {id = "ansatz_rls", preconds = [], rew_ord = ("dummy_ord",dummy_ord), |
702 erls = e_rls, srls = Erls, calc = [], errpatts = [], |
702 erls = e_rls, srls = Erls, calc = [], errpatts = [], |
703 rules = [ |
703 rules = [ |
704 Thm ("ansatz_2nd_order",num_str @{thm ansatz_2nd_order}), |
704 Thm ("ansatz_2nd_order",num_str @{thm ansatz_2nd_order}), |
705 Thm ("equival_trans_2nd_order",num_str @{thm equival_trans_2nd_order}) |
705 Thm ("equival_trans_2nd_order",num_str @{thm equival_trans_2nd_order}) |
706 ], |
706 ], |
707 scr = EmptyScr}); |
707 scr = EmptyScr}); |
708 *} |
708 \<close> |
709 |
709 |
710 text{*\noindent We apply the ruleset\ldots*} |
710 text\<open>\noindent We apply the ruleset\ldots\<close> |
711 |
711 |
712 ML {* |
712 ML \<open> |
713 val SOME (ttttt,_) = |
713 val SOME (ttttt,_) = |
714 rewrite_set_ @{theory} false ansatz_rls expr'; |
714 rewrite_set_ @{theory} false ansatz_rls expr'; |
715 *} |
715 \<close> |
716 |
716 |
717 text{*\noindent And check the output\ldots*} |
717 text\<open>\noindent And check the output\ldots\<close> |
718 |
718 |
719 ML {* |
719 ML \<open> |
720 term2str expr' = "3 / ((z - 1 / 2) * (z - -1 / 4))"; |
720 term2str expr' = "3 / ((z - 1 / 2) * (z - -1 / 4))"; |
721 term2str ttttt = "?A / (z - 1 / 2) + ?B / (z - -1 / 4)"; |
721 term2str ttttt = "?A / (z - 1 / 2) + ?B / (z - -1 / 4)"; |
722 *} |
722 \<close> |
723 |
723 |
724 subsubsection {*Get the First Coefficient*} |
724 subsubsection \<open>Get the First Coefficient\<close> |
725 |
725 |
726 text{*\noindent Now it's up to get the two coefficients A and B, which will be |
726 text\<open>\noindent Now it's up to get the two coefficients A and B, which will be |
727 the numerators of our partial fractions. Continue following up the |
727 the numerators of our partial fractions. Continue following up the |
728 Calculation in Section~\ref{sec:calc:ztrans} Subproblem~1.*} |
728 Calculation in Section~\ref{sec:calc:ztrans} Subproblem~1.\<close> |
729 |
729 |
730 text{*\noindent To get the first coefficient we substitute $z$ with the first |
730 text\<open>\noindent To get the first coefficient we substitute $z$ with the first |
731 zero-point we determined in Section~\ref{sec:solveq}.*} |
731 zero-point we determined in Section~\ref{sec:solveq}.\<close> |
732 |
732 |
733 ML {* |
733 ML \<open> |
734 val SOME (eq4_1,_) = |
734 val SOME (eq4_1,_) = |
735 rewrite_terms_ @{theory} e_rew_ord e_rls [s_1] eq3''; |
735 rewrite_terms_ @{theory} e_rew_ord e_rls [s_1] eq3''; |
736 term2str eq4_1; |
736 term2str eq4_1; |
737 val SOME (eq4_2,_) = |
737 val SOME (eq4_2,_) = |
738 rewrite_set_ @{theory} false norm_Rational eq4_1; |
738 rewrite_set_ @{theory} false norm_Rational eq4_1; |
847 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
847 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
848 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
848 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
849 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
849 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
850 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
850 val (p,_,fb,nxt,_,pt) = me nxt p [] pt; |
851 f2str fb; |
851 f2str fb; |
852 *} |
852 \<close> |
853 |
853 |
854 text{*\noindent We compare our results with the pre calculated upshot.*} |
854 text\<open>\noindent We compare our results with the pre calculated upshot.\<close> |
855 |
855 |
856 ML {* |
856 ML \<open> |
857 if f2str fa = "[A = 4]" then () else error "part.fract. eq4_1"; |
857 if f2str fa = "[A = 4]" then () else error "part.fract. eq4_1"; |
858 if f2str fb = "[B = -4]" then () else error "part.fract. eq4_1"; |
858 if f2str fb = "[B = -4]" then () else error "part.fract. eq4_1"; |
859 *} |
859 \<close> |
860 |
860 |
861 section {*Implement the Specification and the Method \label{spec-meth}*} |
861 section \<open>Implement the Specification and the Method \label{spec-meth}\<close> |
862 |
862 |
863 text{*\noindent Now everything we need for solving the problem has been |
863 text\<open>\noindent Now everything we need for solving the problem has been |
864 tested out. We now start by creating new nodes for our methods and |
864 tested out. We now start by creating new nodes for our methods and |
865 further on our new program in the interpreter.*} |
865 further on our new program in the interpreter.\<close> |
866 |
866 |
867 subsection{*Define the Field Descriptions for the |
867 subsection\<open>Define the Field Descriptions for the |
868 Specification\label{sec:deffdes}*} |
868 Specification\label{sec:deffdes}\<close> |
869 |
869 |
870 text{*\noindent We define the fields \em filterExpression \normalfont and |
870 text\<open>\noindent We define the fields \em filterExpression \normalfont and |
871 \em stepResponse \normalfont both as equations, they represent the in- and |
871 \em stepResponse \normalfont both as equations, they represent the in- and |
872 output of the program.*} |
872 output of the program.\<close> |
873 |
873 |
874 consts |
874 consts |
875 filterExpression :: "bool => una" |
875 filterExpression :: "bool => una" |
876 stepResponse :: "bool => una" |
876 stepResponse :: "bool => una" |
877 |
877 |
878 subsection{*Define the Specification*} |
878 subsection\<open>Define the Specification\<close> |
879 |
879 |
880 text{*\noindent The next step is defining the specifications as nodes in the |
880 text\<open>\noindent The next step is defining the specifications as nodes in the |
881 designated part. We have to create the hierarchy node by node and start |
881 designated part. We have to create the hierarchy node by node and start |
882 with \em SignalProcessing \normalfont and go on by creating the node |
882 with \em SignalProcessing \normalfont and go on by creating the node |
883 \em Z\_Transform\normalfont.*} |
883 \em Z\_Transform\normalfont.\<close> |
884 |
884 |
885 setup {* KEStore_Elems.add_pbts |
885 setup \<open>KEStore_Elems.add_pbts |
886 [prep_pbt thy "pbl_SP" [] e_pblID (["SignalProcessing"], [], e_rls, NONE, []), |
886 [prep_pbt thy "pbl_SP" [] e_pblID (["SignalProcessing"], [], e_rls, NONE, []), |
887 prep_pbt thy "pbl_SP_Ztrans" [] e_pblID |
887 prep_pbt thy "pbl_SP_Ztrans" [] e_pblID |
888 (["Z_Transform","SignalProcessing"], [], e_rls, NONE, [])] *} |
888 (["Z_Transform","SignalProcessing"], [], e_rls, NONE, [])]\<close> |
889 |
889 |
890 text{*\noindent For the suddenly created node we have to define the input |
890 text\<open>\noindent For the suddenly created node we have to define the input |
891 and output parameters. We already prepared their definition in |
891 and output parameters. We already prepared their definition in |
892 Section~\ref{sec:deffdes}.*} |
892 Section~\ref{sec:deffdes}.\<close> |
893 |
893 |
894 setup {* KEStore_Elems.add_pbts |
894 setup \<open>KEStore_Elems.add_pbts |
895 [prep_pbt thy "pbl_SP_Ztrans_inv" [] e_pblID |
895 [prep_pbt thy "pbl_SP_Ztrans_inv" [] e_pblID |
896 (["Inverse", "Z_Transform", "SignalProcessing"], |
896 (["Inverse", "Z_Transform", "SignalProcessing"], |
897 [("#Given", ["filterExpression X_eq"]), |
897 [("#Given", ["filterExpression X_eq"]), |
898 ("#Find", ["stepResponse n_eq"])], |
898 ("#Find", ["stepResponse n_eq"])], |
899 append_rls "e_rls" e_rls [(*for preds in where_*)], |
899 append_rls "e_rls" e_rls [(*for preds in where_*)], |
900 NONE, |
900 NONE, |
901 [["SignalProcessing","Z_Transform","Inverse"]])] *} |
901 [["SignalProcessing","Z_Transform","Inverse"]])]\<close> |
902 ML {* |
902 ML \<open> |
903 show_ptyps (); |
903 show_ptyps (); |
904 get_pbt ["Inverse","Z_Transform","SignalProcessing"]; |
904 get_pbt ["Inverse","Z_Transform","SignalProcessing"]; |
905 *} |
905 \<close> |
906 |
906 |
907 subsection {*Define Name and Signature for the Method*} |
907 subsection \<open>Define Name and Signature for the Method\<close> |
908 |
908 |
909 text{*\noindent As a next step we store the definition of our new method as a |
909 text\<open>\noindent As a next step we store the definition of our new method as a |
910 constant for the interpreter.*} |
910 constant for the interpreter.\<close> |
911 |
911 |
912 consts |
912 consts |
913 InverseZTransform :: "[bool, bool] => bool" |
913 InverseZTransform :: "[bool, bool] => bool" |
914 ("((Script InverseZTransform (_ =))// (_))" 9) |
914 ("((Script InverseZTransform (_ =))// (_))" 9) |
915 |
915 |
916 subsection {*Setup Parent Nodes in Hierarchy of Method\label{sec:cparentnode}*} |
916 subsection \<open>Setup Parent Nodes in Hierarchy of Method\label{sec:cparentnode}\<close> |
917 |
917 |
918 text{*\noindent Again we have to generate the nodes step by step, first the |
918 text\<open>\noindent Again we have to generate the nodes step by step, first the |
919 parent node and then the originally \em Z\_Transformation |
919 parent node and then the originally \em Z\_Transformation |
920 \normalfont node. We have to define both nodes first with an empty script |
920 \normalfont node. We have to define both nodes first with an empty script |
921 as content.*} |
921 as content.\<close> |
922 |
922 |
923 setup {* KEStore_Elems.add_mets |
923 setup \<open>KEStore_Elems.add_mets |
924 [prep_met thy "met_SP" [] e_metID |
924 [prep_met thy "met_SP" [] e_metID |
925 (["SignalProcessing"], [], |
925 (["SignalProcessing"], [], |
926 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
926 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
927 errpats = [], nrls = e_rls}, |
927 errpats = [], nrls = e_rls}, |
928 "empty_script"), |
928 "empty_script"), |
929 prep_met thy "met_SP_Ztrans" [] e_metID |
929 prep_met thy "met_SP_Ztrans" [] e_metID |
930 (["SignalProcessing", "Z_Transform"], [], |
930 (["SignalProcessing", "Z_Transform"], [], |
931 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
931 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
932 errpats = [], nrls = e_rls}, |
932 errpats = [], nrls = e_rls}, |
933 "empty_script")] |
933 "empty_script")] |
934 *} |
934 \<close> |
935 |
935 |
936 text{*\noindent After we generated both nodes, we can fill the containing |
936 text\<open>\noindent After we generated both nodes, we can fill the containing |
937 script we want to implement later. First we define the specifications |
937 script we want to implement later. First we define the specifications |
938 of the script in e.g. the in- and output.*} |
938 of the script in e.g. the in- and output.\<close> |
939 |
939 |
940 setup {* KEStore_Elems.add_mets |
940 setup \<open>KEStore_Elems.add_mets |
941 [prep_met thy "met_SP_Ztrans_inv" [] e_metID |
941 [prep_met thy "met_SP_Ztrans_inv" [] e_metID |
942 (["SignalProcessing", "Z_Transform", "Inverse"], |
942 (["SignalProcessing", "Z_Transform", "Inverse"], |
943 [("#Given" ,["filterExpression X_eq"]), ("#Find" ,["stepResponse n_eq"])], |
943 [("#Given" ,["filterExpression X_eq"]), ("#Find" ,["stepResponse n_eq"])], |
944 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
944 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
945 errpats = [], nrls = e_rls}, |
945 errpats = [], nrls = e_rls}, |
946 "empty_script")] |
946 "empty_script")] |
947 *} |
947 \<close> |
948 |
948 |
949 text{*\noindent After we stored the definition we can start implementing the |
949 text\<open>\noindent After we stored the definition we can start implementing the |
950 script itself. As a first try we define only three rows containing one |
950 script itself. As a first try we define only three rows containing one |
951 simple operation.*} |
951 simple operation.\<close> |
952 |
952 |
953 setup {* KEStore_Elems.add_mets |
953 setup \<open>KEStore_Elems.add_mets |
954 [prep_met thy "met_SP_Ztrans_inv" [] e_metID |
954 [prep_met thy "met_SP_Ztrans_inv" [] e_metID |
955 (["SignalProcessing", "Z_Transform", "Inverse"], |
955 (["SignalProcessing", "Z_Transform", "Inverse"], |
956 [("#Given" ,["filterExpression X_eq"]), ("#Find" ,["stepResponse n_eq"])], |
956 [("#Given" ,["filterExpression X_eq"]), ("#Find" ,["stepResponse n_eq"])], |
957 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
957 {rew_ord'="tless_true", rls'= e_rls, calc = [], srls = e_rls, prls = e_rls, crls = e_rls, |
958 errpats = [], nrls = e_rls}, |
958 errpats = [], nrls = e_rls}, |
959 "Script InverseZTransform (Xeq::bool) =" ^ |
959 "Script InverseZTransform (Xeq::bool) =" ^ |
960 " (let X = Take Xeq;" ^ |
960 " (let X = Take Xeq;" ^ |
961 " X = Rewrite ruleZY False X" ^ |
961 " X = Rewrite ruleZY False X" ^ |
962 " in X)")] |
962 " in X)")] |
963 *} |
963 \<close> |
964 |
964 |
965 text{*\noindent Check if the method has been stored correctly\ldots*} |
965 text\<open>\noindent Check if the method has been stored correctly\ldots\<close> |
966 |
966 |
967 ML {* |
967 ML \<open> |
968 show_mets(); |
968 show_mets(); |
969 *} |
969 \<close> |
970 |
970 |
971 text{*\noindent If yes we can get the method by stepping backwards through |
971 text\<open>\noindent If yes we can get the method by stepping backwards through |
972 the hierarchy.*} |
972 the hierarchy.\<close> |
973 |
973 |
974 ML {* |
974 ML \<open> |
975 get_met ["SignalProcessing","Z_Transform","Inverse"]; |
975 get_met ["SignalProcessing","Z_Transform","Inverse"]; |
976 *} |
976 \<close> |
977 |
977 |
978 section {*Program in TP-based language \label{prog-steps}*} |
978 section \<open>Program in TP-based language \label{prog-steps}\<close> |
979 |
979 |
980 text{*\noindent We start stepwise expanding our program. The script is a |
980 text\<open>\noindent We start stepwise expanding our program. The script is a |
981 simple string containing several manipulation instructions. |
981 simple string containing several manipulation instructions. |
982 \par The first script we try contains no instruction, we only test if |
982 \par The first script we try contains no instruction, we only test if |
983 building scripts that way work.*} |
983 building scripts that way work.\<close> |
984 |
984 |
985 subsection {*Stepwise Extend the Program*} |
985 subsection \<open>Stepwise Extend the Program\<close> |
986 ML {* |
986 ML \<open> |
987 val str = |
987 val str = |
988 "Script InverseZTransform (Xeq::bool) = "^ |
988 "Script InverseZTransform (Xeq::bool) = "^ |
989 " Xeq"; |
989 " Xeq"; |
990 *} |
990 \<close> |
991 |
991 |
992 text{*\noindent Next we put some instructions in the script and try if we are |
992 text\<open>\noindent Next we put some instructions in the script and try if we are |
993 able to solve our first equation.*} |
993 able to solve our first equation.\<close> |
994 |
994 |
995 ML {* |
995 ML \<open> |
996 val str = |
996 val str = |
997 "Script InverseZTransform (Xeq::bool) = "^ |
997 "Script InverseZTransform (Xeq::bool) = "^ |
998 (* |
998 (* |
999 * 1/z) instead of z ^^^ -1 |
999 * 1/z) instead of z ^^^ -1 |
1000 *) |
1000 *) |
1316 \end{verbatim} |
1316 \end{verbatim} |
1317 \ldots shows the right script. Difference in the arguments. |
1317 \ldots shows the right script. Difference in the arguments. |
1318 \item Test --- Why helpless here ? --- shows: \ttfamily replace |
1318 \item Test --- Why helpless here ? --- shows: \ttfamily replace |
1319 no\_meth by [no\_meth] \normalfont in Script |
1319 no\_meth by [no\_meth] \normalfont in Script |
1320 \end{itemize} |
1320 \end{itemize} |
1321 *} |
1321 \<close> |
1322 |
1322 |
1323 ML {* |
1323 ML \<open> |
1324 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1324 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1325 (*Model_Problem";*) |
1325 (*Model_Problem";*) |
1326 *} |
1326 \<close> |
1327 |
1327 |
1328 text {*\noindent Instead of \ttfamily nxt = Model\_Problem \normalfont above |
1328 text \<open>\noindent Instead of \ttfamily nxt = Model\_Problem \normalfont above |
1329 we had \ttfamily Empty\_Tac; \normalfont the search for the reason |
1329 we had \ttfamily Empty\_Tac; \normalfont the search for the reason |
1330 considered the following points:\begin{itemize} |
1330 considered the following points:\begin{itemize} |
1331 \item Difference in the arguments |
1331 \item Difference in the arguments |
1332 \item Comparison with Subsection~\ref{sec:solveq}: There solving this |
1332 \item Comparison with Subsection~\ref{sec:solveq}: There solving this |
1333 equation works, so there must be some difference in the arguments |
1333 equation works, so there must be some difference in the arguments |
1334 of the Subproblem: RIGHT: we had \ttfamily [no\_meth] \normalfont |
1334 of the Subproblem: RIGHT: we had \ttfamily [no\_meth] \normalfont |
1335 instead of \ttfamily [no\_met] \normalfont ;-) |
1335 instead of \ttfamily [no\_met] \normalfont ;-) |
1336 \end{itemize}*} |
1336 \end{itemize}\<close> |
1337 |
1337 |
1338 ML {* |
1338 ML \<open> |
1339 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1339 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1340 (*Add_Given equality (-1 + -2 * z + 8 * z ^^^ 2 = 0)";*) |
1340 (*Add_Given equality (-1 + -2 * z + 8 * z ^^^ 2 = 0)";*) |
1341 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1341 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1342 (*Add_Given solveFor z";*) |
1342 (*Add_Given solveFor z";*) |
1343 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1343 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1344 (*Add_Find solutions z_i";*) |
1344 (*Add_Find solutions z_i";*) |
1345 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1345 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1346 (*Specify_Theory Isac";*) |
1346 (*Specify_Theory Isac";*) |
1347 *} |
1347 \<close> |
1348 |
1348 |
1349 text {*\noindent We had \ttfamily nxt = Empty\_Tac instead Specify\_Theory; |
1349 text \<open>\noindent We had \ttfamily nxt = Empty\_Tac instead Specify\_Theory; |
1350 \normalfont The search for the reason considered the following points: |
1350 \normalfont The search for the reason considered the following points: |
1351 \begin{itemize} |
1351 \begin{itemize} |
1352 \item Was there an error message? NO -- ok |
1352 \item Was there an error message? NO -- ok |
1353 \item Has \ttfamily nxt = Add\_Find \normalfont been inserted in pt:\\ |
1353 \item Has \ttfamily nxt = Add\_Find \normalfont been inserted in pt:\\ |
1354 \ttfamily get\_obj g\_pbl pt (fst p);\normalfont? YES -- ok |
1354 \ttfamily get\_obj g\_pbl pt (fst p);\normalfont? YES -- ok |
1471 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([11], Res) Take*) |
1471 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([11], Res) Take*) |
1472 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([12], Frm) Substitute*) |
1472 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([12], Frm) Substitute*) |
1473 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([12], Res) Rewrite*) |
1473 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([12], Res) Rewrite*) |
1474 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([13], Res) Take*) |
1474 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([13], Res) Take*) |
1475 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([14], Frm) Empty_Tac*) |
1475 val (p,_,f,nxt,_,pt) = me nxt p [] pt; (*([14], Frm) Empty_Tac*) |
1476 *} |
1476 \<close> |
1477 ML {* |
1477 ML \<open> |
1478 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1478 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1479 *} |
1479 \<close> |
1480 ML {* |
1480 ML \<open> |
1481 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1481 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1482 *} |
1482 \<close> |
1483 ML {* |
1483 ML \<open> |
1484 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1484 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1485 *} |
1485 \<close> |
1486 ML {* |
1486 ML \<open> |
1487 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1487 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1488 *} |
1488 \<close> |
1489 ML {* |
1489 ML \<open> |
1490 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1490 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1491 *} |
1491 \<close> |
1492 ML {* |
1492 ML \<open> |
1493 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1493 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1494 *} |
1494 \<close> |
1495 |
1495 |
1496 ML {* |
1496 ML \<open> |
1497 trace_script := true; |
1497 trace_script := true; |
1498 *} |
1498 \<close> |
1499 ML {* |
1499 ML \<open> |
1500 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1500 val (p,_,f,nxt,_,pt) = me nxt p [] pt; |
1501 *} |
1501 \<close> |
1502 ML {* |
1502 ML \<open> |
1503 Chead.show_pt pt; |
1503 Chead.show_pt pt; |
1504 *} |
1504 \<close> |
1505 ML {* |
1505 ML \<open> |
1506 *} |
1506 \<close> |
1507 ML {* |
1507 ML \<open> |
1508 *} |
1508 \<close> |
1509 ML {* |
1509 ML \<open> |
1510 *} |
1510 \<close> |
1511 ML {* |
1511 ML \<open> |
1512 *} |
1512 \<close> |
1513 ML {* |
1513 ML \<open> |
1514 *} |
1514 \<close> |
1515 ML {* |
1515 ML \<open> |
1516 *} |
1516 \<close> |
1517 |
1517 |
1518 text{*\noindent As a last step we check the tracing output of the last calc |
1518 text\<open>\noindent As a last step we check the tracing output of the last calc |
1519 tree instruction and compare it with the pre-calculated result.*} |
1519 tree instruction and compare it with the pre-calculated result.\<close> |
1520 |
1520 |
1521 section {* Improve and Transfer into Knowledge *} |
1521 section \<open>Improve and Transfer into Knowledge\<close> |
1522 text {* |
1522 text \<open> |
1523 We want to improve the very long program \ttfamily InverseZTransform |
1523 We want to improve the very long program \ttfamily InverseZTransform |
1524 \normalfont by modularisation: partial fraction decomposition shall |
1524 \normalfont by modularisation: partial fraction decomposition shall |
1525 become a sub-problem. |
1525 become a sub-problem. |
1526 |
1526 |
1527 We could transfer all knowledge in \ttfamily Build\_Inverse\_Z\_Transform.thy |
1527 We could transfer all knowledge in \ttfamily Build\_Inverse\_Z\_Transform.thy |