doc-src/isac/mlehnfeld/projektbericht.tex
author Walther Neuper <neuper@ist.tugraz.at>
Tue, 31 May 2011 10:15:29 +0200
branchdecompose-isar
changeset 42039 9b04517e3f28
parent 42038 59b7fd45b037
child 42040 5ab4b0443259
permissions -rw-r--r--
contribution of Mathias Lehnfeld finished
     1 \documentclass[a4paper,12pt]{article}
     2 %
     3 \usepackage[ngerman]{babel}
     4 \usepackage[utf8]{inputenc}
     5 \usepackage{ngerman}
     6 \usepackage{graphicx}
     7 \bibliographystyle{alpha}
     8 
     9 \def\isac{${\cal I}\mkern-2mu{\cal S}\mkern-5mu{\cal AC}$}
    10 \def\sisac{\footnotesize${\cal I}\mkern-2mu{\cal S}\mkern-5mu{\cal AC}$}
    11 
    12 \begin{document}
    13 
    14 \title{\Large {\bf Verbindung von 'Computation' und 'Deduction' im \isac{}-System}\\~\\
    15 	Projektpraktikum am Institut für Computersprachen,\\Technische Universit\"at Wien\\
    16 \vspace{0.7cm}
    17 \large{Betreuer: Univ.-Prof. Dr. Jens Knoop}}
    18 \author{Mathias Lehnfeld\\
    19 	{\tt mathias.lehnfeld@gmx.at}}
    20 %pdflatex creates an empty page 1 and the titlepage on page 2 ?!?...
    21 %\thanks{Betreuer: Univ.-Prof. Dr. Jens Knoop, Technische Universit\"at Wien\\
    22 %        Dr. Walther Neuper, Technische Universit\"at Graz}
    23 \date{30. Mai 2011}
    24 \maketitle
    25 \clearpage
    26 \tableofcontents
    27 \clearpage
    28 
    29 
    30 \section{Zur Aufgabenstellung}
    31 Das \sisac{}-Projekt entwickelt einen {\it math assistant} aufbauend auf den
    32 {\it theorem prover} Isabelle. Der Kern des \sisac{}-Systems ist ein
    33 {\it Lucas-Interpreter}, der automatisch Benutzerführung für schrittweises
    34 Problemlösen erzeugt: Der nächste Schritt wird von einem Programm
    35 berechnet ({\it computation}); {\it deduction} wird gefordert, wenn der Benutzer
    36 eine Formel eingibt (die Ableitbarkeit der Formel aus dem {\it context} ist
    37 zu beweisen).\\
    38 \\
    39 Die Aufgabenstellung im Rahmen des Projektpraktikums besteht darin, das
    40 in Isabelle verfügbare Konzept {\it context} in den Lucas-Interpreter
    41 einzubauen. Dies schließt grundlegende Design-Überlegungen ein, verlangt
    42 tiefes Eindringen in den umfangreichen Code von zwei Softwareprodukten,
    43 {\it Isabelle} und \sisac{} und bedeutet daher Zusammenarbeit mit den jeweiligen
    44 Entwicklerteams.\\
    45 \\
    46 Ein erfolgreicher Einbau der Isabelle-{\it context}s in den
    47 Lucas-Interpreter wird \sisac{}s Fähigkeit, Benutzereingaben zu
    48 interpretieren, wesentlich erweitern: {\it context}s stellen Isabelles
    49 automatischen Beweisern die notwendigen Daten bereit.
    50 
    51 
    52 \section{Planung des Projektes}
    53 \subsection{Ist-Zustand vor dem Projekt}
    54 Das Isabelle Konzept der {\it context}s findet derzeit in \sisac{} noch keine Verwendung. Dadurch entstehen gewisse Einschränkungen bezüglich der Interpretation durch den Lucas-Interpreter, weil Rechenschritte nicht unter Berücksichtigung aller Faktoren ihres Kontexts betrachtet werden können. Derzeit werden Zusicherungen und Umgebungsdaten in einer \sisac{}-spezifischen Datenstruktur verwaltet, die Zugriffe auf Isabelles Prover nicht direkt unterstützen.
    55 
    56 \subsection{Geplanter Soll-Zustand nach dem Projekt}
    57 \sisac{}s Lucas-Interpreter ist nun schlanker und nimmt Isabelles {\it context}s bei der Interpretation von Benutzereingaben in Anspruch. Spezifikationen werden mit Isabelles eigenen Datenstrukturen verwaltet. Zusicherungen und Typen von Variablen werden im Lucas-Interpreter in {\it context}s behandelt.
    58 
    59 \subsection{Zeitplanung f\"ur das Projekt}
    60 Die Planung f\"ur das Projekt sah folgende Meilensteine vor (Details siehe \ref{ms-desc}):
    61 \begin{enumerate}
    62 \item \textbf{Voraussetzungen zum Arbeitsbeginn schaffen} (10.02. -- 18.02.)
    63   %Beschreibung siehe \ref{ms1_desc}
    64 \item \textbf{\isac{} auf die letzte Isabelle-Release updaten} (21.02. -- 25.02.)
    65   %Beschreibung siehe \ref{ms2_desc}
    66 \item \textbf{Parsen aus \textit{contexts}} (28.02. -- 04.03.)
    67   %Beschreibung siehe \ref{ms3_desc}
    68 \item \textbf{Spezifikationsphase mit \textit{context}s} (07.03. -- 11.03.)
    69   %Beschreibung siehe \ref{ms4_desc}
    70 \item \textbf{L\"osungsphase mit \textit{context}s} (14.03. -- 18.03.)
    71   %Beschreibung siehe \ref{ms5_desc}
    72 \end{enumerate}
    73 
    74 \section{Konzepte und L\"osungen}
    75 \subsection{Architektur von \isac}
    76 Die Grafik auf Seite \pageref{architektur} gibt einen \"Uberblick \"uber die Architektur von \sisac:
    77 
    78 \begin{figure} [htb]
    79 \begin{center}
    80     \includegraphics[width=120mm]{overview.pdf}
    81 \end{center}
    82 \caption{Lucas-interpreter und Isabelle}
    83 \label{architektur}
    84 \end{figure}
    85 Die Mathematik-Engine von \sisac{} ist nach dem Konzept eines ``Lucas-Interpreters'' (LI) gebaut. Ein LI interpretiert drei Arten von Daten:
    86 \begin{enumerate}
    87 \item\label{spec}\textbf{Spezifikationen}: diese beschreiben ein Problem der angewandten Mathematik durch die Ein- und Ausgabedaten, die ``precondition'' (Pr\"adikate auf den Eingabedaten) und eine ``postcondition'' (eine Relation zwischen Ein- und Ausgabedaten). Spezifikationen stellen den \textit{applikations-orientierten} Aspekt der Mathematik dar.
    88 \item \textbf{Programme}: beschreiben den Algorithmus zur L\"osung des spezifizierten Problems. \sisac's Programmsprache ist funktional und hat keine Ein- oder Ausgabe-Statements \cite{plmms10}. Sie kann aber auf Funktionalit\"aten des Computer Theorem Provers (CTP) Isabelle \cite{Nipkow-Paulson-Wenzel:2002} zugreifen. Programme  stellen den \textit{algorithmischen} Aspekt der Mathematik dar.
    89 \item \textbf{Theorien}: beinhalten die Definitionen, Axiome und Theoreme, die einer bestimmten Rechnung der angewandten Mathematik zugrundeliegen. \sisac{} verwendet die ``theories'' von Isabelle in vollem Umfang. Theorien  stellen den \textit{deduktiven} Aspekt der Mathematik dar.
    90 \end{enumerate}
    91 
    92 Die Funktionalit\"at eines LI kann in kurzer Form durch die folgenden drei Anspr\"uche erkl\"art werden\footnote{siehe http://www.ist.tugraz.at/isac/index.php/Description}:
    93 
    94 \begin{enumerate}
    95 \item \textbf{Benutzereingaben pr\"ufen}: Benutzereingaben sollen so gro\3z\"ugig wie m\"oglich verarbeitet werden. Bei einem gegebenen Problem aus der angewandten Mathematik als formale Spezifikation, wird mit den jeweiligen ``preconditions'' ein ``context'' erzeugt. Nun kann ein Isabelle ``prover'' die Ableitbarkeit einer Benutzereingabe aus dem ``context'' \"uberpr\"ufen. Der ``context'' wird Schritt f\"ur Schritt durch Benutzereingaben erweitert, bis ein Ergebnis vorliegt, das beweisbar die ``postcondition'' aus der Spezifikation erf\"ullt.
    96 \item \textbf{Den Benutzer anleiten}: Wei\3 der Lernende nicht mehr weiter, so kann das System den n\"achsten Schritt vorschlagen und den Benutzer so Schritt f\"ur Schritt zum Ergebnis f\"uhren. Ein \sisac{}-Programm wird so interpretiert, wie es bei einem Debugger passiert; die Breakpoints (i.e. Schritte) sind als bestimmte Statements im Programm definiert, die notwendigerweise zum Verlauf der Rechnung bzw. deren Aufbau geh\"oren. An den Breakpoints kann der Benutzer frei entscheiden, ob er den n\"achsten Schritt generieren lassen m\"ochte oder ob er versucht, selbst weiter zu rechnen. Die Herausforderung f\"ur den \textit{Lucas-Interpreter} ist, mit beliebigen Benutzereingaben umgehen zu k\"onnen.
    97 \item \textbf{Schritte erkl\"aren}: Bei Interesse hat der Lernende Zugang zu dem Wissen, das f\"ur einen mechanisierten \textit{math assistant} zur L\"osung mathematischer Probleme von N\"oten ist: Definitionen, Axiome und Theoreme (erfasst in ``theories''\footnote{siehe http://www.ist.tugraz.at/projects/isac/www/kbase/thy/index\_thy.html}), Spezifikationen von Problemklassen\footnote{siehe z.B. http://www.ist.tugraz.at/projects/isac/www/kbase/pbl/index\_pbl.html} und Programme, um die Probleme zu l\"osen\footnote{siehe http://www.ist.tugraz.at/projects/isac/www/kbase/met/index\_met.html}. Theoretisch ist dieses Wissen ausreichend, automatisch Erkl\"arungen f\"ur die einzelnen Schritte zu generieren. Das Hintergrundwissen liegt zwar in mathematischer Formulierung vor, es ist jedoch fraglich, wie dies in eine Form gebracht werden kann, die den Lernenden nicht \"uberfordert.
    98 \end{enumerate}
    99 
   100 \subsection{Isabelles Konzept von ``contexts''}
   101 Die Beschreibung dieses bew\"ahrten Konzeptes findet sich in einem internen Papier zur Implementierung von Isabelles Beweissprache Isar \cite{isar-impl}. Isabelle stellt einen sehr generellen Funktor zur Verf\"ugung:
   102 
   103 {\tt
   104 \begin{tabbing}
   105 xx\=xx\=in\=\kill
   106 structure ContextData =  {Proof\_Data}\\
   107 \>~({type T} = term list\\
   108 \>\>{fun init \_} = []);\\
   109 \\
   110 fun insert\_assumptions asms = \\
   111 \>\>\>ContextData{.map} (fn xs => distinct (asms@xs));\\
   112 \\
   113 fun get\_assumptions ctxt = ContextData{.get} ctxt;\\
   114 \\
   115 \\
   116 val declare\_constraints : \\
   117 \>\>\>term -> Proof.context -> Proof.context
   118 \end{tabbing}
   119 }
   120 Das Einzige, was die Definition eines''contexts'' braucht, ist die Spezifikation eines Typs \textit{type T} und einer Funktion \textit{fun init \_} f\"ur den Funktor \textit{Proof\_Data}. Dieser stellt dann die Zugriffsfunktionen \textit{ContextData.map} und \textit{ContextData.get} zur Verf\"ugung.
   121 
   122 Die Funktion \textit{declare\_constraints} liefert eine wichtige Funktionalit\"at: Ein \textit{term} angewandt auf einen \textit{Proof.context} ergibt einen neuen \textit{Proof.context}, der f\"ur das Parsen von Strings verwendet werden kann:
   123 {\tt
   124 \begin{tabbing}
   125 xx\=xx\=xx\=xx\=xx\=\kill
   126 fun parseNEW ctxt str = \\
   127 \>\>\>SOME ({Syntax.read\_term ctxt} str |> numbers\_to\_string)\\
   128 \>\>\>handle \_ => NONE;
   129       \end{tabbing}
   130 }
   131 \textit{Syntax.read\_term ctxt} entnimmt dem ``context'' die Typinformation, die vorher durch \textit{declare\_constraints} zugef\"uhrt wurde. Da die \textit{fun parse} vor Beginn dieses Projektes keine ``contexts'' zur Verf\"ugung hatte, setzte sie mittels \textit{typ\_a2real} einfach alle unbestimmten Typen auf \textit{real}:
   132 {\tt
   133 \begin{tabbing}
   134 xx\=xx\=xx\=xx\=xx\=\kill
   135 fun parse thy str =\\
   136 \>(let val t = ({typ\_a2real} o numbers\_to\_string)\\
   137 \>\>\>\>({Syntax.read\_term\_global thy} str)\\
   138 \>\>in SOME (cterm\_of thy t) end)\\
   139 \>\>\>handle \_ => NONE;\\
   140       \end{tabbing}
   141 }
   142 
   143 \subsection{Die Initialisierung von ``contexts''}\label{init-ctxt}
   144 ``Contexts'' werden an zwei Stellen von Lucas-Interpretation initialisiert: am Beginn der Spezifikationsphase und zu Beginn der L\"osungsphase.
   145 
   146 \begin{enumerate}
   147 \item\label{init-ctxt-spec}{Die Spezifikations-Phase} dient der Erstellung einer formalen Spezifikation (siehe \ref{spec})\footnote{Da bekannterma\3en formales Spezifizieren schwierig ist, kann es durch entsprechende Dialog-Einstellung dem LI \"uberlassen werden.}. Der ``context'' wird mittels \textit{declare\_constraints} mit den Typdeklarationen aller vorkommenden Variablen initialisiert.
   148 
   149 Im Falle eines Rootproblems kommen die Variablen von einer ``formalization'', einer Kurzbeschreibung der Eingabedaten durch einen Autor. Im Falle eines Subproblems kommen die Variablen von den ``actual arguments'' des Subprogrammes.
   150 
   151 \item\label{init-ctxt-solve}{Die L\"osungsphase} erzeugt die Rechenschritte aus dem spezifizierten Programm. Zu Beginn der Interpretation des Programmes wird der ``context'' initialisiert mit
   152   \begin{enumerate}
   153   \item den Typdeklarationen aller in der Spezifikation vorkommenden Variablen mittels \textit{declare\_constraints}
   154   \item den ``preconditions'' des (interaktiv oder automatisch) spezifizierten Programmes, genauer: mit den ``preconditions'' des zugeh\"origen Guards, der meist gleich der Spezifikation ist
   155   \end{enumerate}
   156 \end{enumerate}
   157 
   158 
   159 \subsection{Aufbau von ``contexts'' in der Interpretation}\label{partiality}
   160 W\"ahrend der Interpretation eines Programmes baut der Lucas-Interpreter einen ``context'' auf, indem er alle relevanten ``preconditions'', andere Pr\"adikate -- insbesondere ``partiality conditions'' -- einsammelt. Eine ``partiality condition'' ist zum Beispiel $x\not=0$, die eine Division durch $0$ verhindert.
   161 
   162 Am Ende eines Programmes soll der ``context'' hinreichend logische Information enthalten, sodass Isabelles automatische Beweiser die ``postcondition'' automatisch beweisen k\"onnen (das ist eine k\"unftige Entwicklungsaufgabe!).
   163 
   164 \subsection{Transfer von ``contexts'' aus Subprogrammen}\label{transfer}
   165 ``contexts'' folgen den \"ublichen Scope-Regeln von Programmsprachen mit Blockstruktur, wie schon die Initialisierung von ``contexts'' gezeigt hat. Die Behandlung von ``contexts'' bei der R\"uckkehr aus Subprogrammen erfolgt durch folgende Funktionen:
   166 {\tt
   167 \begin{tabbing}
   168 xx\=xx\=xx\=xx\=xx\=\kill
   169 fun transfer\_asms\_from\_to from\_ctxt to\_ctxt =\\
   170 \>  let\\
   171 \>\>    val to\_vars = get\_assumptions to\_ctxt |> map vars |> flat\\
   172 \>\>    fun transfer [] to\_ctxt = to\_ctxt\\
   173 \>\>\>      | transfer (from\_asm::fas) to\_ctxt =\\
   174 \>\>\>\>\>          if inter op = (vars from\_asm) to\_vars = []\\
   175 \>\>\>\>\>         then transfer fas to\_ctxt\\
   176 \>\>\>\>\>          else transfer fas (insert\_assumptions [from\_asm] to\_ctxt)\\
   177 \>  in transfer (get\_assumptions from\_ctxt) to\_ctxt end\\
   178       \end{tabbing}
   179 }
   180 Folgende Daten werden aus dem Sub-``context'' in den ``context'' des aufrufenden Programmes zur\"uckgegeben:
   181 \begin{enumerate}
   182 \item die R\"uckgabewerte des Subprogrammes, sofern sie vom Typ \textit{bool} sind
   183 \item alle \textit{assumptions}, die eine Variable enthalten, die auch einer der R\"uckgabewerte enth\"alt
   184 \item alle \textit{assumptions}, die eine Variable enthalten, die in einem Term des aufrufenden Programmes enthalten sind\footnote{in diesem Punkt sind die Scope-Regeln schw\"acher als sonst bei Subprogrammen}
   185 \begin{tabbing}
   186 xxx\=xxx\=\kill
   187      \`$\mathit{(some)}\;\mathit{assumptions}$\\
   188 $\mathit{solve}\;(\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}, x)$\\
   189 %     \`$x ^ 2 - 6 * x + 9\not=0\land x ^ 2 - 3 * x\not=0$\\
   190 %\>$\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}$ \\ \\
   191 %\>$\frac{x}{x ^ 2 + -1 * (6 * x) + 9} + \frac{-1 * 1}{x ^ 2 + -1 * (3 * x)} = \frac{1}{x}$ \\ \\
   192 \>$\frac{3 + -1 * x + x ^ 2}{9 * x + -6 * x ^ 2 + x ^ 3} = \frac{1}{x}$ \\ 
   193      \`$x\not=3\land x\not=0$\\
   194 \>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   195 \>$\mathit{solve}\;((3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3), x)$ \\
   196 %\>\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   197 %\>\>$(3 + -1 * x + x ^ 2) * x - 1 * (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   198 \>\>$(3 + -1 * x + x ^ 2) * x - (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   199 \>\>$-6 * x + 5 * x ^ 2 = 0$ \\
   200 \>\>$\mathit{solve}\;(-6 * x + 5 * x ^ 2 = 0, x)$ \\
   201 \>\>$[x = 0, x = \frac{6}{5}]$ \\
   202      \`$x = 0\land x = \frac{6}{5}$\\
   203 \>$[{x = 0}, x = \frac{6}{5}]$ \\
   204      \`{$\mathit{Check\_Elementwise}\;\mathit{Assumptions}:x\not=0\land x = 0$}\\
   205 \>$[x = \frac{6}{5}]$ \\
   206 $[x = \frac{6}{5}]$
   207 \end{tabbing}
   208 der Unterschied begr\"undet sich darin, dass Rechnungen vorzugsweise mit Variablennamen vorgehen, die block\"ubergreifend g\"ultig sind.
   209 \item\label{conflict} \textbf{nicht zur\"uckgegeben} werden R\"uckgabewerte des Subprogrammes dann, wenn sie im Widerspruch zum ``context'' des aufrunfenden Programmes stehen. Hier ist ein Beispiel:
   210 \end{enumerate}
   211 
   212 \begin{tabbing}
   213 xxx\=xxx\=\kill
   214      \`$\mathit{(some)}\;\mathit{assumptions}$\\
   215 $\mathit{solve}\;(\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}, x)$\\
   216      \`$x ^ 2 - 6 * x + 9\not=0\land x ^ 2 - 3 * x\not=0$\\
   217 \>$\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}$ \\ \\
   218 \>$\frac{x}{x ^ 2 + -1 * (6 * x) + 9} + \frac{-1 * 1}{x ^ 2 + -1 * (3 * x)} = \frac{1}{x}$ \\ \\
   219 \>$\frac{3 + -1 * x + x ^ 2}{9 * x + -6 * x ^ 2 + x ^ 3} = \frac{1}{x}$ \\ 
   220      \`$x\not=3\land x\not=0$\\
   221 \>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   222 \>$\mathit{solve}\;((3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3), x)$ \\
   223 \>\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   224 \>\>$(3 + -1 * x + x ^ 2) * x - 1 * (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   225 \>\>$(3 + -1 * x + x ^ 2) * x - (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   226 \>\>$-6 * x + 5 * x ^ 2 = 0$ \\
   227 \>\>$\mathit{solve}\;(-6 * x + 5 * x ^ 2 = 0, x)$ \\
   228 \>\>$[x = 0, x = \frac{6}{5}]$ \\
   229      \`$x = 0\land x = \frac{6}{5}$\\
   230 \>$[{x = 0}, x = \frac{6}{5}]$ \\
   231      \`{$\mathit{Check\_Elementwise}\;\mathit{Assumptions}:x\not=0\land x = 0$}\\
   232 \>$[x = \frac{6}{5}]$ \\
   233 $[x = \frac{6}{5}]$
   234 \end{tabbing}
   235 Aufgrund von Punkt \ref{conflict}. oben wird es m\"oglich, aus dem Programm, das obige Rechnung erzeugt, das Statement \textit{Check\_Elementwise Assumptions} zu streichen:
   236 {\tt
   237 \begin{tabbing}
   238 xx\=xx\=xx\=xx\=xx\=xx\=\kill
   239 Script Solve\_root\_equation (e\_e::bool) (v\_v::real) =      \\
   240 \> (let e\_e = ((Try (Rewrite\_Set norm\_equation False)) \@\@   \\
   241 \>\>\>            (Try (Rewrite\_Set Test\_simplify False))) e\_e; \\
   242 \>\>     (L\_L::bool list) =                                   \\
   243 \>\>\>            (SubProblem (Test',                           \\
   244 \>\>\>\>                         [linear,univariate,equation,test]\\
   245 \>\>\>\>                         [Test,solve\_linear])             \\
   246 \>\>\>\>                        [BOOL e\_e, REAL v\_v])             \\
   247 \>  in {Check\_Elementwise L\_L \{(v\_v::real). Assumptions\}})\\      
   248 \end{tabbing}
   249 }
   250 Hiermit geht die Entwicklung des Konzeptes von Lucas-Interpretation einen Schritt in die begonnene Richtung weiter, die Verschiebung des Programmieraufwandes von ``computation'' (im herk\"ommlichen Programmieren) auf ``deduction'' (im Spezifizieren von Programmeigenschaften) zu unterst\"utzen.
   251 
   252 \subsection{\"Uberblick: ``contexts'' bei Lucas-Interpretation}
   253 
   254 Im Folgenden betrachten wir ein Bespiel für die Lösung einer Aufgabe durch \sisac. Die gegebenen Codeausschnitte sind nur Teile des gesamten Programmes. Der vollständige Code befindet sich in Anhang \ref{demo-code}.
   255 
   256 \paragraph{Formulierung der Aufgabenstellung und Spezifikation}~\\
   257 
   258 Erklärung siehe \ref{init-ctxt-spec}.
   259 \begin{verbatim}
   260 val fmz = ["equality (x+1=(2::real))", "solveFor x", "solutions L"];
   261 val (dI',pI',mI') =
   262   ("Test", ["sqroot-test","univariate","equation","test"],
   263    ["Test","squ-equ-test-subpbl1"]);
   264 val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
   265 \end{verbatim}
   266 \textit{fmz} enthält also die zwei Eingabegrößen und die gesuchte Ausgabegröße, also die Liste aller Lösungen für \textit{x} in der Gleichung $x + 1 = 2$. Die zweite Zeile definiert den Namen der ``theory'' mit dem deduktiven Hintergrundwissen, die Spezifikation in Form einer Liste und das zu verwendende Programm.\\
   267 \textit{CalcTreeTEST} erzeugt schlie\3lich die grundlegenden Datenstrukturen für die folgenden Berechnungen. Beispielsweise wird ein ``context'' erzeugt, der nun im Baum \textit{pt} an der Position \textit{p} steht.
   268 \begin{verbatim}
   269 val ctxt = get_ctxt pt p;
   270 val SOME known_x = parseNEW ctxt "x + y + z";
   271 val SOME unknown = parseNEW ctxt "a + b + c";
   272 \end{verbatim}
   273 Dies erzeugt folgenden Output:
   274 \begin{verbatim}
   275 val ctxt = <context>: Proof.context
   276 val known_x =
   277    Const ("Groups.plus_class.plus",
   278        "RealDef.real => RealDef.real => RealDef.real") $
   279      (Const ("Groups.plus_class.plus",
   280          "RealDef.real => RealDef.real => RealDef.real") $
   281        Free ("x", "RealDef.real") $ Free ("y", "RealDef.real")) $
   282      Free ("z", "RealDef.real"):
   283    term
   284 val unknown =
   285    Const ("Groups.plus_class.plus", "'a => 'a => 'a") $
   286      (Const ("Groups.plus_class.plus", "'a => 'a => 'a")
   287        $ Free ("a", "'a") $ Free ("b", "'a")) $
   288      Free ("c", "'a"):
   289    term
   290 \end{verbatim}
   291 Der Output dieser Zeilen zeigt die neue Funktionalität anhand der Erkennung des Typs \textit{real} für die Variablen \textit{x}, \textit{y} und \textit{z} mittels Typinferenz, im Gegensatz zu den Unbekannten \textit{a}, \textit{b} und \textit{c} (unbekannter Typ \textit{'a}.
   292 
   293 \paragraph{Beginn der Interpretation}~\\
   294 
   295 Nach einigen Schritten der Mathematik-Engine ist die Spezifikationsphase beendet und die Interpretation des Programmes kann beginnen. Die ``precondition'' ist in den Assumptions enthalten:
   296 \begin{verbatim}
   297 get_assumptions_ pt p |> terms2strs
   298 \end{verbatim}
   299 Output:
   300 \begin{verbatim}
   301 val it = ["precond_rootmet x"]: string list
   302 \end{verbatim}
   303 
   304 \paragraph{Bearbeitung eines Subproblems}~\\
   305 
   306 Einige Ausführungsschritte später startet der Interpreter mit der Gleichung $-1 + x = 0$ ein Subproblem, beginnt dort wiederum mit Spezifikationsphase und setzt mit der Lösungsphase fort.\\
   307 In einem Zwischenschritt bestehen die lokalen Assumptions aus der Annahme, dass die Gleichung mit der Gleichheitsregel zu matchen ist:
   308 \begin{verbatim}
   309 ["matches (?a = ?b) (-1 + x = 0)"]: string list
   310 \end{verbatim}
   311 Nach künstlichem Einfügen zweier Assumptions und Beendigung des Subproblems steht eine Lösung für \textit{x} in den Assumptions:\\
   312 \texttt{[\dq{}matches (?a = ?b) (-1 + x = 0)\dq{}, \dq{}x < sub\_asm\_out\dq{}, \dq{}{\bf x = 1}\dq{}, \dq{}precond\_rootmet x\dq{}]: string list}\\
   313 \\
   314 Bei der Rückkehr aus dem Subproblem könnte eine erzeugte Lösung aufgrund einer Bedingungsverletzung wieder wegfallen, hier ist das nicht der Fall. Die Überprüfung dieser Bedingungen (siehe \ref{partiality}) geschieht beim Transfer des lokalen ``contexts'' in den übergeordneten (hier der des Rootproblems, siehe \ref{transfer}).
   315 
   316 \paragraph{Abschluss der Berechnung}~\\
   317 
   318 Nach den letzten Aufrufen der Mathematik-Engine stehen alle Schritte fest:
   319 \begin{verbatim}[
   320 (([], Frm), solve (x + 1 = 2, x)),
   321 (([1], Frm), x + 1 = 2),
   322 (([1], Res), x + 1 + -1 * 2 = 0),
   323 (([2], Res), -1 + x = 0),
   324 (([3], Pbl), solve (-1 + x = 0, x)),
   325 (([3,1], Frm), -1 + x = 0),
   326 (([3,1], Res), x = 0 + -1 * -1),
   327 (([3,2], Res), x = 1),
   328 (([3], Res), [x = 1]),
   329 (([4], Res), [x = 1]),
   330 (([], Res), [x = 1])] 
   331 \end{verbatim}
   332 
   333 \section{Beschreibung der Meilensteine}\label{ms-desc}
   334 \subsection{Voraussetzungen zum Arbeitsbeginn schaffen}\label{ms1_desc}
   335 Die Komplexit\"at \sisac{}s, welches auf Konzepten von Isabelle aufbaut und die tief ins System eingreifenden Ver\"anderungen in den bevorstehenden Meilensteinen machen eine intensive Auseinandersetzung mit Isabelle, insbesondere mit dem Konzept der ``contexts'', und dem \sisac-Code notwendig. Darunter fallen neben dem Lesen von Dokumentationen auch die gezielte Suche von Anwendungsf\"allen im bestehenden Code, sowie das Studieren von Coding Standards und ein Vertrautmachen mit den im \sisac-Team \"ublichen Workflows.
   336 
   337 \subsection{\isac{} auf die letzte Isabelle-Release updaten}\label{ms2_desc}
   338 Die Arbeit mit den Isabelle {\it context}s wird Anfragen in isabelle-dev@
   339 erfordern. isabelle-dev@ beantwortet Fragen i.A. nur f\"ur die aktuelle
   340 Release. Überraschenderweise wurde zwei Wochen vor Beginn des Projektpraktikums eine neue Release
   341 veröffentlicht. Daher muss auf diese vor Arbeitsbeginn upgedatet werden.
   342 
   343 \subsection{Parsen aus {\it context}s}\label{ms3_desc}
   344 Bisher nahm \sisac{} für jede Variable den Typ {\it real} an. Variablen, Terme und Pr\"adikate sollen nun beim ersten Auftreten im {\it context} eingetragen werden. User-Input wird mithilfe des {\it context}s mittels Typinferenz typgerecht geparst. Die Verwendungen der bestehenden \textit{parse}-Funktion m\"ussen im ganzen System ersetzt und angepasst werden.
   345 
   346 \subsection{Spezifikationsphase mit {\it context}s}\label{ms4_desc}
   347 \sisac{} sah für die Spezifikation eine Datenstruktur vor, die interaktives Spezifizieren effizient unterstützt. Diese Datenstruktur soll nun durch {\it context}s ersetzt werden. Dadurch ist die bisherige Fixierung auf {\it real} aufgehoben und beliebige Typen werden fehlerfrei behandelt. Dieser Schritt macht weitere Eingriffe in grundlegende Funktionen und Datenstrukturen des Systems notwendig.
   348 
   349 \subsection{L\"osungsphase mit {\it context}s}\label{ms5_desc}
   350 Der Lucas-Interpreter speicherte Assumptions (precondition, partiality conditions, etc.) in einer eigenen Datenstruktur im Rechenbaum. Nun sollen Assumptions im {\it context} verwaltet werden. Dazu sind Schreib- und Lesefunktionen zu implementieren und alle Verwendungen von Assumptions entsprechend anzupassen.
   351 
   352 \section{Bericht zum Projektverlauf}
   353 
   354 \subsection{Voraussetzungen zum Arbeitsbeginn schaffen}
   355 Die Größe der Projekte {\it Isabelle} und \sisac{} sowie deren Abgrenzung haben den Weg zu meinem schließlichen Verständnis der Aufgabenstellung etwas langwierig gestaltet. Dazu kamen nicht geplante, organisatorische Vorbereitungen, wie die Erstellung einer Projektbeschreibung und des -planes. Die lange Vorbereitung hat sich aber positiv auf den weiteren Verlauf des Projektes ausgewirkt.
   356 
   357 \subsection{\isac{} auf die letzte Isabelle-Release updaten}
   358 Da die Veröffentlichung der {\it Isabelle}-Version 2009-2 noch nicht lange zurück lag, kam {\it Isabelle2011} mit vielen grundlegenden Änderungen im System kurz vor Projektbeginn sehr überraschend. Die Mailingliste der Entwickler beantwortet nur Fragen zur aktuellen Release, weshalb ein entsprechendes Update von \sisac{} vor Arbeitsbeginn notwendig war.\\
   359 Dieser Arbeitsschritt beanspruchte wesentlich mehr Zeit als ursprünglich geplant. Als \sisac{} schließlich erfolgreich kompilierte funktionierte eine große Zahl der Tests nicht mehr. Dies machte die selbstständige Arbeit für mich vorerst unmöglich. Ich konnte jedoch in persönlicher Zusammenarbeit mit Walther Neuper meine Fähigkeiten einbringen. Die Notwendigkeit dieser persönlichen Zusammenarbeit verzögerte den Projektverlauf.
   360 
   361 \subsection{Parsen aus {\it context}s}
   362 In diesem Schritt konnte ich besonders Syntax und Funktionsweise von StandardML, die praktischen, {\it Isabelle}-eigenen Operatoren und die Arbeitsweise mit der Entwicklungsumgebung kennen lernen. Dieser Meilenstein konnte in recht kurzer Zeit abgeschlossen werden.
   363 
   364 \subsection{Spezifikationsphase mit {\it context}s}
   365 Hier konnte ich sehr viel selbstständig arbeiten. Zu Beginn verlief alles völlig problemlos, die Suche nach einem bestimmten Fehler beanspruchte dann aber mit Abstand die meiste Zeit, hatte jedoch zur Folge, dass ich mich sehr intensiv mit dem System auseinandersetzen musste und damit einige Kernfunktionen kennen und verstehen lernte und teilweise sogar etwas optimieren konnte.
   366 Insgesamt verlief diese Phase trotz der langwierigen Fehlersuche nicht viel langsamer als geplant.
   367 
   368 \subsection{L\"osungsphase mit {\it context}s}
   369 Die Integration von {\it context}s in die Lösungsphase zur Ersetzung der ursprünglichen behandlung von Assertions konnte in enger Zusammenarbeit mit Herrn Neuper fertiggestellt werden, persönliche Termine auf beiden Seiten verlängerten aber den zeitlichen Verlauf. Der Code des Lucas-Interpreters ist jetzt sauberer und die Logik vereinfacht.
   370 
   371 
   372 \section{Abschließende Bemerkungen}
   373 Rückblickend betrachte ich das Projektpraktikum als sehr positive Erfahrung, da ich das Gefühl habe, etwas nicht Unwesentliches  zur Erweiterung von \sisac{} beigetragen zu haben. Die persönliche Zusammenarbeit mit Akademikern und auch die Verrichtung einer Arbeit, die nach Abschluss gebraucht und verwendet wird, ist eine Erfahrung, die in meinem Studium nicht selbstverständlich ist und um die ich mich sehr bemüht habe.
   374 
   375 Der %nicht zuletzt 
   376 durch das überraschend notwendig gewordene Update 
   377 von Isabelle2009-2 auf Isabelle2011
   378 bedingte zähe Verlauf bis ich endlich wirklich an der eigentlichen Aufgabenstellung arbeiten konnte, %war etwas ernüchternd, 
   379 verlange einies Umdisponieren,
   380 da ich gehofft hatte, das Praktikum bis spätestens Ende März abschließen zu können. Die zeitliche Verzögerung des Projektes wurde jedoch gro\3es Entgegenkommen des Institutes ausgeglichen, f\"ur das ich mich sehr bedanke. Lehrreich war f\"ur mich auch die Einbindung der Abschlusspr\"asentation in die Vortragsreihe des Institutes f\"ur Computersprachen; auch daf\"ur herzlichen Dank.
   381 
   382 Die Zusammenarbeit mit \sisac-Entwicklung \"uber Herrn Neuper hat %jedenfalls 
   383 sehr gut funktioniert und aus meiner Sicht haben wir uns sehr gut verstanden. Das hat ein produktives %entspanntes 
   384 Arbeitsklima ermöglicht.
   385 
   386 %Abgesehen von der zeitlichen Verzögerung des Projektes freue ich mich über den erfolgreichen Abschluss der geplanten Aufgaben und deren interessanten Charakter.
   387 
   388 \clearpage
   389 
   390 \bibliography{bib}
   391 
   392 \clearpage
   393 
   394 \appendix
   395 %\section*{Anhang}
   396 \section{Demobeispiel}\label{demo-code}
   397 \begin{verbatim}
   398 
   399 theory All_Ctxt imports Isac begin
   400 
   401 text {* all changes of context are demonstrated in a mini example.
   402   see test/../mstools.sml --- all ctxt changes in minimsubpbl x+1=2 --- *}
   403 
   404 section {* start of the mini example *}
   405 
   406 ML {*
   407   val fmz = ["equality (x+1=(2::real))", "solveFor x", "solutions L"];
   408   val (dI',pI',mI') =
   409     ("Test", ["sqroot-test","univariate","equation","test"],
   410      ["Test","squ-equ-test-subpbl1"]);
   411   val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
   412 *}
   413 
   414 section {* start of specify phase *}
   415 
   416 text {* variables known from formalisation provide type-inference 
   417   for further input *}
   418 
   419 ML {*
   420   val ctxt = get_ctxt pt p;
   421   val SOME known_x = parseNEW ctxt "x + y + z";
   422   val SOME unknown = parseNEW ctxt "a + b + c";
   423 *}
   424 
   425 ML {*
   426   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   427   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   428   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   429   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   430   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   431   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   432   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   433   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   434 *}
   435 
   436 section {* start interpretation of method *}
   437 
   438 text {* preconditions are known at start of
   439         interpretation of (root-)method *}
   440 
   441 ML {*
   442   get_assumptions_ pt p |> terms2strs;
   443 *}
   444 
   445 ML {*
   446 val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   447 val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   448 val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   449 *}
   450 
   451 section {* start a subproblem: specification *}
   452 
   453 text {* variables known from arguments of (sub-)method
   454         provide type-inference for further input *}
   455 
   456 ML {*
   457   val ctxt = get_ctxt pt p;
   458   val SOME known_x = parseNEW ctxt "x+y+z";
   459   val SOME unknown = parseNEW ctxt "a+b+c";
   460 *}
   461 
   462 ML {*
   463   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   464   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   465   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   466   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   467   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   468   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   469   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   470   val (p,_,f,nxt,_,pt) = me nxt p [] pt; 
   471 *}
   472 
   473 section {* interpretation of subproblem's method *}
   474 
   475 text {* preconds are known at start of interpretation of (sub-)method *}
   476 
   477 ML {*
   478  get_assumptions_ pt p |> terms2strs
   479 *}
   480 
   481 ML {*
   482  val (p,_,f,nxt,_,pt) = me nxt p [] pt; 
   483 *}
   484 
   485 ML {*
   486   "artifically inject assumptions";
   487   val (SOME (iform, cform), SOME (ires, cres)) = get_obj g_loc pt (fst p);
   488   val ctxt = insert_assumptions [str2term "x < sub_asm_out",
   489                                  str2term "a < sub_asm_local"] cres;
   490   val pt = update_loc' pt (fst p) (SOME (iform, cform), SOME (ires, ctxt));
   491 *}
   492 
   493 ML {* 
   494 val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   495 val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   496 *}
   497 
   498 section {* finish subproblem, return to calling method*}
   499 
   500 text {* transfer non-local assumptions and result from sub-method
   501         to root-method.
   502         non-local assumptions are those contaning a variable known
   503         in root-method.
   504 *}
   505 
   506 ML {*
   507   terms2strs (get_assumptions_ pt p);
   508 *}
   509 
   510 ML {*
   511   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   512   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   513 *}
   514 
   515 section {* finish Lucas interpretation *}
   516 
   517 text {* assumptions collected during lucas-interpretation
   518         for proof of postcondition *}
   519 
   520 ML {*
   521   terms2strs (get_assumptions_ pt p);
   522 *}
   523 
   524 ML {*
   525   show_pt pt;
   526 *}
   527 
   528 end
   529 \end{verbatim}
   530 
   531 \section{Stundenliste}
   532 
   533 \subsection*{Voraussetzungen zum Arbeitsbeginn schaffen}
   534 \begin{tabular}[t]{lll}
   535     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   536     10.02.2011 & 2:00 & Besprechung der Problemstellung \\
   537     11.02.2011 & 1:30 & {\it context}s studieren, Isabelle/Mercurial Installation \\
   538     18.02.2011 & 0:15 & meld/tortoisehg installieren \\
   539     20.02.2011 & 1:00 & Projektbeschreibung, jedit Probleme \\
   540     25.02.2011 & 1:00 & Ausarbeitung Meilensteine \\
   541     26.02.2011 & 1:00 & Ausarbeitung Ist-/Soll-Zustand, {\it context}s studieren\\
   542     28.02.2011 & 1:15 & Einführungsbeispiel {\it context}s \\
   543     28.02.2011 & 1:15 & Projektplan erstellen, formatieren \\
   544     01.03.2011 & 1:00 & Projektplan überarbeiten, Stundenlisten \\
   545 \end{tabular}
   546 
   547 \subsection*{\isac{} auf die letzte Isabelle-Release updaten}
   548 \begin{tabular}[t]{lll}
   549     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   550     18.02.2011 & 2:45 & Anpassungen an Isabelle2011 \\
   551     20.02.2011 & 2:45 & Update auf Isabelle2011, Fehlersuche \\
   552     21.02.2011 & 6:30 & ... \\
   553     25.02.2011 & 5:30 & ... \\
   554     26.02.2011 & 4:30 & ... \\
   555     03.03.2011 & 5:00 & ... \\
   556     04.03.2011 & 6:00 & Tests reparieren \\
   557 \end{tabular}
   558 
   559 \subsection*{Parsen aus \textit{contexts}}
   560 \begin{tabular}[t]{lll}
   561     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   562     02.03.2011 & 1:30 & vorbereitendes Übungsbeispiel \\
   563     03.03.2011 & 1:00 & ... \\
   564     04.03.2011 & 5:00 & Funktion {\tt parseNEW} schreiben \\
   565     05.03.2011 & 3:00 & Funktion {\tt vars} anpassen, {\tt declare\_constraints} neu \\
   566     07.03.2011 & 8:45 & {\tt parseNEW}, Spezifikationen studieren \\
   567     08.03.2011 & 6:00 & {\it context} in zentrale Datenstrukturen einbauen \\
   568     09.03.2011 & 2:00 & Fehlersuche {\it context}-Integration \\
   569 \end{tabular}
   570 
   571 \subsection*{Spezifikationsphase mit \textit{context}s}
   572 \begin{tabular}[t]{lll}
   573     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   574     10.03.2011 & 2:30 & {\it context} in {\tt prep\_ori} und {\tt appl\_add} einbauen\\
   575     11.03.2011 & 5:45 & {\tt appl\_add} überarbeiten \\
   576     12.03.2011 & 5:15 & Fehlersuche \\
   577     14.03.2011 & 2:00 & ... \\
   578     16.03.2011 & 2:30 & ... \\
   579     17.03.2011 & 1:45 & ... \\
   580     18.03.2011 & 4:45 & ..., Optimierung \\
   581     19.03.2011 & 5:30 & ... \\
   582     21.03.2011 & 3:00 & Abschluss Spezifikationsphase \\
   583 \end{tabular}
   584 
   585 \subsection*{L\"osungsphase mit \textit{context}s}
   586 \begin{tabular}[t]{lll}
   587     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   588     22.03.2011 & 4:30 & {\it context} in Funktion {\tt solve} einbauen\\
   589     23.03.2011 & 4:45 & Tests reparieren \\
   590     24.03.2011 & 3:30 & ... \\
   591     25.03.2011 & 2:00 & ... \\
   592     03.04.2011 & 4:00 & ... \\
   593     05.04.2011 & 8:00 & Optimierung \\
   594     06.04.2011 & 7:15 & L\"osung Exponentenoperator \\
   595     07.04.2011 & 7:00 & ... \\
   596     12.04.2011 & 3:30 & Projektbericht \\
   597 \end{tabular}
   598 
   599 \end{document}