doc-isac/mat-eng-de.tex
changeset 52107 f8845fc8f38d
parent 52056 f5d9bceb4dc0
child 59279 255c853ea2f0
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/doc-isac/mat-eng-de.tex	Tue Sep 17 09:50:52 2013 +0200
     1.3 @@ -0,0 +1,1354 @@
     1.4 +\documentclass[11pt,a4paper,headline,headcount,towside,nocenter]{report}
     1.5 +\usepackage{latexsym} 
     1.6 +
     1.7 +%\usepackage{ngerman}
     1.8 +%\grmn@dq@error ...and \dq \string #1 is undefined}
     1.9 +%l.989 ...tch the problem type \\{\tt["squareroot",
    1.10 +%                                                  "univ
    1.11 +\bibliographystyle{alpha}
    1.12 +
    1.13 +\def\isac{${\cal I}\mkern-2mu{\cal S}\mkern-5mu{\cal AC}$}
    1.14 +\def\sisac{{\footnotesize${\cal I}\mkern-2mu{\cal S}\mkern-5mu{\cal AC}$}}
    1.15 +
    1.16 +\title{\isac \\
    1.17 +  Experimente zur Computermathematik\\[1.0ex]
    1.18 +  und\\[1.0ex]
    1.19 +  Handbuch f\"ur Autoren der\\
    1.20 +  Mathematik-Wissensbasis\\[1.0ex]}
    1.21 +\author{Alexandra Hirn und Eva Rott\\
    1.22 +  \tt isac-users@ist.tugraz.at\\[1.0ex]}
    1.23 +\date{\today}
    1.24 +
    1.25 +\begin{document}
    1.26 +\maketitle
    1.27 +\newpage
    1.28 +\tableofcontents
    1.29 +\newpage
    1.30 +\listoftables
    1.31 +\newpage
    1.32 +
    1.33 +\chapter{Einleitung}
    1.34 +Dies ist die \"Ubersetzung der dersten Kapitel einer englischen Version \footnote{http://www.ist.tugraz.at/projects/isac/publ/mat-eng.pdf}, auf den Stand von \sisac{} 2008 gebracht. Die \"Ubersetzung und Anpassung erfolgte durch die Autorinnen im Rahmen einer Ferialpraxis am Institut f\"ur Softwaretechnologie der TU Graz.
    1.35 +
    1.36 +Diese Version zeichnet sich dadurch aus, dass sie von ``Nicht-Computer-Freaks''  f\"ur ``Nicht-Computer-Freaks'' geschrieben wurde.
    1.37 +
    1.38 +\section{``Authoring'' und ``Tutoring''}
    1.39 +\paragraph{TO DO} Mathematik lernen -- verschiedene Autoren -- Isabelle
    1.40 +Die Grundlage f\"ur \isac{} bildet Isabelle. Dies ist ein ``theorem prover'', der von L. Paulson und T. Nipkow entwickelt wird und Hard- und Software pr\"uft.
    1.41 +\section{Der Inhalt des Dokuments}
    1.42 +\paragraph{TO DO} {Als Anleitung:} Dieses Dokument beschreibt das Kerngebiet (KE) von \isac{}, das Gebiet der mathematics engine (ME) im Kerngebiet und die verschiedenen Funktionen wie das Umschreiben und der Vergleich.
    1.43 +
    1.44 +\isac{} und KE wurden in SML geschrieben, die Sprache in Verbindung mit dem Vorg\"anger des theorem Provers Isabelle entwickelt. So kam es, dass in diesem Dokument die Ebene ASCII als SML Code pr\"asentiert wird. Der Leser wird vermutlich erkennen, dass der \isac{} Benutzer eine vollkommen andere Sichtweise auf eine grafische Benutzeroberfl\"ache bekommt.
    1.45 +
    1.46 +Das Dokument ist eigenst\"andig; Basiswissen \"uber SML (f\"ur eine Einf\"uhrung siehe \cite{Paulson:91}), Terme und Umschreibung wird vorrausgesetzt.
    1.47 +
    1.48 +%The interfaces will be moderately exended during the first phase of development of the mathematics knowledge. The work on the subprojects defined should {\em not} create interfaces of any interest to a user or another author of knowledge except identifiers (of type string) for theorems, rulesets etc.
    1.49 +
    1.50 +Hinweis: SML Code, Verzeichnis, Dateien sind {\tt in 'tt' geschrieben}; besonders in {\tt ML>} ist das Kerngebiet schnell.
    1.51 +
    1.52 +\paragraph{Versuchen Sie es!}  Ein weiteres Anliegen dieses Textes ist, dem Leser Tipps f\"ur Versuche mit den Anwendungen zu geben.
    1.53 +
    1.54 +\section{Gleich am Computer ausprobieren!}\label{get-started}
    1.55 +\paragraph{TO DO screenshot} Bevor Sie mit Ihren Versuchen beginnen, m\"ochten wir Ihnen noch einige Hinweise geben:
    1.56 +\begin{itemize}
    1.57 + \item System starten
    1.58 + \item Shell aufmachen und die Datei mat-eng-de.sml \"offnen.
    1.59 + \item $>$  :  Hinter diesem Zeichen (``Prompt'') stehen jene, die Sie selbst eingeben bzw. mit Copy und Paste aus der Datei kopieren.
    1.60 + \item Die Eingabe wird mit ``;'' und ``Enter'' abgeschlossen.
    1.61 + \item Zeilen, die nicht mit Prompt beginnen, werden vom Computer ausgegeben.
    1.62 + 
    1.63 +\end{itemize}
    1.64 +
    1.65 +\part{Experimentelle Ann\"aherung}
    1.66 +
    1.67 +\chapter{Terme und Theorien}
    1.68 +Wie bereits erw\"ahnt, geht es um Computer-Mathematik. In den letzten Jahren hat die ``computer science'' grosse Fortschritte darin gemacht, Mathematik auf dem Computer verst\"andlich darzustellen. Dies gilt f\"ur mathematische Formeln, f\"ur die Beschreibung von Problemen, f\"ur L\"osungsmethoden etc. Wir beginnen mit mathematischen Formeln.
    1.69 +
    1.70 +\section{Von der Formel zum Term}
    1.71 +Um ein Beispiel zu nennen: Die Formel $a+b\cdot 3$ l\"asst sich in lesbarer Form so eingeben:
    1.72 +{\footnotesize\begin{verbatim}
    1.73 +   > "a + b * 3";
    1.74 +      val it = "a + b * 3" : string
    1.75 +\end{verbatim}}
    1.76 +\noindent ``a + b * 3'' ist also ein string (eine Zeichenfolge). In dieser Form weiss der Computer nicht, dass z.B. eine Multiplikation {\em vor} einer Addition zu rechnen ist. Isabelle braucht dazu eine andere Darstellung f\"ur Formeln. In diese kann man mit der Funktion {\tt str2term} (string to term) umrechnen:
    1.77 +{\footnotesize\begin{verbatim}
    1.78 +   > str2term "a + b * 3";
    1.79 +      val it =
    1.80 +         Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
    1.81 +               Free ("a", "RealDef.real") $
    1.82 +            (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
    1.83 +               ...) : Term.term
    1.84 +\end{verbatim}}
    1.85 +\noindent Diese Form heisst {\tt term} und ist nicht f\"ur den Menschen zum lesen gedacht. Isabelle braucht sie aber intern zum Rechnen. Wir wollen sie mit Hilfe von {\tt val} (value) auf der Variable {\tt t} speichern:
    1.86 +{\footnotesize\begin{verbatim}
    1.87 +   > val t = str2term "a + b * 3";
    1.88 +      val t =  
    1.89 +         Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
    1.90 +               Free ("a", "RealDef.real") $
    1.91 +            (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
    1.92 +               ...) : Term.term
    1.93 +\end{verbatim}}
    1.94 +Von dieser Variablen {\tt t} kann man den Wert jederzeit abrufen:
    1.95 +{\footnotesize\begin{verbatim}
    1.96 +   > t;
    1.97 +      val it =
    1.98 +         Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
    1.99 +               Free ("a", "RealDef.real") $
   1.100 +            (Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
   1.101 +               ...) : Term.term
   1.102 +\end{verbatim}}
   1.103 +Der auf {\tt t} gespeicherte Term kann einer Funktion {\tt atomty} \"ubergeben werden, die diesen in einer dritten Form zeigt:
   1.104 +{\footnotesize\begin{verbatim}
   1.105 +   > atomty term;
   1.106 + 
   1.107 +   ***
   1.108 +   *** Const (op +, [real, real] => real)
   1.109 +   *** . Free (a, real)
   1.110 +   *** . Const (op *, [real, real] => real)
   1.111 +   *** . . Free (b, real)
   1.112 +   *** . . Free (3, real)
   1.113 +   ***
   1.114 + 
   1.115 +   val it = () : unit
   1.116 +\end{verbatim}}
   1.117 +Diese Darstellung nennt man ``abstract syntax'' und macht unmittelbar klar, dass man a und b nicht addieren kann, weil ein Mal vorhanden ist.
   1.118 +\newline Es gibt noch eine vierte Art von Term, den cterm. Er wird weiter unten verwendet, weil er sich als string lesbar darstellt.
   1.119 +
   1.120 +\section{``Theory'' und ``Parsing``}
   1.121 +Der Unterschied zwischen \isac{} und bisheriger Mathematiksoftware (GeoGebra, Mathematica, Maple, Derive etc.) ist, dass das mathematische Wissen nicht im Programmcode steht, sondern in sogenannten theories (Theorien).
   1.122 +Dort wird das Mathematikwissen in einer f\"ur nicht Programmierer lesbaren Form geschrieben. Das Wissen von \isac{} ist in folgenden Theorien entahlten:
   1.123 +{\footnotesize\begin{verbatim}
   1.124 +   > Isac.thy;
   1.125 +      val it =
   1.126 +         {ProtoPure, CPure, HOL, Set, Typedef, Fun, Product_Type, Lfp, Gfp,
   1.127 +         Sum_Type, Relation, Record, Inductive, Transitive_Closure,
   1.128 +         Wellfounded_Recursion, NatDef, Nat, NatArith, Divides, Power,
   1.129 +         SetInterval, Finite_Set, Equiv, IntDef, Int, Datatype_Universe,
   1.130 +         Datatype, Numeral, Bin, IntArith, Wellfounded_Relations, Recdef, IntDiv,
   1.131 +         IntPower, NatBin, NatSimprocs, Relation_Power, PreList, List, Map,
   1.132 +         Hilbert_Choice, Main, Lubs, PNat, PRat, PReal, RealDef, RealOrd,
   1.133 +         RealInt, RealBin, RealArith0, RealArith, RComplete, RealAbs, RealPow,
   1.134 +         Ring_and_Field, Complex_Numbers, Real, ListG, Tools, Script, Typefix,
   1.135 +         Float, ComplexI, Descript, Atools, Simplify, Poly, Rational, PolyMinus,
   1.136 +         Equation, LinEq, Root, RootEq, RatEq, RootRat, RootRatEq, PolyEq, Vect,
   1.137 +         Calculus, Trig, LogExp, Diff, DiffApp, Integrate, EqSystem, Biegelinie,
   1.138 +         AlgEin, Test, Isac} : Theory.theory
   1.139 +\end{verbatim}}
   1.140 +{\tt ProtoPure} und {\tt CPure} enthalten diese logischen Grundlagen, die in {\tt HOL} und den nachfolgenden Theorien erweitert werden. \isac{} als letzte Theorie beinhaltet das gesamte Wissen.
   1.141 +Dass das Mal vor dem Plus berechnet wird, ist so festgelegt:
   1.142 +{\footnotesize\begin{verbatim}
   1.143 +   class plus =
   1.144 +   fixes plus :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "+" 65)
   1.145 +
   1.146 +   class minus =
   1.147 +   fixes minus :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "-" 65)
   1.148 +
   1.149 +   class uminus =
   1.150 +   fixes uminus :: "'a \<Rightarrow> 'a" ("- _" [81] 80)
   1.151 +
   1.152 +   class times =
   1.153 +   fixes times :: "'a \<Rightarrow> 'a \<Rightarrow> 'a" (infixl "*" 70) 
   1.154 +\end{verbatim}}
   1.155 +{\tt infix} gibt an, dass der Operator zwischen den Zahlen steht und nicht, wie in ''abstract syntax``, vorne oben.
   1.156 +Die Zahlen rechts davon legen die Priorit\"at fest. 70 f\"ur Mal ist gr\"osser als 65 f\"ur Plus und wird daher zuerst berechnet.
   1.157 +
   1.158 +Wollen Sie wissen, wie die einzelnen Rechengesetze aussehen, k\"onnen Sie im Internet folgenden Link ansehen: http://isabelle.in.tum.de/dist/library/HOL/Groups.html
   1.159 +
   1.160 +\paragraph{} Der Vorgang, bei dem aus einem {\tt string} ein Term entsteht, nennt man Parsing. Dazu wird Wissen aus der Theorie ben\"otigt, denn {\tt str2term} nimmt intern eine parse-Funktion, bei der immer das gesamte \isac{}-Wissen verwendet wird. Bei dieser Funktion wird weiters festgelegt, aus welcher Theorie das Wissen genommen werden soll.
   1.161 +{\footnotesize\begin{verbatim}
   1.162 +   > parse Isac.thy "a + b";
   1.163 +      val it = Some "a + b" : Thm.cterm Library.option
   1.164 +\end{verbatim}}
   1.165 +Um sich das Weiterrechnen zu erleichtern, kann das Ergebnis vom Parsing auf eine Variable, wie zum Beispiel {\tt t} gespeichert werden:
   1.166 +{\footnotesize\begin{verbatim}
   1.167 +   > val t = parse Isac.thy "a + b";
   1.168 +      val t = Some "a + b" : Thm.cterm Library.option
   1.169 +\end{verbatim}}
   1.170 +{\tt Some} bedeutet, dass das n\"otige Wissen vorhanden ist, um die Rechnung durchzuf\"uhren. {\tt None} zeigt uns, dass das Wissen fehlt oder ein Fehler aufgetreten ist. Daher sieht man im folgenden Beispiel, dass {\tt HOL.thy} nicht ausreichend Wissen enth\"alt:
   1.171 +{\footnotesize\begin{verbatim}
   1.172 +   > parse HOL.thy "a + b";
   1.173 +      val it = None : Thm.cterm Library.option
   1.174 +\end{verbatim}}
   1.175 +Anschliessend zeigen wir Ihnen noch ein zweites Beispiel, bei dem sowohl ein Fehler aufgetreten ist, als auch das Wissen fehlt:
   1.176 +{\footnotesize\begin{verbatim}
   1.177 +   > parse Isac.thy "a + ";
   1.178 +      *** Inner syntax error: unexpected end of input
   1.179 +      *** Expected tokens: "contains_root" "is_root_free" "q_" "M_b" "M_b'"
   1.180 +      *** "Integral" "differentiate" "E_" "some_of" "||" "|||" "argument_in"
   1.181 +      *** "filter_sameFunId" "I__" "letpar" "Rewrite_Inst" "Rewrite_Set"
   1.182 +      *** "Rewrite_Set_Inst" "Check_elementwise" "Or_to_List" "While" "Script"
   1.183 +      *** "\\" "\\" "\\" "CHR" "xstr" "SOME" "\\" "@"
   1.184 +      *** "GREATEST" "[" "[]" "num" "\\" "{)" "{.." "\\" "(|"
   1.185 +      *** "\\" "SIGMA" "()" "\\" "PI" "\\" "\\" "{" "INT"
   1.186 +      *** "UN" "{}" "LEAST" "\\" "0" "1" "-" "!" "?" "?!" "\\"
   1.187 +      *** "\\" "\\" "\\!" "THE" "let" "case" "~" "if" "ALL"
   1.188 +      *** "EX" "EX!" "!!" "_" "\\" "\\" "PROP" "[|" "OFCLASS"
   1.189 +      *** "\\" "op" "\\" "%" "TYPE" "id" "longid" "var" "..."
   1.190 +      *** "\\" "("
   1.191 +      val it = None : Thm.cterm Library.option
   1.192 +\end{verbatim}}
   1.193 +
   1.194 +Das mathematische Wissen w\"achst mit jeder Theorie von ProtoPure bis Isac. In den folgenden Beispielen wird gezeigt, wie das Wissen w\"achst.
   1.195 +
   1.196 +{\footnotesize\begin{verbatim}
   1.197 +   > (*-1-*);
   1.198 +   > parse HOL.thy "2^^^3";
   1.199 +      *** Inner lexical error at: "^^^3"
   1.200 +      val it = None : Thm.cterm Library.option         
   1.201 +\end{verbatim}}
   1.202 +''Inner lexical error`` und ''None`` bedeuten, dass ein Fehler aufgetreten ist, denn das Wissen \"uber {\tt *} findet sich erst in der {\tt theorie group}.
   1.203 +
   1.204 +{\footnotesize\begin{verbatim}
   1.205 +   > (*-2-*);
   1.206 +   > parse HOL.thy "d_d x (a + x)";
   1.207 +      val it = None : Thm.cterm Library.option               
   1.208 +\end{verbatim}}
   1.209 +Hier wiederum ist noch kein Wissen \"uber das Differenzieren vorhanden.
   1.210 +
   1.211 +{\footnotesize\begin{verbatim}
   1.212 +   > (*-3-*);
   1.213 +   > parse Rational.thy "2^^^3";
   1.214 +      val it = Some "2 ^^^ 3" : Thm.cterm Library.option               
   1.215 +\end{verbatim}}
   1.216 +
   1.217 +{\footnotesize\begin{verbatim}
   1.218 +   > (*-4-*);
   1.219 +   > val Some t4 = parse Rational.thy "d_d x (a + x)";
   1.220 +      val t4 = "d_d x (a + x)" : Thm.cterm              
   1.221 +\end{verbatim}}
   1.222 +
   1.223 +{\footnotesize\begin{verbatim}
   1.224 +   > (*-5-*);
   1.225 +   > val Some t5 = parse Diff.thy  "d_d x (a + x)";
   1.226 +      val t5 = "d_d x (a + x)" : Thm.cterm             
   1.227 +\end{verbatim}}
   1.228 +Die letzen drei Aufgaben k\"onnen schon gel\"ost werden, da {\tt Rational.thy} \"uber das n\"otige Wissen verf\"ugt.
   1.229 +
   1.230 +\section{Details von Termen}
   1.231 +Mit Hilfe der darunterliegenden Darstellung sieht man, dass ein cterm in einen Term umgewandelt werden kann.
   1.232 +{\footnotesize\begin{verbatim}
   1.233 +   > term_of;
   1.234 +      val it = fn : Thm.cterm -> Term.term
   1.235 +\end{verbatim}}
   1.236 +Durch die Umwandlung eines cterms in einen Term sieht man die einzelnen Teile des Terms. ''Free`` bedeutet, dass man die Variable \"andern kann.
   1.237 +{\footnotesize\begin{verbatim}
   1.238 +   > term_of t4;
   1.239 +      val it =
   1.240 +         Free ("d_d", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
   1.241 +         ...: Term.term
   1.242 +
   1.243 +\end{verbatim}}
   1.244 +In diesem Fall sagt uns das ''Const``, dass die Variable eine Konstante ist, also ein Fixwert, der immer die selbe Funktion hat.
   1.245 +{\footnotesize\begin{verbatim}
   1.246 +   > term_of t5;
   1.247 +      val it =
   1.248 +         Const ("Diff.d_d", "[RealDef.real, RealDef.real] => RealDef.real") $ ... $
   1.249 +         ... : Term.term
   1.250 +\end{verbatim}}
   1.251 +Sollten verschiedene Teile des ''output`` (= das vom Computer Ausgegebene) nicht sichtbar sein, kann man mit einem bestimmten Befehl alles angezeigt werden.
   1.252 +{\footnotesize\begin{verbatim}
   1.253 +   > print_depth;
   1.254 +      val it = fn : int -> unit
   1.255 + \end{verbatim}}
   1.256 +Zuerst gibt man den Befehl ein, danach den Term, der gr\"osser werden soll. Dabei kann man selbst einen Wert f\"ur die L\"ange bestimmen.
   1.257 +{\footnotesize\begin{verbatim}
   1.258 +   > print_depth 10;
   1.259 +      val it = () : unit
   1.260 +   > term_of t4;
   1.261 +         val it =
   1.262 +            Free ("d_d", "[RealDef.real, RealDef.real] => RealDef.real") $
   1.263 +                Free ("x", "RealDef.real") $
   1.264 +            (Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
   1.265 +                Free ("a", "RealDef.real") $ Free ("x", "RealDef.real"))
   1.266 +         : Term.term
   1.267 +
   1.268 +   > print_depth 10;
   1.269 +         val it = () : unit
   1.270 +   > term_of t5;
   1.271 +         val it =
   1.272 +            Const ("Diff.d_d", "[RealDef.real, RealDef.real] => RealDef.real") $
   1.273 +                Free ("x", "RealDef.real") $
   1.274 +            (Const ("op +", "[RealDef.real, RealDef.real] => RealDef.real") $
   1.275 +                Free ("a", "RealDef.real") $ Free ("x", "RealDef.real"))
   1.276 +         : Term.term
   1.277 +\end{verbatim}}
   1.278 +\paragraph{Versuchen Sie es!}
   1.279 +Eine andere Variante um den Unterschied der beiden Terme zu sehen ist folgende: 
   1.280 +{\footnotesize\begin{verbatim}
   1.281 +   > (*-4-*) val thy = Rational.thy;
   1.282 +      val thy =
   1.283 +         {ProtoPure, CPure, HOL, Set, Typedef, Fun, Product_Type, Lfp, Gfp,
   1.284 +         Sum_Type, Relation, Record, Inductive, Transitive_Closure,
   1.285 +         Wellfounded_Recursion, NatDef, Nat, NatArith, Divides, Power,
   1.286 +         SetInterval, Finite_Set, Equiv, IntDef, Int, Datatype_Universe,
   1.287 +         Datatype, Numeral, Bin, IntArith, Wellfounded_Relations, Recdef, IntDiv,
   1.288 +         IntPower, NatBin, NatSimprocs, Relation_Power, PreList, List, Map,
   1.289 +         Hilbert_Choice, Main, Lubs, PNat, PRat, PReal, RealDef, RealOrd,
   1.290 +         RealInt, RealBin, RealArith0, RealArith, RComplete, RealAbs, RealPow,
   1.291 +         Ring_and_Field, Complex_Numbers, Real, ListG, Tools, Script, Typefix,
   1.292 +         Float, ComplexI, Descript, Atools, Simplify, Poly, Rational}
   1.293 +     : Theory.theory
   1.294 +   > ((atomty) o term_of o the o (parse thy)) "d_d x (a + x)";
   1.295 + 
   1.296 +      ***
   1.297 +      *** Free (d_d, [real, real] => real)
   1.298 +      *** . Free (x, real)
   1.299 +      *** . Const (op +, [real, real] => real)
   1.300 +      *** . . Free (a, real)
   1.301 +      *** . . Free (x, real)
   1.302 +      ***
   1.303 + 
   1.304 +      val it = () : unit
   1.305 +
   1.306 +
   1.307 +   > (*-5-*) val thy = Diff.thy;
   1.308 +      val thy =
   1.309 +         {ProtoPure, CPure, HOL, Set, Typedef, Fun, Product_Type, Lfp, Gfp,
   1.310 +         Sum_Type, Relation, Record, Inductive, Transitive_Closure,
   1.311 +         Wellfounded_Recursion, NatDef, Nat, NatArith, Divides, Power,
   1.312 +         SetInterval, Finite_Set, Equiv, IntDef, Int, Datatype_Universe,
   1.313 +         Datatype, Numeral, Bin, IntArith, Wellfounded_Relations, Recdef, IntDiv,
   1.314 +         IntPower, NatBin, NatSimprocs, Relation_Power, PreList, List, Map,
   1.315 +         Hilbert_Choice, Main, Lubs, PNat, PRat, PReal, RealDef, RealOrd,
   1.316 +         RealInt, RealBin, RealArith0, RealArith, RComplete, RealAbs, RealPow,
   1.317 +         Ring_and_Field, Complex_Numbers, Real, Calculus, Trig, ListG, Tools,
   1.318 +         Script, Typefix, Float, ComplexI, Descript, Atools, Simplify, Poly,
   1.319 +         Equation, LinEq, Root, RootEq, Rational, RatEq, RootRat, RootRatEq,
   1.320 +         PolyEq, LogExp, Diff} : Theory.theory
   1.321 + 
   1.322 +   > ((atomty) o term_of o the o (parse thy)) "d_d x (a + x)";
   1.323 + 
   1.324 +      ***
   1.325 +      *** Const (Diff.d_d, [real, real] => real)
   1.326 +      *** . Free (x, real)
   1.327 +      *** . Const (op +, [real, real] => real)
   1.328 +      *** . . Free (a, real)
   1.329 +      *** . . Free (x, real)
   1.330 +      ***
   1.331 + 
   1.332 +      val it = () : unit
   1.333 +\end{verbatim}}
   1.334 +
   1.335 +
   1.336 +\chapter{''Rewriting``}
   1.337 +\section{Was ist Rewriting?}
   1.338 +Bei Rewriting handelt es sich um das Umformen von Termen nach vorgegebenen Regeln. Folgende zwei Funktionen sind notwendig:
   1.339 +{\footnotesize\begin{verbatim}
   1.340 +   > rewrite;
   1.341 +      val it = fn
   1.342 +      :
   1.343 +      theory' ->
   1.344 +      rew_ord' ->
   1.345 +      rls' -> bool -> thm' -> cterm' -> (string * string list) Library.option
   1.346 +\end{verbatim}}
   1.347 +Die Funktion hat zwei Argumente, die mitgeschickt werden m\"ussen, damit die Funktion arbeiten kann. Das letzte Element {\tt (cterm' * cterm' list) Library.option} im unteren Term ist das Ergebnis, das die Funktionen {\tt rewrite} zur\"uckgeben und die zwei vorhergehenden Argumente, {\tt theorem} und {\tt cterm}, sind die f\"ur uns wichtigen. {\tt Theorem} ist die Rechenregel und {\tt cterm} jene Formel auf die die Rechenregel angewendet wird.
   1.348 +{\footnotesize\begin{verbatim}
   1.349 +   > rewrite_inst;
   1.350 +      val it = fn
   1.351 +      :
   1.352 +      theory' ->
   1.353 +      rew_ord' ->
   1.354 +      rls' ->bool -> 'a -> thm' -> cterm' -> (cterm' * cterm' list) Library.option
   1.355 +\end{verbatim}}
   1.356 +Die Funktion {\tt rewrite\_inst} wird ben\"otigt, um Gleichungen, Rechnungen zum Differenzieren etc. zu l\"osen. Dabei wird die gebundene Variable (bdv) instanziiert, d.h. es wird die Variable angegeben, nach der man differenzieren will, bzw. f\"ur die ein Wert bei einer Gleichung herauskommen soll.
   1.357 +Um zu sehen wie der Computer vorgeht nehmen wir folgendes Beispiel, dessen Ergebnis offenbar 0 ist, was der Computer jedoch erst nach einer Reihe von Schritten herausfindet.
   1.358 +Im Beispiel wird differenziert, wobei \isac's Schreibweise jene von Computer Algebra Systemen (CAS) anzugleichen: in CAS wird differenziert mit $\frac{d}{dx}\; x^2 + 3 \cdot x + 4$, in \isac{} mit {\tt d\_d x (x \^{ }\^{ }\^{ } 2 + 3 * x + 4)}.
   1.359 +Zuerst werden die einzelnen Werte als Variablen gespeichert:
   1.360 +{\footnotesize\begin{verbatim}
   1.361 +   > val thy' = "Diff.thy";
   1.362 +      val thy' = "Diff.thy" : string
   1.363 +   > val ro = "tless_true";
   1.364 +      val ro = "tless_true" : string
   1.365 +   > val er = "eval_rls";
   1.366 +      val er = "eval_rls" : string
   1.367 +   > val inst = [("bdv","x::real")];
   1.368 +      val inst = [("bdv", "x::real")] : (string * string) list
   1.369 +   > val ct = "d_d x (a + a * (2 + b))";
   1.370 +      val ct = "d_d x (a + a * (2 + b))" : string
   1.371 +\end{verbatim}}
   1.372 +Nun wird die Rechnung nach den Regeln ausgerechnet, wobei am Ende mehrere Dinge zugleich gemacht werden.
   1.373 +Folgende Regeln werden ben\"otigt: Summenregel, Produktregel, Multiplikationsregel mit einem konstanten Faktor und zum Schluss die Additionsregel.
   1.374 +{\footnotesize\begin{verbatim}
   1.375 +   > val Some (ct,_) = rewrite_inst thy' ro er true inst ("diff_sum","") ct;
   1.376 +      val ct = "d_d x a + d_d x (a * (2 + b))" : cterm'
   1.377 +   > val Some (ct,_) = rewrite_inst thy' ro er true inst ("diff_prod","") ct;
   1.378 +      val ct = "d_d x a + (d_d x a * (2 + b) + a * d_d x (2 + b))" : cterm'
   1.379 +   > val Some (ct,_) = rewrite_inst thy' ro er true inst ("diff_const","") ct;
   1.380 +      val ct = "d_d x a + (d_d x a * (2 + b) + a * 0) " : cterm'
   1.381 +   > val Some (ct,_) = rewrite_inst thy' ro er true inst ("diff_const","") ct;
   1.382 +      val ct = "d_d x a + (0 * (2 + b) + a * 0)" : cterm'
   1.383 +   > val Some (ct,_) = rewrite_inst thy' ro er true inst ("diff_const","") ct;
   1.384 +      val ct = "0 + (0 * (2 + b) + a * 0)" : cterm'
   1.385 +   > val Some (ct,_) = rewrite_set thy' true "make_polynomial" ct;
   1.386 +      val ct = "0" : string
   1.387 +\end{verbatim}}
   1.388 +Was {\tt rewrite\_set} genau macht, finden Sie im n\"achsten Kapitel.
   1.389 +
   1.390 +Dies w\"are ein etwas ernsthafteres Beispiel zum Differenzieren:
   1.391 +{\footnotesize\begin{verbatim}
   1.392 +   > val ct = "d_d x (x ^^^ 2 + 3 * x + 4)";
   1.393 +   > val Some (ct,_) = rewrite_inst thy' ro er true inst ("diff_sum","") ct;
   1.394 +\end{verbatim}}
   1.395 +\paragraph{Versuchen Sie es,} diese Beispiel zu Ende zu f\"uhren! Die Regeln, die \isac{} kennt und zum Umformen verwenden kann, finden Sie im Internet \footnote{{\tiny\tt http://www.ist.tugraz.at/projects/isac/www/kbase/thy/browser\_info/HOL/HOL-Real/Isac/Diff.html}}.
   1.396 +
   1.397 +\section{Welche W\"unsche kann man an Rewriting stellen?}
   1.398 +Es gibt verschiedene Varianten von Rewriting, die alle eine bestimmte Bedeutung haben.
   1.399 +{\tt rewrite\_ set} wandelt Terme in ein ganzes rule set um, die normalerweise nur mit einem Theorem vereinfacht dargestellt werden.
   1.400 +Hierbei werden auch folgende Argumente verwendet:\\
   1.401 +\tabcolsep=4mm
   1.402 +\def\arraystretch{1.5}
   1.403 +\begin{tabular}{lp{11.0cm}}
   1.404 +{\tt theory} & Die Theory von Isabelle, die alle n\"otigen Informationen f\"ur das Parsing {\tt term} enth\"alt. \\
   1.405 +{\tt rew\_ord}& die Ordnung f\"ur das geordnete Rewriting. F\"ur {\em no} ben\"otigt das geordnete Rewriting {\tt tless\_true}, eine Ordnung, die f\"ur alle nachgiebigen Argumente true ist \\
   1.406 +{\tt rls} & Das rule set; zur Auswertung von bestimmten Bedingungen in {\tt thm} falls {\tt thm} eine conditional rule ist \\
   1.407 +{\tt bool} & ein Bitschalter, der die Berechnungen der m\"oglichen condition in {\tt thm} ausl\"ost: wenn sie {\tt false} ist, dann wird die condition bewertet und auf Grund des Resultats wendet man {\tt thm} an, oder nicht; wenn {\tt true} dann wird die condition nicht ausgewertet, aber man gibt sie in eine Menge von Hypothesen \\
   1.408 +{\tt thm} & das theorem versucht den {\tt term} zu \"uberschreiben \\
   1.409 +{\tt term} & {\tt thm} wendet Rewriting m\"oglicherweise auf den Term an \\
   1.410 +\end{tabular}\\
   1.411 +
   1.412 +{\footnotesize\begin{verbatim}
   1.413 +   > rewrite_set;
   1.414 +      val it = fn : theory' -> bool -> rls' -> ...
   1.415 +\end{verbatim}}
   1.416 +{\footnotesize\begin{verbatim}
   1.417 +   > rewrite_set_inst;
   1.418 +      val it = fn : theory' -> bool -> subs' -> .
   1.419 +\end{verbatim}}
   1.420 +Wenn man sehen m\"ochte wie Rewriting bei den einzelnen theorems funktioniert kann man dies mit {\tt trace\_rewrite} versuchen.
   1.421 +{\footnotesize\begin{verbatim}
   1.422 +   > trace_rewrite := true;
   1.423 +      val it = () : unit
   1.424 +\end{verbatim}}
   1.425 +
   1.426 +
   1.427 +\section{Rule sets}
   1.428 +Einige der oben genannten Varianten von Rewriting beziehen sich nicht nur auf einen theorem, sondern auf einen ganzen Block von theorems, die man als rule set bezeichnet.
   1.429 +Dieser wird so lange angewendet, bis ein Element davon f\"ur Rewriting verwendet werden kann. Sollte der Begriff ''terminate`` fehlen, wird das Rule set nicht beendet und l\"auft weiter.
   1.430 +Ein Beispiel f\"ur einen rule set ist folgendes:
   1.431 +{\footnotesize\begin{verbatim}
   1.432 +???????????
   1.433 +\end{verbatim}}
   1.434 +
   1.435 +{\footnotesize\begin{verbatim}
   1.436 +   > sym;
   1.437 +      val it = "?s = ?t ==> ?t = ?s" : Thm.thm
   1.438 +   > rearrange_assoc;
   1.439 +      val it =
   1.440 +         Rls
   1.441 +            {id = "rearrange_assoc",
   1.442 +               scr = Script (Free ("empty_script", "RealDef.real")),
   1.443 +               calc = [],
   1.444 +               erls =
   1.445 +               Rls
   1.446 +                  {id = "e_rls",
   1.447 +                     scr = EmptyScr,
   1.448 +                     calc = [],
   1.449 +                     erls = Erls,
   1.450 +                     srls = Erls,
   1.451 +                     rules = [],
   1.452 +                     rew_ord = ("dummy_ord", fn),
   1.453 +                     preconds = []},
   1.454 +               srls =
   1.455 +               Rls
   1.456 +                  {id = "e_rls",
   1.457 +                     scr = EmptyScr,
   1.458 +                     calc = [],
   1.459 +                     erls = Erls,
   1.460 +                     srls = Erls,
   1.461 +                     rules = [],
   1.462 +                     rew_ord = ("dummy_ord", fn),
   1.463 +                     preconds = []},
   1.464 +               rules =
   1.465 +               [Thm ("sym_radd_assoc", "?m1 + (?n1 + ?k1) = ?m1 + ?n1 + ?k1"  [.]),
   1.466 +                  Thm
   1.467 +                     ("sym_rmult_assoc",
   1.468 +                        "?m1 * (?n1 * ?k1) = ?m1 * ?n1 * ?k1"  [.])],
   1.469 +               rew_ord = ("e_rew_ord", fn),
   1.470 +               preconds = []} : rls
   1.471 +\end{verbatim}}
   1.472 +
   1.473 +
   1.474 +\section{Berechnung von Konstanten}
   1.475 +Sobald Konstanten in dem Bereich des Subterms sind, k\"onnen sie von einer Funktion berechnet werden:
   1.476 +{\footnotesize\begin{verbatim}
   1.477 +   > calculate;
   1.478 +      val it = fn
   1.479 +      :
   1.480 +         theory' ->
   1.481 +         string *
   1.482 +         (
   1.483 +         string ->
   1.484 +         Term.term -> Theory.theory -> (string * Term.term) Library.option) ->
   1.485 +         cterm' -> (string * thm') Library.option
   1.486 +
   1.487 +   > calculate_;
   1.488 +      val it = fn
   1.489 +      :
   1.490 +         Theory.theory ->
   1.491 +         string *
   1.492 +         (
   1.493 +         string ->
   1.494 +         Term.term -> Theory.theory -> (string * Term.term) Library.option) ->
   1.495 +         Term.term -> (Term.term * (string * Thm.thm)) Library.option
   1.496 +\end{verbatim}}
   1.497 +Man bekommt das Ergebnis und das theorem bezieht sich darauf. Daher sind die folgenden mathematischen Rechnungen m\"oglich:
   1.498 +{\footnotesize\begin{verbatim}
   1.499 +   > calclist;
   1.500 +      val it =
   1.501 +         [("Vars", ("Tools.Vars", fn)), ("matches", ("Tools.matches", fn)),
   1.502 +            ("lhs", ("Tools.lhs", fn)), ("plus", ("op +", fn)),
   1.503 +            ("times", ("op *", fn)), ("divide_", ("HOL.divide", fn)),
   1.504 +            ("power_", ("Atools.pow", fn)), ("is_const", ("Atools.is'_const", fn)),
   1.505 +            ("le", ("op <", fn)), ("leq", ("op <=", fn)),
   1.506 +            ("ident", ("Atools.ident", fn)), ("sqrt", ("Root.sqrt", fn)),
   1.507 +            ("Test.is_root_free", ("is'_root'_free", fn)),
   1.508 +            ("Test.contains_root", ("contains'_root", fn))]
   1.509 +      :
   1.510 +         (
   1.511 +         string *
   1.512 +         (
   1.513 +         string *
   1.514 +         (
   1.515 +         string ->
   1.516 +         Term.term -> Theory.theory -> (string * Term.term) Library.option))) list
   1.517 +\end{verbatim}}
   1.518 +
   1.519 +
   1.520 +
   1.521 +
   1.522 +\chapter{Termordnung}
   1.523 +Die Anordnungen der Begriffe sind unverzichtbar f\"ur den Gebrauch des Umschreibens von normalen Funktionen und von normalen Formeln, die n\"otig sind um passende Modelle f\"ur Probleme zu finden.
   1.524 +
   1.525 +\section{Beispiel f\"ur Termordnungen}
   1.526 +Es ist nicht unbedeutend, eine Verbindung zu Termen herzustellen, die wirklich eine Ordnung besitzen. Diese Ordnungen sind selbstaufrufende Bahnordnungen:
   1.527 +
   1.528 +{\footnotesize\begin{verbatim}
   1.529 +   > sqrt_right;
   1.530 +      val it = fn : bool -> Theory.theory -> subst -> Term.term * Term.term -> b       ool
   1.531 +   > tless_true;
   1.532 +      val it = fn : subst -> Term.term * Term.term -> bool
   1.533 +\end{verbatim}}
   1.534 +
   1.535 +Das ''bool`` Argument gibt Ihnen die M\"oglichkeit, die Kontrolle zu den zugeh\"origen Unterordunungen zur\"uck zu verfolgen, damit sich die Unterordnungen, die 'true' sind, als strings anzeigen lassen.
   1.536 +
   1.537 +{\section{Geordnetes Rewriting}}
   1.538 +Beim Rewriting entstehen Probleme, die vom ''law of commutativity`` (= Kommutativgesetz) durch '+' und '*' verursacht werden. Diese Probleme k\"onnen nur durch geordnetes Rewriting gel\"ost werden, da hier ein Term nur umgeschrieben wird, wenn ein kleinerer dadurch entsteht.
   1.539 +
   1.540 +
   1.541 +\chapter{Problem hierachy}
   1.542 +\section{''Matching``}
   1.543 +Matching ist eine Technik von Rewriting, die von \isac{} verwendet wird, um ein Problem und den passenden problem type daf\"ur zu finden. Die folgende Funktion \"uberpr\"uft, ob Matching m\"oglich ist:
   1.544 +{\footnotesize\begin{verbatim}
   1.545 +> matches;
   1.546 +val it = fn : Theory.theory -> Term.term -> Term.term -> bool
   1.547 +\end{verbatim}}
   1.548 +Die folgende Gleichung wird in Operatoren und freie Variablen zerlegt.
   1.549 +{\footnotesize\begin{verbatim}
   1.550 +> val t = (term_of o the o (parse thy)) "3 * x^^^2 = 1";
   1.551 +val t =
   1.552 +Const ("op =", "[RealDef.real, RealDef.real] => bool") $
   1.553 +(Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $
   1.554 +Free ("3", "RealDef.real") $
   1.555 +(Const
   1.556 +("Atools.pow",
   1.557 +"[RealDef.real, RealDef.real] => RealDef.real") $
   1.558 +Free ("x", "RealDef.real") $ Free ("2", " RealDef.real"))) $
   1.559 +Free ("1", "RealDef.real") : Term.term
   1.560 +\end{verbatim}}
   1.561 +Nun wird ein Modell erstellt, das sich nicht auf bestimmte Zahlen bezieht, sondern nur eine generelle Zerlegung durchf\"uhrt.
   1.562 +{\footnotesize\begin{verbatim}
   1.563 +> val p = (term_of o the o (parse thy)) "a * b^^^2 = c";
   1.564 +val p =
   1.565 +Const ("op =", "[RealDef.real, RealDef.real] => bool") $
   1.566 +(Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $
   1.567 +Free ("a", "RealDef.real") $
   1.568 +(Const
   1.569 +("Atools.pow",
   1.570 +"[RealDef.real, RealDef.real] => RealDef.real") $
   1.571 +Free ("b", "RealDef.real") $ Free ("2", "RealDef.real"))) $
   1.572 +Free ("c", "RealDef.real") : Term.term
   1.573 +\end{verbatim}}
   1.574 +Dieses Modell enth\"alt sogenannte \textit{scheme variables}.
   1.575 +{\footnotesize\begin{verbatim}
   1.576 +> atomt p;
   1.577 +"*** -------------"
   1.578 +"*** Const (op =)"
   1.579 +"*** . Const (op *)""*** . . Free (a, )"
   1.580 +"*** . . Const (Atools.pow)"
   1.581 +"*** . . . Free (b, )"
   1.582 +"*** . . . Free (2, )"
   1.583 +"*** . Free (c, )"
   1.584 +"\n"
   1.585 +val it = "\n" : string
   1.586 +\end{verbatim}}
   1.587 +Das Modell wird durch den Befehl \textit{free2var} erstellt.
   1.588 +{\footnotesize\begin{verbatim}
   1.589 +> free2var;
   1.590 +val it = fn : Term.term -> Term.term
   1.591 +> val pat = free2var p;
   1.592 +val pat =
   1.593 +Const ("op =", "[RealDef.real, RealDef.real] => bool") $
   1.594 +(Const ("op *", "[RealDef.real, RealDef.real] => RealDef.real") $
   1.595 +Var (("a", 0), "RealDef.real") $
   1.596 +(Const
   1.597 +("Atools.pow",
   1.598 +"[RealDef.real, RealDef.real] => RealDef.real") $
   1.599 +Var (("b", 0), "RealDef.real") $
   1.600 +Free ("2", "RealDef.real"))) $ Var (("c", 0), "RealDef.real")
   1.601 +: Term.term
   1.602 +> Sign.string_of_term (sign_of thy) pat;
   1.603 +val it = "?a * ?b ^^^ 2 = ?c" : string
   1.604 +\end{verbatim}}
   1.605 +Durch \textit{atomt pat} wird der Term aufgespalten und in eine Form gebracht, die f\"ur die weiteren Schritte ben\"otigt wird.
   1.606 +{\footnotesize\begin{verbatim}
   1.607 +> atomt pat;
   1.608 +"*** -------------"
   1.609 +"*** Const (op =)"
   1.610 +"*** . Const (op *)"
   1.611 +"*** . . Var ((a, 0), )"
   1.612 +"*** . . Const (Atools.pow)"
   1.613 +"*** . . . Var ((b, 0), )"
   1.614 +"*** . . . Free (2, )"
   1.615 +"*** . Var ((c, 0), )"
   1.616 +"\n"
   1.617 +val it = "\n" : string
   1.618 +\end{verbatim}}
   1.619 +Jetzt kann das Matching an den beiden vorigen Terme angewendet werden.
   1.620 +{\footnotesize\begin{verbatim}
   1.621 +> matches thy t pat;
   1.622 +val it = true : bool
   1.623 +> val t2 = (term_of o the o (parse thy)) "x^^^2 = 1";
   1.624 +val t2 =
   1.625 +Const ("op =", "[RealDef.real, RealDef.real] => bool") $
   1.626 +(Const
   1.627 +("Atools.pow",
   1.628 +"[RealDef.real, RealDef.real] => RealDef.real") $
   1.629 +Free ("x", "RealDef.real") $ Free ("2", "RealDef.real")) $
   1.630 +Free ("1", "RealDef.real") : Term.term
   1.631 +> matches thy t2 pat;
   1.632 +val it = false : bool
   1.633 +> val pat2 = (term_of o the o (parse thy)) "?u^^^2 = ?v";
   1.634 +val pat2 =
   1.635 +Const ("op =", "[RealDef.real, RealDef.real] => bool") $
   1.636 +(Const
   1.637 +("Atools.pow",
   1.638 +"[RealDef.real, RealDef.real] => RealDef.real") $
   1.639 +Var (("u", 0), "RealDef.real") $ Free ("2", "RealDef.real")) $
   1.640 +Var (("v", 0), "RealDef.real") : Term.term
   1.641 +> matches thy t2 pat2;
   1.642 +val it = true : bool
   1.643 +\end{verbatim}}
   1.644 +
   1.645 +\section{Zugriff auf die hierachy}
   1.646 +Man verwendet folgenden Befehl, um sich Zugang zur hierachy von problem type zu verschaffen.
   1.647 +{\footnotesize\begin{verbatim}
   1.648 +> show_ptyps;
   1.649 +val it = fn : unit -> unit
   1.650 +> show_ptyps();
   1.651 +[
   1.652 +["e_pblID"],
   1.653 +["simplification", "polynomial"],
   1.654 +["simplification", "rational"],
   1.655 +["vereinfachen", "polynom", "plus_minus"],
   1.656 +["vereinfachen", "polynom", "klammer"],
   1.657 +["vereinfachen", "polynom", "binom_klammer"],
   1.658 +["probe", "polynom"],
   1.659 +["probe", "bruch"],
   1.660 +["equation", "univariate", "linear"],
   1.661 +["equation", "univariate", "root", "sq", "rat"],
   1.662 +["equation", "univariate", "root", "normalize"],
   1.663 +["equation", "univariate", "rational"],
   1.664 +["equation", "univariate", "polynomial", "degree_0"],
   1.665 +["equation", "univariate", "polynomial", "degree_1"],
   1.666 +["equation", "univariate", "polynomial", "degree_2", "sq_only"],
   1.667 +["equation", "univariate", "polynomial", " 
   1.668 + degree_2", "bdv_only"],
   1.669 +["equation", "univariate", "polynomial", "degree_2", "pqFormula"],
   1.670 +["equation", "univariate", "polynomial", "degree_2", "abcFormula"],
   1.671 +["equation", "univariate", "polynomial", "degree_3"],
   1.672 +["equation", "univariate", "polynomial", "degree_4"],
   1.673 +["equation", "univariate", "polynomial", "normalize"],
   1.674 +["equation", "univariate", "expanded", "degree_2"],
   1.675 +["equation", "makeFunctionTo"],
   1.676 +["function", "derivative_of", "named"],
   1.677 +["function", "maximum_of", "on_interval"],
   1.678 +["function", "make", "by_explicit"],
   1.679 +["function", "make", "by_new_variable"],
   1.680 +["function", "integrate", "named"],
   1.681 +["tool", "find_values"],
   1.682 +["system", "linear", "2x2", "triangular"],
   1.683 +["system", "linear", "2x2", "normalize"],
   1.684 +["system", "linear", "3x3"],
   1.685 +["system", "linear", "4x4", "triangular"],
   1.686 +["system", "linear", "4x4", "normalize"],
   1.687 +["Biegelinien", "
   1.688 +MomentBestimmte"],
   1.689 +["Biegelinien", "MomentGegebene"],
   1.690 +["Biegelinien", "einfache"],
   1.691 +["Biegelinien", "QuerkraftUndMomentBestimmte"],
   1.692 +["Biegelinien", "vonBelastungZu"],
   1.693 +["Biegelinien", "setzeRandbedingungen"],
   1.694 +["Berechnung", "numerischSymbolische"],
   1.695 +["test", "equation", "univariate", "linear"],
   1.696 +["test", "equation", "univariate", "plain_square"],
   1.697 +["test", "equation", "univariate", "polynomial", "degree_two", "pq_formula"],
   1.698 +["test", "equation", "univariate", "polynomial", "degree_two", "abc_formula"],
   1.699 +["test", "equation", "univariate", "squareroot"],
   1.700 +["test", "equation", "univariate", "normalize"],
   1.701 +["test", "equation", "univariate", "sqroot-test"]
   1.702 +]
   1.703 +val it = () : unit
   1.704 +\end{verbatim}}
   1.705 +
   1.706 +\section{Die passende ''formalization`` f\"ur den problem type}
   1.707 +Eine andere Art des Matching ist es die richtige ''formalization`` zum jeweiligen problem type zu finden. Wenn eine solche vorhanden ist, kann \isac{} selbstst\"andig die Probleme l\"osen.
   1.708 +
   1.709 +\section{''problem-refinement``}
   1.710 +Will man die problem hierachy (= ) aufstellen, so ist darauf zu achten, dass man die verschiedenen Branches so konstruiert, dass das problem-refinement automatisch durchgef\"uhrt werden kann.
   1.711 +{\footnotesize\begin{verbatim}
   1.712 +> refine;
   1.713 +val it = fn : fmz_ -> pblID -> SpecifyTools.match list
   1.714 +> val fmz = ["equality (sqrt(9 + 4 * x)=sqrt x 
   1.715 ++ sqrt (5 + x))",
   1.716 +# "soleFor x","errorBound (eps=0)",
   1.717 +# "solutions L"];
   1.718 +val fmz =
   1.719 +["equality (sqrt(9 + 4 * x)=sqrt x + sqrt (5 + x))", "soleFor x",
   1.720 +"errorBound (eps=0)", ...] : string list
   1.721 +> refine fmz ["univariate","equation"];
   1.722 +*** pass ["equation","univariate"]
   1.723 +*** comp_dts: ??.empty $ soleFor x
   1.724 +Exception- ERROR raised
   1.725 +\end{verbatim}}
   1.726 +Wenn die ersten zwei Regeln nicht angewendet werden k\"onnen, kommt die dritte zum Einsatz:
   1.727 +{\footnotesize\begin{verbatim}
   1.728 +> val fmz = ["equality (x + 1 = 2)",
   1.729 +# "solveFor x","errorBound (eps=0)",
   1.730 +# "solutions L"];
   1.731 +val fmz = ["equality (x + 1 = 2)", "solveFor x", "errorBound (eps=0)", ...]
   1.732 +: string list
   1.733 +> refine fmz ["univariate","equation"];
   1.734 +*** pass ["equation","univariate"]
   1.735 +*** pass ["equation","univariate","linear"]
   1.736 +*** pass ["equation","univariate","root"]
   1.737 +*** pass ["equation","univariate","rational"]
   1.738 +*** pass ["equation","univariate","polynomial" ]
   1.739 +*** pass ["equation","univariate","polynomial","degree_0"]
   1.740 +*** pass ["equation","univariate","polynomial","degree_1"]
   1.741 +*** pass ["equation","univariate","polynomial","degree_2"]
   1.742 +*** pass ["equation","univariate","polynomial","degree_3"]
   1.743 +*** pass ["equation","univariate","polynomial","degree_4"]
   1.744 +*** pass ["equation","univariate","polynomial","normalize"]
   1.745 +val it =
   1.746 +[Matches
   1.747 +(["univariate", "equation"],
   1.748 +{Find = [Correct "solutions L"], With = [...], ...}),
   1.749 +NoMatch (["linear", "univariate", ...], {Find = [...], ...}),
   1.750 +NoMatch (["root", ...], ...), ...] : SpecifyTools.match list
   1.751 +\end{verbatim}}
   1.752 +Der problem type wandelt $x + 1 = 2$ in die normale Form $-1 + x = 0$ um. Diese Suche nach der jeweiligen problem hierachy kann mit Hilfe eines ''proof state`` durchgef\"uhrt werden (siehe n\"achstes Kapitel).
   1.753 +
   1.754 +
   1.755 +\chapter{''Methods``}
   1.756 +Methods werden dazu verwendet, Probleme von type zu l\"osen. Sie sind in einer anderen Programmiersprache beschrieben. Die Sprache sieht einfach aus, betreibt aber im Hintergrund einen enormen Pr\"ufaufwand. So muss sich der Programmierer nicht mit technischen Details befassen, gleichzeitig k\"onnen aber auch keine falschen Anweisungen eingegeben werden.
   1.757 +\section{Der ''Syntax`` des script}
   1.758 +Syntax beschreibt den Zusammenhang der einzelnen Zeichen und Zeichenfolgen mit den Theorien.
   1.759 +Er kann so definiert werden:
   1.760 +\begin{tabbing}
   1.761 +123\=123\=expr ::=\=$|\;\;$\=\kill
   1.762 +\>script ::= {\tt Script} id arg$\,^*$ = body\\
   1.763 +\>\>arg ::= id $\;|\;\;($ ( id :: type ) $)$\\
   1.764 +\>\>body ::= expr\\
   1.765 +\>\>expr ::= \>\>{\tt let} id = expr $($ ; id = expr$)^*$ {\tt in} expr\\
   1.766 +\>\>\>$|\;$\>{\tt if} prop {\tt then} expr {\tt else} expr\\
   1.767 +\>\>\>$|\;$\>listexpr\\
   1.768 +\>\>\>$|\;$\>id\\
   1.769 +\>\>\>$|\;$\>seqex id\\
   1.770 +\>\>seqex ::= \>\>{\tt While} prop {\tt Do} seqex\\
   1.771 +\>\>\>$|\;$\>{\tt Repeat} seqex\\
   1.772 +\>\>\>$|\;$\>{\tt Try} seqex\\
   1.773 +\>\>\>$|\;$\>seqex {\tt Or} seqex\\
   1.774 +\>\>\>$|\;$\>seqex {\tt @@} seqex\\
   1.775 +\>\>\>$|\;$\>tac $($ id $|$ listexpr $)^*$\\
   1.776 +\>\>type ::= id\\
   1.777 +\>\>tac ::= id
   1.778 +\end{tabbing}
   1.779 +
   1.780 +\section{\"Uberpr\"ufung der Auswertung}
   1.781 +Das Kontrollsystem arbeitet mit den folgenden Script-Ausdr\"ucken, die {\it tacticals} genannt werden:
   1.782 +\begin{description}
   1.783 +\item{{\tt while} prop {\tt Do} expr id} 
   1.784 +\item{{\tt if} prop {\tt then} expr {\tt else} expr}
   1.785 +\end{description}
   1.786 +W\"ahrend die genannten Befehle das Kontrollsystem durch Auswertung der Formeln ausl\"osen, h\"angen die anderen von der Anwendbarkeit der Formel in den entsprechenden Unterbegriffen ab:
   1.787 +\begin{description}
   1.788 +\item{{\tt Repeat} expr id}
   1.789 +\item{{\tt Try} expr id}
   1.790 +\item{expr {\tt Or} expr id}
   1.791 +\item{expr {\tt @@} expr id}
   1.792 +\item xxx
   1.793 +\end{description}
   1.794 +
   1.795 +
   1.796 +
   1.797 +\chapter{Befehle von \isac{}}
   1.798 +In diesem Kapitel werden alle schon zur Verf\"ugung stehenden Schritte aufgelistet. Diese Liste kann sich auf Grund von weiteren Entwicklungen von \isac{} noch \"andern.\
   1.799 +\newline\linebreak \textbf{Init\_Proof\_Hid (dialogmode, formalization, specifictaion)} gibt die eingegebenen Befehle an die mathematic engine weiter, wobei die beiden letzten Begriffe die Beispiele automatisch speichern. Es ist nicht vorgesehen, dass der Sch\"uler tactic verwendet.\
   1.800 +\newline\linebreak \textbf{Init\_Proof} bildet mit einem ''proof tree`` ein leeres Modell.\
   1.801 +\newline\linebreak \textbf{Model\_Problem problem} bestimmt ein problemtype, das wom\"oglich in der ''hierachy`` gefunden wurde, und verwendet es f\"ur das Umformen.\
   1.802 +\newline\linebreak \textbf{Add\_Given, Add\_Find, Add\_Relation formula} f\"ugt eine Formel in ein bestimmtes Feld eines Modells ein. Dies ist notwendig, solange noch kein Objekt f\"ur den Benutzer vorhanden ist, in dem man die Formel eingeben kann, und nicht die gew\"unschte tactic und Formel von einer Liste w\"ahlen will.\
   1.803 +\newline\linebreak \textbf{Specify\_Theorie theory, Specify\_Problem proble, Specify\_Method method} gibt das entsprechende Element des Basiswissens an.\
   1.804 +\newline\linebreak \textbf{Refine\_Problem problem} sucht nach einem Problem in der hierachy, das auf das vorhandene zutrifft.\
   1.805 +\newline\linebreak \textbf{Apply\_Method method} beendet das Modell und die Beschreibung. Danach wird die L\"osungmeldung ge\"offnet.\
   1.806 +\newline\linebreak \textbf{Free\_Solve} beginnt eine L\"osungsmeldung ohne die Hilfe einer method.\
   1.807 +\newline\linebreak \textbf{Rewrite theorem} bef\"ordert ein theorem in die aktuelle Formel und wandelt es demenetsprechend um. Wenn dies nicht m\"oglich ist, kommt eine Meldung mit ''error``.\
   1.808 +\newline\linebreak \textbf{Rewrite\_Asm theorem} hat die gleiche Funktion wie Rewrite, speichert jedoch eine endg\"ultige Vorraussetzung des theorems, anstatt diese zu sch\"atzen.\
   1.809 +\newline\linebreak \textbf{Rewrite\_Set ruleset} hat \"ahnliche Funktionen wie Rewrite, gilt aber f\"ur einen ganzen Satz von theorems, dem rule set.\
   1.810 +\newline\linebreak \textbf{Rewrite\_Inst (substitution, theorem), Rewrite\_Set\_Inst (substitution, rule set)} ist vergleichbar mit besonderen tactics, ersetzt aber Konstanten im theorem, bevor es zu einer Anwendung kommt.\
   1.811 +\newline\linebreak \textbf{Calculate operation} berechnet das Ergebnis der Eingabe mit der aktuellen Formel (plus, minus, times, cancel, pow, sqrt).\
   1.812 +\newline\linebreak \textbf{Substitute substitution} f\"ugt der momentanen Formel {\tt substitution} hinzu und wandelt es um.\
   1.813 +\newline\linebreak \textbf{Take formula} startet eine neue Reihe von Rechnungen in den Formeln, wo sich schon eine andere Rechnung befindet.\
   1.814 +\newline\linebreak \textbf{Subproblem (theory, problem)} beginnt ein subproblem innerhalb einer Rechnung.\
   1.815 +\newline\linebreak \textbf{Function formula} ruft eine Funktion auf, in der der Name in der Formel enthalten ist. ???????\
   1.816 +\newline\linebreak \textbf{Split\_And, Conclude\_And, Split\_Or, Conclude\_Or, Begin\_Trans, End\_Trans, Begin\_Sequ, End\_Sequ, Split\_Intersect, End\_Intersect} betreffen den Bau einzelner branches des proof trees. Normalerweise werden sie vom dialog guide verdr\"angt.\
   1.817 +\newline\linebreak \textbf{Check\_elementwise assumption} wird in Bezug auf die aktuelle Formel verwendet, die Elemente in einer Liste enth\"alt.\
   1.818 +\newline\linebreak \textbf{Or\_to\_List} wandelt eine Verbindung von Gleichungen in eine Liste von Gleichungen um.\
   1.819 +\newline\linebreak \textbf{Check\_postcond} \"uberpr\"uft die momentane Formel im Bezug auf die Nachbedinung beim Beenden des subproblem.\
   1.820 +\newline\linebreak \textbf{End\_Proof} beendet eine \"Uberpr\"ufung und gibt erst dann ein Ergebnis aus, wenn Check\_postcond erfolgreich abgeschlossen wurde.
   1.821 +
   1.822 +\section{Die Funktionsweise der mathematic engine}
   1.823 +Ein proof (= Beweis) wird in der mathematic engine me von der tactic {\tt Init\_Proof} gestartet und wird wechselwirkend mit anderen tactics vorangebracht. Auf den input (= das, was eingegeben wurde) einzelner tactics folgt eine Formel, die von der me ausgegeben wird, und die darauf folgende tactic gilt. Der proof ist beendet, sobald die me {\tt End\_Proof} als n\"achste tactic vorschl\"agt.
   1.824 +\newline Im Anschluss werden Sie einen Rechenbeweis sehen, der von der L\"osung einer Gleichung (= equation) handelt, bei der diese automatisch differenziert wird. 
   1.825 +{\footnotesize\begin{verbatim}
   1.826 +??????????????????????????????????????????????????????????????????????????????????   
   1.827 +
   1.828 +ML> val fmz = ["equality ((x+#1)*(x+#2)=x^^^#2+#8)","solveFor x",
   1.829 +                  "errorBound (eps=#0)","solutions L"];
   1.830 +   val fmz =
   1.831 +     ["equality ((x+#1)*(x+#2)=x^^^#2+#8)","solveFor x","errorBound (eps=#0)",
   1.832 +      "solutions L"] : string list
   1.833 +   ML>
   1.834 +   ML> val spec as (dom, pbt, met) = ("SqRoot.thy",["univariate","equation"],
   1.835 +                                 ("SqRoot.thy","no_met"));
   1.836 +   val dom = "SqRoot.thy" : string
   1.837 +   val pbt = ["univariate","equation"] : string list
   1.838 +   val met = ("SqRoot.thy","no_met") : string * string
   1.839 +\end{verbatim}}
   1.840 +
   1.841 +\section{Der Beginn einer Rechnung}
   1.842 +
   1.843 +Der proof state wird von einem proof tree und einer position ausgegeben. Beide sind zu Beginn leer. Die tactic {\tt Init\_Proof} ist, wie alle anderen tactics auch, an einen string gekoppelt. Um einen neuen proof beginnen zu k\"onnen, werden folgende Schritte durchgef\"uhrt:
   1.844 +{\footnotesize\begin{verbatim}
   1.845 +???????????????????????????????????????????????????????????????????????????????????????????? 
   1.846 +ML>  val (mID,m) = ("Init_Proof",Init_Proof (fmz, (dom,pbt,met)));
   1.847 +   val mID = "Init_Proof" : string
   1.848 +   val m =
   1.849 +     Init_Proof
   1.850 +       (["equality ((x+#1)*(x+#2)=x^^^#2+#8)","solveFor x","errorBound (eps=#0)",
   1.851 +         "solutions L"],("SqRoot.thy",[#,#],(#,#))) : mstep
   1.852 +   ML>
   1.853 +   ML>  val (p,_,f,nxt,_,pt) = me (mID,m) e_pos' c EmptyPtree;
   1.854 +   val p = ([],Pbl) : pos'
   1.855 +   val f = Form' (PpcKF (0,EdUndef,0,Nundef,(#,#))) : mout
   1.856 +   val nxt = ("Refine_Tacitly",Refine_Tacitly ["univariate","equation"])
   1.857 +     : string * mstep
   1.858 +   val pt =
   1.859 +     Nd
   1.860 +       (PblObj
   1.861 +          {branch=#,cell=#,env=#,loc=#,meth=#,model=#,origin=#,ostate=#,probl=#,
   1.862 +           result=#,spec=#},[]) : ptree
   1.863 +\end{verbatim}}
   1.864 +Die mathematics engine gibt etwas mit dem type {\tt mout} aus, was in unserem Fall ein Problem darstellt. Sobald mehr angezeigt wird, m\"usste dieses jedoch gel\"ost sein.
   1.865 +{\footnotesize\begin{verbatim}
   1.866 +?????????????????????????????????????????????????????????????????????????????????????????????
   1.867 +   ML> Compiler.Control.Print.printDepth:=8; (*4 default*)
   1.868 +   val it = () : unit
   1.869 +   ML>
   1.870 +   ML> f;
   1.871 +   val it =
   1.872 +     Form'
   1.873 +       (PpcKF
   1.874 +          (0,EdUndef,0,Nundef,
   1.875 +           (Problem [],
   1.876 +            {Find=[Incompl "solutions []"],
   1.877 +             Given=[Incompl "equality",Incompl "solveFor"],Relate=[],
   1.878 +             Where=[False "matches (?a = ?b) e_"],With=[]}))) : mout
   1.879 +\end{verbatim}}
   1.880 +{\footnotesize\begin{verbatim}
   1.881 +?????????????????????????????????????????????????????????????????????????????????????????????
   1.882 +   ML>  nxt;
   1.883 +   val it = ("Refine_Tacitly",Refine_Tacitly ["univariate","equation"])
   1.884 +     : string * mstep
   1.885 +   ML>
   1.886 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.887 +   val nxt = ("Model_Problem",Model_Problem ["normalize","univariate","equation"])
   1.888 +     : string * mstep
   1.889 +   ML>
   1.890 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.891 +\end{verbatim}}
   1.892 +
   1.893 +\section{The phase of modeling}
   1.894 +Dieses Kapitel besch\"aftigt sich mit dem input der Einzelheiten bei einem Problem. Die me kann dabei helfen, wenn man die formalization durch {\tt Init\_Proof} darauf hinweist. Normalerweise weiss die mathematics engine die n\"achste gute tactic.
   1.895 +{\footnotesize\begin{verbatim}
   1.896 +?????????????????????????????????????????????????????????????????????????????????????????????
   1.897 +   ML>  nxt;
   1.898 +   val it =
   1.899 +     ("Add_Given",Add_Given "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)")
   1.900 +     : string * mstep
   1.901 +   ML>
   1.902 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.903 +   val nxt = ("Add_Given",Add_Given "solveFor x") : string * mstep
   1.904 +   ML>
   1.905 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.906 +   val nxt = ("Add_Find",Add_Find "solutions L") : string * mstep
   1.907 +   ML>
   1.908 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt; 
   1.909 +   val f = Form' (PpcKF (0,EdUndef,0,Nundef,(#,#))) : mout
   1.910 +\end{verbatim}}
   1.911 +{\footnotesize\begin{verbatim}
   1.912 +?????????????????????????????????????????????????????????????????????????????????????????????
   1.913 +   ML>  Compiler.Control.Print.printDepth:=8;
   1.914 +   ML>  f;
   1.915 +   val it =
   1.916 +     Form'
   1.917 +       (PpcKF
   1.918 +          (0,EdUndef,0,Nundef,
   1.919 +           (Problem [],
   1.920 +            {Find=[Correct "solutions L"],
   1.921 +             Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
   1.922 +                    Correct "solveFor x"],Relate=[],Where=[],With=[]}))) : mout
   1.923 +\end{verbatim}}
   1.924 +
   1.925 +
   1.926 +\section{The phase of specification}
   1.927 +Diese phase liefert eindeutige Bestimmungen einer domain, den problem type und die method damit man sie verwenden kann. F\"ur gew\"ohnlich wird die Suche nach dem richtigen problem type unterst\"utzt. Dazu sind zwei tactics verwendbar: {\tt Specify\_Problem} entwickelt ein Feedback, wie ein problem type bei dem jetzigen problem zusammenpasst und {\tt Refine\_Problem} stellt Hilfe durch das System bereit, falls der Benutzer die \"Ubersicht verliert.
   1.928 +{\footnotesize\begin{verbatim}
   1.929 +??????????????????????????????????????????????????????????????????????????????????????????
   1.930 +   ML> nxt;
   1.931 +   val it = ("Specify_Domain",Specify_Domain "SqRoot.thy") : string * mstep
   1.932 +   ML>
   1.933 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.934 +   val nxt =
   1.935 +     ("Specify_Problem",Specify_Problem ["normalize","univariate","equation"])
   1.936 +     : string * mstep
   1.937 +   val pt =
   1.938 +     Nd
   1.939 +       (PblObj
   1.940 +          {branch=#,cell=#,env=#,loc=#,meth=#,model=#,origin=#,ostate=#,probl=#,
   1.941 +              result=#,spec=#},[]) : ptree
   1.942 +\end{verbatim}}
   1.943 +Die me erkennt den richtigen Problem type und arbeitet so weiter:
   1.944 +{\footnotesize\begin{verbatim}
   1.945 +?????????????????????????????????????????????????????????????????????????????????????????
   1.946 +   ML> val nxt = ("Specify_Problem",
   1.947 +               Specify_Problem ["polynomial","univariate","equation"]);
   1.948 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.949 +   val f = Form' (PpcKF (0,EdUndef,0,Nundef,(#,#))) : mout
   1.950 +   val nxt =
   1.951 +     ("Refine_Problem",Refine_Problem ["normalize","univariate","equation"])
   1.952 +     : string * mstep
   1.953 +   ML>
   1.954 +   ML> val nxt = ("Specify_Problem",
   1.955 +               Specify_Problem ["linear","univariate","equation"]);
   1.956 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.957 +   val f =
   1.958 +     Form'
   1.959 +       (PpcKF
   1.960 +          (0,EdUndef,0,Nundef,
   1.961 +           (Problem ["linear","univariate","equation"],
   1.962 +            {Find=[Correct "solutions L"],
   1.963 +             Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
   1.964 +                    Correct "solveFor x"],Relate=[],
   1.965 +             Where=[False
   1.966 +                    "matches (?a + ?b * x = #0) ((x + #1) * (x + #2) = x ^^^ #2 + #8)"],
   1.967 +             With=[]}))) : mout 
   1.968 +\end{verbatim}}
   1.969 +Wir nehmen wieder an, dass der dialog guide die n\"achsten tactics, veranlasst von der mathematic engine, versteckt und der Sch\"uler Hilfe ben\"otigt. Dann muss {\tt Refine\_Problem} angewandt werden. Dieser Befehl findet immer den richtigen Weg, wenn man es auf den problem type bezieht [''univariate``, ''equation``].
   1.970 +{\footnotesize\begin{verbatim}
   1.971 +????????????????????????????????????????????????????????????????????????????????????????????
   1.972 +   ML> val nxt = ("Refine_Problem",
   1.973 +                  Refine_Problem ["linear","univariate","equation
   1.974 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.975 +   val f = Problems (RefinedKF [NoMatch #]) : mout
   1.976 +   ML>
   1.977 +   ML>  Compiler.Control.Print.printDepth:=9;f;Compiler.Control.Print.printDepth:=4;
   1.978 +   val f =
   1.979 +     Problems
   1.980 +       (RefinedKF
   1.981 +          [NoMatch
   1.982 +             (["linear","univariate","equation"],
   1.983 +              {Find=[Correct "solutions L"],
   1.984 +               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
   1.985 +                      Correct "solveFor x"],Relate=[],
   1.986 +               Where=[False
   1.987 +                     "matches (?a + ?b * x = #0) ((x + #1) * (x + #2) = x ^^^ #2 + #8)"],
   1.988 +               With=[]})]) : mout
   1.989 +   ML>
   1.990 +   ML> val nxt = ("Refine_Problem",Refine_Problem ["univariate","equation"]);
   1.991 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
   1.992 +   val f =
   1.993 +     Problems
   1.994 +       (RefinedKF [Matches #,NoMatch #,NoMatch #,NoMatch #,NoMatch #,Matches #])
   1.995 +     : mout
   1.996 +   ML>
   1.997 +   ML>
   1.998 +   ML>  Compiler.Control.Print.printDepth:=9;f;Compiler.Control.Print.printDepth:=4;
   1.999 +   val f =
  1.1000 +     Problems
  1.1001 +       (RefinedKF
  1.1002 +          [Matches
  1.1003 +             (["univariate","equation"],
  1.1004 +              {Find=[Correct "solutions L"],
  1.1005 +               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
  1.1006 +                      Correct "solveFor x"],Relate=[],
  1.1007 +               Where=[Correct
  1.1008 +               With=[]}),
  1.1009 +           NoMatch
  1.1010 +             (["linear","univariate","equation"],
  1.1011 +              {Find=[Correct "solutions L"],
  1.1012 +               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
  1.1013 +                      Correct "solveFor x"],Relate=[],
  1.1014 +               Where=[False
  1.1015 +                      "matches (?a + ?b * x = #0) ((x + #1) * (x + #2) = x ^^^ #2 + #8)"],
  1.1016 +                  With=[]}),
  1.1017 +           NoMatch
  1.1018 +             ...
  1.1019 +             ...   
  1.1020 +           Matches
  1.1021 +             (["normalize","univariate","equation"],
  1.1022 +              {Find=[Correct "solutions L"],
  1.1023 +               Given=[Correct "equality ((x + #1) * (x + #2) = x ^^^ #2 + #8)",
  1.1024 +                      Correct "solveFor x"],Relate=[],Where=[],With=[]})]) : mout
  1.1025 +\end{verbatim}}
  1.1026 +Die tactic {\tt Refine\_Problem} wandelt alle matches wieder in problem types um und sucht in der problem hierachy weiter.
  1.1027 +
  1.1028 +
  1.1029 +\section{The phase of solving}
  1.1030 +Diese phase beginnt mit dem Aufruf einer method, die eine normale form innerhalb einer tactic ausf\"uhrt: {\tt Rewrite rnorm\_equation\_add} und {\tt Rewrite\_Set SqRoot\_simplify}:
  1.1031 +{\footnotesize\begin{verbatim} 
  1.1032 +   ML> nxt;
  1.1033 +   val it = ("Apply_Method",Apply_Method ("SqRoot.thy","norm_univar_equation"))
  1.1034 +     : string * mstep
  1.1035 +   ML>
  1.1036 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
  1.1037 +   val f =
  1.1038 +     Form' (FormKF (~1,EdUndef,1,Nundef,"(x + #1) * (x + #2) = x ^^^ #2 + #8"))
  1.1039 +   val nxt =
  1.1040 +     ("Rewrite", Rewrite
  1.1041 +        ("rnorm_equation_add","~ ?b =!= #0 ==> (?a = ?b) = (?a + #-1 * ?b = #0)"))
  1.1042 +   ML>
  1.1043 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
  1.1044 +   val f =
  1.1045 +     Form' (FormKF (~1,EdUndef,1,Nundef,
  1.1046 +           "(x + #1) * (x + #2) + #-1 * (x ^^^ #2 + #8) = #0")) : mout
  1.1047 +   val nxt = ("Rewrite_Set",Rewrite_Set "SqRoot_simplify") : string * mstep
  1.1048 +   ML>
  1.1049 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
  1.1050 +   val f = Form' (FormKF (~1,EdUndef,1,Nundef,"#-6 + #3 * x = #0")) : mout
  1.1051 +   val nxt = ("Subproblem",Subproblem ("SqRoot.thy",[#,#])) : string * mstep
  1.1052 +\end{verbatim}}
  1.1053 +Die Formel $-6 + 3\cdot x = 0$ ist die Eingabe eine subproblems, das wiederum gebraucht wird, um die Gleichungsart zu erkennen und die entsprechende method auszuf\"uhren:
  1.1054 +{\footnotesize\begin{verbatim}
  1.1055 +   ML> nxt;
  1.1056 +   val it = ("Subproblem",Subproblem ("SqRoot.thy",["univariate","equation"]))
  1.1057 +   ML>   
  1.1058 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
  1.1059 +   val f =
  1.1060 +     Form' (FormKF
  1.1061 +          (~1,EdUndef,1,Nundef,"Subproblem (SqRoot.thy, [univariate, equation])"))
  1.1062 +     : mout
  1.1063 +   val nxt = ("Refine_Tacitly",Refine_Tacitly ["univariate","equation"])
  1.1064 +   ML>
  1.1065 +   ML> val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
  1.1066 +   val nxt = ("Model_Problem",Model_Problem ["linear","univariate","equation"])
  1.1067 +\end{verbatim}}
  1.1068 +{\tt Refine [''univariate``, ''equation``]} sucht die passende Gleichungsart aus der problem hierachy heraus, welche man mit {\tt Model\_Problem [''linear``, ''univariate``, ''equation``]} \"uber das System ansehen kann.
  1.1069 +Nun folgt erneut die phase of modeling und die phase of specification.
  1.1070 +
  1.1071 +\section{The final phase: \"Uberpr\"ufung der ''post-condition``}
  1.1072 +Die gezeigten problems, die durch \isac{} gel\"ost wurden, sind so genannte 'example construction problems'. Das massivste Merkmal solcher problems ist die post-condition. Im Umgang mit dieser gibt es noch offene Fragen.
  1.1073 +Dadurch wird die post-condition im folgenden Beispiel als problem und subproblem erw\"ahnt.
  1.1074 +{\footnotesize\begin{verbatim}
  1.1075 +   ML> nxt;
  1.1076 +   val it = ("Check_Postcond",Check_Postcond ["linear","univariate","equation"])
  1.1077 +   ML>
  1.1078 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
  1.1079 +   val f = Form' (FormKF (~1,EdUndef,1,Nundef,"[x = #2]")) : mout
  1.1080 +   val nxt =
  1.1081 +     ("Check_Postcond",Check_Postcond ["normalize","univariate","equation"])
  1.1082 +   ML>
  1.1083 +   ML>  val (p,_,f,nxt,_,pt) = me nxt p [1] pt;
  1.1084 +   val f = Form' (FormKF (~1,EdUndef,0,Nundef,"[x = #2]")) : mout
  1.1085 +   val nxt = ("End_Proof'",End_Proof') : string * mstep
  1.1086 +\end{verbatim}}
  1.1087 +Die tactic {\tt End\_Proof'} bedeutet, dass der proof erflogreich beendet wurde.\\
  1.1088 +
  1.1089 +\paragraph{Versuchen Sie es!} Die tactics, die vom System vorgeschlagen werden, m\"ussen vom Benutzer nicht angewendet werden. Er kann selbstverst\"andlich auch andere tactics verwenden und das System wird melden, ob dieser Befehl zutreffend ist oder nicht.
  1.1090 +
  1.1091 +
  1.1092 +\part{Handbuch f\"ur Autoren}
  1.1093 +
  1.1094 +\chapter{Die Struktur des Grundlagenwissens}
  1.1095 +
  1.1096 +\section{''tactics`` und Daten}
  1.1097 +Zuerst betrachten wir die me von aussen. Wir sehen uns tactics und an und verbinden sie mit unserem Grundwissen (KB). Im Bezug auf das KB befassen wir uns mit den kleinsten Teilchen, die von den Autoren des KB sehr genau durchgef\"uhrt werden m\"ussen.
  1.1098 +Diese Teile sind in alphabetischer Anordnung in Tab.\ref{kb-items} auf Seite \pageref{kb-items} aufgelistet.
  1.1099 +
  1.1100 +{\begin{table}[h]
  1.1101 +\caption{Kleinste Teilchen des KB} \label{kb-items}
  1.1102 +%\tabcolsep=0.3mm
  1.1103 +\begin{center}
  1.1104 +\def\arraystretch{1.0}
  1.1105 +\begin{tabular}{lp{9.0cm}}
  1.1106 +Abk\"urzung & Beschreibung \\
  1.1107 +\hline
  1.1108 +&\\
  1.1109 +{\it calc\_list}
  1.1110 +& gesammelte Liste von allen ausgewerteten Funktionen\\
  1.1111 +{\it eval\_fn}
  1.1112 +& ausgewertete Funktionen f\"ur Zahlen und f\"ur Eigenschaften, die in SML kodiert sind\\
  1.1113 +{\it eval\_rls }
  1.1114 +& rule set {\it rls} f\"ur einfache Ausdr\"ucke mit {\it eval\_fn}s\\
  1.1115 +{\it fmz}
  1.1116 +& Formalisierung, d.h. eine sehr geringe Darstellung von einem Beispiel \\
  1.1117 +{\it met}
  1.1118 +& eine method d.h. eine Datenstruktur, die alle Informationen zum L\"osen einer phase enth\"alt ({\it rew\_ord}, {\it scr}, etc.)\\
  1.1119 +{\it metID}
  1.1120 +& bezieht sich auf {\it met}\\
  1.1121 +{\it op}
  1.1122 +& ein Operator, der der Schl\"ussel zu {\it eval\_fn} in einer {\it calc\_list} ist \\
  1.1123 +{\it pbl}
  1.1124 +& Problem d.h. der Knotenpunkt in der problem hierachy\\
  1.1125 +{\it pblID}
  1.1126 +& bezieht sich auf {\it pbl}\\
  1.1127 +{\it rew\_ord}
  1.1128 +& Anordnung beim Rewriting\\
  1.1129 +{\it rls}
  1.1130 +& rule set, d.h. eine Datenstruktur, die theorems {\it thm} und Operatoren {\it op} zur Vereinfachung (mit {\it rew\_ord}) enth\"alt \\
  1.1131 +{\it Rrls}
  1.1132 +& rule set f\"ur das 'reverse rewriting' (eine \isac-Technik, die schrittweise Rewriting entwickelt, z.B. f\"ur die zur\"uckgenommenen Teile)\\
  1.1133 +{\it scr}
  1.1134 +& script, das die Algorithmen durch Anwenden von tactics beschreibt und ein Teil von {\it met} ist \\
  1.1135 +{\it norm\_rls}
  1.1136 +& spezielles Regelwerk zum Berechnen von Normalformen, im Zusammenhang mit {\it thy}\\
  1.1137 +{\it spec}
  1.1138 +& Spezifikation, z.B, ein Tripel ({\it thyID, pblID, metID})\\
  1.1139 +{\it subs}
  1.1140 +& Ersatz, z.B. eine Liste von Variablen und ihren jeweiligen Werten\\
  1.1141 +{\it Term}
  1.1142 +& Term von Isabelle, z.B. eine Formel\\
  1.1143 +{\it thm}
  1.1144 +& theorem\\
  1.1145 +{\it thy}
  1.1146 +& theory\\
  1.1147 +{\it thyID}
  1.1148 +& im Bezug auf {\it thy} \\
  1.1149 +\end{tabular}\end{center}\end{table}}
  1.1150 +
  1.1151 +Die Verbindung zwischen tactics und Daten werden in Tab.\ref{tac-kb} auf Seite \pageref{tac-kb} dargestellt.
  1.1152 +
  1.1153 +
  1.1154 +\begin{table}[h]
  1.1155 +\caption{Welche tactics verwenden die Teile des KB~?} \label{tac-kb}
  1.1156 +\tabcolsep=0.3mm
  1.1157 +\begin{center}
  1.1158 +\begin{tabular}{|ll||cccc|ccc|cccc|} \hline
  1.1159 +tactic &Eingabe & & & &norm\_& &rew\_&rls &eval\_&eval\_&calc\_& \\
  1.1160 +& &thy &scr &Rrls&rls &thm &ord &Rrls&fn &rls &list &dsc\\
  1.1161 +\hline\hline
  1.1162 +Init\_Proof
  1.1163 +&fmz & x & & & x & & & & & & & x \\
  1.1164 +&spec & & & & & & & & & & & \\
  1.1165 +\hline
  1.1166 +\multicolumn{13}{|l|}{model phase}\\
  1.1167 +\hline
  1.1168 +Add\_*
  1.1169 +&Term & x & & & x & & & & & & & x \\
  1.1170 +FormFK &model & x & & & x & & & & & & & x \\
  1.1171 +\hline
  1.1172 +\multicolumn{13}{|l|}{specify phase}\\
  1.1173 +\hline
  1.1174 +Specify\_Theory
  1.1175 +&thyID & x & & & x & & & & x & x & & x \\
  1.1176 +Specify\_Problem
  1.1177 +&pblID & x & & & x & & & & x & x & & x \\
  1.1178 +Refine\_Problem
  1.1179 +&pblID & x & & & x & & & & x & x & & x \\
  1.1180 +Specify\_Method
  1.1181 +&metID & x & & & x & & & & x & x & & x \\
  1.1182 +Apply\_Method
  1.1183 +&metID & x & x & & x & & & & x & x & & x \\
  1.1184 +\hline
  1.1185 +\multicolumn{13}{|l|}{solve phase}\\
  1.1186 +\hline
  1.1187 +Rewrite,\_Inst
  1.1188 +&thm & x & x & & & x &met & & x &met & & \\
  1.1189 +Rewrite, Detail
  1.1190 +&thm & x & x & & & x &rls & & x &rls & & \\
  1.1191 +Rewrite, Detail
  1.1192 +&thm & x & x & & & x &Rrls & & x &Rrls & & \\
  1.1193 +Rewrite\_Set,\_Inst
  1.1194 +&rls & x & x & & & & & x & x & x & & \\
  1.1195 +Calculate
  1.1196 +&op & x & x & & & & & & & & x & \\
  1.1197 +Substitute
  1.1198 +&subs & x & & & x & & & & & & & \\
  1.1199 +& & & & & & & & & & & & \\
  1.1200 +SubProblem
  1.1201 +&spec & x & x & & x & & & & x & x & & x \\
  1.1202 +&fmz & & & & & & & & & & & \\
  1.1203 +\hline
  1.1204 +\end{tabular}\end{center}\end{table}
  1.1205 +
  1.1206 +
  1.1207 +\section{Die theories von \isac{}}
  1.1208 +Die theories von \isac{} basieren auf den theories f\"ur HOL und Real von Isabelle. Diese theories haben eine spezielle Form, die durch die Endung {\tt *.thy} gekennzeichnet sind; normalerweise werden diese theories zusammen mit SML verwendet. Dann haben sie den selben Dateinamen, aber die Endung {\tt *.ML}.
  1.1209 +Die theories von \isac{} representieren den Teil vom Basiswissen von \isac{}, die hierachy von den zwei theories ist nach diesen strukturiert. Die {\tt *.ML} Dateien beinhalten {\em alle} Daten von den anderen zwei Hauptlinien des Basiswissens, die problems und methods (ohne ihre jeweilige Struktur, die von den problem Browsern und den method Browsern gemacht wird, zu pr\"asentieren.
  1.1210 +Die Tab.\ref{theories} auf Seite \pageref{theories} listet die base theories auf, die geplant sind in der Version \isac{} 1 angewendet zu werden. Wir erwarten, dass die Liste erweitert wird in n\"aherer Zukunft, und wir werden uns auch den theorie Browser genauer ansehen.
  1.1211 +Die ersten drei theories auf der Liste geh\"oren {\em nicht} zum Grundwissen von \isac{}; sie besch\"aftigen sich mit der Skriptsprache f\"ur methods und ist hier nur zur Vollst\"andigkeit angef\"uhrt.
  1.1212 +
  1.1213 +{\begin{table}[h]
  1.1214 +\caption{theory von der ersten Version von \isac} \label{theories}
  1.1215 +%\tabcolsep=0.3mm
  1.1216 +\begin{center}
  1.1217 +\def\arraystretch{1.0}
  1.1218 +\begin{tabular}{lp{9.0cm}}
  1.1219 +theory & Beschreibung \\
  1.1220 +\hline
  1.1221 +&\\
  1.1222 +ListI.thy
  1.1223 +& ordnet die Bezeichnungen den Funktionen, die in {\tt Isabelle2002/src/HOL/List.thy} sind, zu und (intermediatly~?) definiert einige weitere Listen von Funktionen\\
  1.1224 +ListI.ML
  1.1225 +& {\tt eval\_fn} f\"ur die zus\"atzliche Listen von Funktionen\\
  1.1226 +Tools.thy
  1.1227 +& Funktion, die f\"ur die Auswertung von Skripten ben\"otigt wird\\
  1.1228 +Tools.ML
  1.1229 +& bezieht sich auf {\tt eval\_fn}s\\
  1.1230 +Script.thy
  1.1231 +& Vorraussetzung f\"ur script: types, tactics, tacticals\\
  1.1232 +Script.ML
  1.1233 +& eine Reihe von tactics und Funktionen f\"ur den internen Gebrauch\\
  1.1234 +& \\
  1.1235 +\hline
  1.1236 +& \\
  1.1237 +Typefix.thy
  1.1238 +& fortgeschrittener Austritt, um den type Fehlern zu entkommen\\
  1.1239 +Descript.thy
  1.1240 +& {\it Beschreibungen} f\"ur die Formeln von {\it Modellen} und {\it Problemen}\\
  1.1241 +Atools
  1.1242 +& Neudefinierung von Operatoren; allgemeine Eigenschaften und Funktionen f\"ur Vorraussetzungen; theorems f\"ur {\tt eval\_rls}\\
  1.1243 +Float
  1.1244 +& Gleitkommerzahlendarstellung\\
  1.1245 +Equation
  1.1246 +& grunds\"atzliche Vorstellung f\"ur  Gleichungen und Gleichungssysteme\\
  1.1247 +Poly
  1.1248 +& Polynome\\
  1.1249 +PolyEq
  1.1250 +& polynomiale Gleichungen und Gleichungssysteme \\
  1.1251 +Rational.thy
  1.1252 +& zus\"atzliche theorems f\"ur Rationale Zahlen\\
  1.1253 +Rational.ML
  1.1254 +& abbrechen, hinzuf\"ugen und vereinfachen von Rationalen Zahlen durch Verwenden von (einer allgemeineren Form von) Euclids Algorithmus; die entsprechenden umgekehrten Regels\"atze\\
  1.1255 +RatEq
  1.1256 +& Gleichung mit rationalen Zahlen\\
  1.1257 +Root
  1.1258 +& Radikanten; berechnen der Normalform; das betreffende umgekehrte Regelwerk\\
  1.1259 +RootEq
  1.1260 +& Gleichungen mit Wurzeln\\
  1.1261 +RatRootEq
  1.1262 +& Gleichungen mit rationalen Zahlen und Wurzeln (z.B. mit Termen, die beide Vorg\"ange enthalten)\\
  1.1263 +Vect
  1.1264 +& Vektoren Analysis\\
  1.1265 +Trig
  1.1266 +& Trigonometrie\\
  1.1267 +LogExp
  1.1268 +& Logarithmus und Exponentialfunktionen\\
  1.1269 +Calculus
  1.1270 +& nicht der Norm entsprechende Analysis\\
  1.1271 +Diff
  1.1272 +& Differenzierung\\
  1.1273 +DiffApp
  1.1274 +& Anwendungen beim Differenzieren (Maximum-Minimum-Probleme)\\
  1.1275 +Test
  1.1276 +& (alte) Daten f\"ur Testfolgen\\
  1.1277 +Isac
  1.1278 +& enth\"alt alle Theorien von\isac{}\\
  1.1279 +\end{tabular}\end{center}\end{table}}
  1.1280 +
  1.1281 +
  1.1282 +\section{Daten in {\tt *.thy} und {\tt *.ML}}
  1.1283 +Wie schon zuvor angesprochen, haben die Arbeiten die theories von *.thy und *.ML zusammen und haben deswegen den selben Dateiname. Wie diese Daten zwischen den zwei Dateien verteilt werden wird in der
  1.1284 +Tab.\ref{thy-ML} auf Seite \pageref{thy-ML} gezeigt. Die Ordnung von den Datenteilchen in den theories sollte an der Ordnung von der Liste festhalten.
  1.1285 +
  1.1286 +{\begin{table}[h]
  1.1287 +\caption{Daten in {\tt *.thy}- und {\tt *.ML}-files} \label{thy-ML}
  1.1288 +\tabcolsep=2.0mm
  1.1289 +\begin{center}
  1.1290 +\def\arraystretch{1.0}
  1.1291 +\begin{tabular}{llp{7.7cm}}
  1.1292 +Datei & Daten & Beschreibung \\
  1.1293 +\hline
  1.1294 +& &\\
  1.1295 +{\tt *.thy}
  1.1296 +& consts
  1.1297 +& Operatoren, Eigenschaften, Funktionen und Skriptnamen ('{\tt Skript} Name \dots{\tt Argumente}')
  1.1298 +\\
  1.1299 +& rules
  1.1300 +& theorems: \isac{} verwendet theorems von Isabelle, wenn m\"oglich; zus\"atzliche theorems, die jenen von Isabelle entsprechen, bekommen ein {\it I} angeh\"angt
  1.1301 +\\& &\\
  1.1302 +{\tt *.ML}
  1.1303 +& {\tt theory' :=}
  1.1304 +& Die theory, die 
  1.1305 +abgegrenzt ist von der {\tt *.thy}-Datei, wird durch \isac{} zug\"anglich gemacht
  1.1306 +\\
  1.1307 +& {\tt eval\_fn}
  1.1308 +& die Auswertungsfunktion f\"ur die Operatoren und Eigenschaften, kodiert im meta-Level (SML); die Bezeichnugn von so einer Funktion ist eine Kombination von Schl\"usselw\"ortern {\tt eval\_} und einer Bezeichnung von der Funktion, die in in {\tt *.thy} erkl\"art ist
  1.1309 +\\
  1.1310 +& {\tt *\_simplify}
  1.1311 +& der automatisierte Vereinfacher f\"ur die tats\"achliche Theorie, z.B. die Bezeichnung von diesem Regelwerk ist eine Kombination aus den Theorienbezeichnungen und dem Schl\"usselwort {\tt *\_simplify}
  1.1312 +\\
  1.1313 +& {\tt norm\_rls :=}
  1.1314 +& der automatisierte Vereinfacher {\tt *\_simplify} wird so aufgehoben, dass er \"uber \isac{}  zug\"anglich ist
  1.1315 +\\
  1.1316 +& {\tt rew\_ord' :=}
  1.1317 +& das Gleiche f\"ur die Anordnung des Rewriting, wenn es ausserhalb eines speziellen Regelwerks gebraucht wird
  1.1318 +\\
  1.1319 +& {\tt ruleset' :=}
  1.1320 +& dasselbe wie f\"ur Regels\"atze (gew\"ohnliche Regels\"atze, umgekehrte Regels\"atze, und {\tt eval\_rls})
  1.1321 +\\
  1.1322 +& {\tt calc\_list :=}
  1.1323 +& dasselbe f\"ur {\tt eval\_fn}s, wenn es ausserhalb eines bestimmten Regelwerks gebraucht wird (wenn es ausserhalb eines bestimmten Regelwerks ben\"otigt wird) (z.B. f\"ur eine tactic {\tt Calculate} in einem Skript)
  1.1324 +\\
  1.1325 +& {\tt store\_pbl}
  1.1326 +& Problems, die in {\tt *.ML}-Dateien definiert sind, werden zug\"anglich f\"ur \isac{}
  1.1327 +\\
  1.1328 +& {\tt methods :=}
  1.1329 +& methods, die in {\tt *.ML}-Dateien definiert sind werden zug\"anglich f\"ur \isac{}
  1.1330 +\\
  1.1331 +\end{tabular}\end{center}\end{table}}
  1.1332 +
  1.1333 +\section{Formale Beschreibung der Hierarchie von Problemen}
  1.1334 +
  1.1335 +\section{Skripttaktiken}
  1.1336 +Tats\"achlich sind es die tactics, die die Berechnungen vorantreiben: im Hintergrund bauen sie den proof tree und sie \"ubernehmen die wichtigsten Aufgaben w\"ahrend der Auswertung bei der der ''script-interpreter`` zur Steuerung des Benutzers transferiert wird. Hier beschreiben wir nur den Syntax von tactics; die Semantik ist beschrieben etwas weiter unten im Kontext mit tactics, die die Benutzer/Innen dieses Programmes verwenden: Es gibt einen Schriftverkehr zwischen den user-tactics und den script tactics.
  1.1337 +
  1.1338 +
  1.1339 +
  1.1340 +\part{Authoring on the knowledge}
  1.1341 +
  1.1342 +
  1.1343 +\section{Add a theorem}
  1.1344 +\section{Define and add a problem}
  1.1345 +\section{Define and add a predicate}
  1.1346 +\section{Define and add a method}
  1.1347 +\section{}
  1.1348 +\section{}
  1.1349 +\section{}
  1.1350 +\section{}
  1.1351 +
  1.1352 +
  1.1353 +
  1.1354 +\newpage
  1.1355 +\bibliography{bib/isac,bib/from-theses}
  1.1356 +
  1.1357 +\end{document}