doc-src/isac/mlehnfeld/projektbericht.tex
author Mathias Lehnfeld <e0726734@student.tuwien.ac.at>
Mon, 30 May 2011 02:04:29 +0200
branchdecompose-isar
changeset 42036 145514dbfb57
parent 42035 c37929507c1d
child 42037 ee2c2928150e
permissions -rw-r--r--
report 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, TU Wien}
    16 \author{Mathias Lehnfeld\\
    17 	{\tt mathias.lehnfeld@gmx.at}}
    18 \maketitle
    19 \clearpage
    20 \tableofcontents
    21 \clearpage
    22 
    23 
    24 \section{Zur Aufgabenstellung}
    25 Das \sisac{}-Projekt entwickelt einen {\it math assistant} aufbauend auf den
    26 {\it theorem prover} Isabelle. Der Kern des \sisac{}-Systems ist ein
    27 {\it Lucas-Interpreter}, der automatisch Benutzerführung für schrittweises
    28 Problemlösen erzeugt: Der nächste Schritt wird von einem Programm
    29 berechnet ({\it computation}); {\it deduction} wird gefordert, wenn der Benutzer
    30 eine Formel eingibt (die Ableitbarkeit der Formel aus dem {\it context} ist
    31 zu beweisen).\\
    32 \\
    33 Die Aufgabenstellung im Rahmen des Projektpraktikums besteht darin, das
    34 in Isabelle verfügbare Konzept {\it context} in den Lucas-Interpreter
    35 einzubauen. Dies schließt grundlegende Design-Überlegungen ein, verlangt
    36 tiefes Eindringen in den umfangreichen Code von zwei Softwareprodukten,
    37 {\it Isabelle} und \sisac{} und bedeutet daher Zusammenarbeit mit den jeweiligen
    38 Entwicklerteams.\\
    39 \\
    40 Ein erfolgreicher Einbau der Isabelle-{\it context}s in den
    41 Lucas-Interpreter wird \sisac{}s Fähigkeit, Benutzereingaben zu
    42 interpretieren, wesentlich erweitern: {\it context}s stellen Isabelles
    43 automatischen Beweisern die notwendigen Daten bereit.
    44 
    45 
    46 \section{Planung des Projektes}
    47 \subsection{Ist-Zustand vor dem Projekt}
    48 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.
    49 
    50 \subsection{Geplanter Soll-Zustand nach dem Projekt}
    51 \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.
    52 
    53 \subsection{Zeitplanung f\"ur das Projekt}
    54 Die Planung f\"ur das Projekt sah folgende Meilensteine vor (Details siehe \ref{ms-desc}):
    55 \begin{enumerate}
    56 \item \textbf{Voraussetzungen zum Arbeitsbeginn schaffen} (10.02. -- 18.02.)
    57   %Beschreibung siehe \ref{ms1_desc}
    58 \item \textbf{\isac{} auf die letzte Isabelle-Release updaten} (21.02. -- 25.02.)
    59   %Beschreibung siehe \ref{ms2_desc}
    60 \item \textbf{Parsen aus \textit{contexts}} (28.02. -- 04.03.)
    61   %Beschreibung siehe \ref{ms3_desc}
    62 \item \textbf{Spezifikationsphase mit \textit{context}s} (07.03. -- 11.03.)
    63   %Beschreibung siehe \ref{ms4_desc}
    64 \item \textbf{L\"osungsphase mit \textit{context}s} (14.03. -- 18.03.)
    65   %Beschreibung siehe \ref{ms5_desc}
    66 \end{enumerate}
    67 
    68 \section{Konzepte und L\"osungen}
    69 \subsection{Architektur von \isac}
    70 Die Grafik auf Seite \pageref{architektur} gibt einen \"Uberblick \"uber die Architektur von \sisac:
    71 
    72 \begin{figure} [htb]
    73 \begin{center}
    74     \includegraphics[width=120mm]{overview.pdf}
    75 \end{center}
    76 \caption{Lucas-interpreter und Isabelle}
    77 \label{architektur}
    78 \end{figure}
    79 Die Mathematik-Engine von \sisac{} ist nach dem Konzept eines ``Lucas-Interpreters'' (LI) gebaut. Ein LI interpretiert drei Arten von Daten:
    80 \begin{enumerate}
    81 \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.
    82 \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.
    83 \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.
    84 \end{enumerate}
    85 
    86 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}:
    87 
    88 \begin{enumerate}
    89 \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.
    90 \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.
    91 \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.
    92 \end{enumerate}
    93 
    94 \subsection{Isabelles Konzept von ``contexts''}
    95 Die Beschreibung dieses bew\"ahrten Konzeptes findet sich in einem internen Papier zur Implementatierung von Isabelles Beweissprache Isar \cite{isar-impl}. Isabelle stellt einen sehr generellen Funktor zur Verf\"ugung:
    96 
    97 {\tt
    98 \begin{tabbing}
    99 xx\=xx\=in\=\kill
   100 structure ContextData =  {Proof\_Data}\\
   101 \>~({type T} = term list\\
   102 \>\>{fun init \_} = []);\\
   103 \\
   104 fun insert\_assumptions asms = \\
   105 \>\>\>ContextData{.map} (fn xs => distinct (data@xs));\\
   106 \\
   107 fun get\_assumptions ctxt = ContextData{.get} ctxt;\\
   108 \\
   109 \\
   110 val declare\_constraints : \\
   111 \>\>\>term -> Proof.context -> Proof.context
   112 \end{tabbing}
   113 }
   114 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.
   115 
   116 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:
   117 {\tt
   118 \begin{tabbing}
   119 xx\=xx\=xx\=xx\=xx\=\kill
   120 fun parseNEW ctxt str = \\
   121 \>\>\>SOME ({Syntax.read\_term ctxt} str |> numbers\_to\_string)\\
   122 \>\>\>handle \_ => NONE;
   123       \end{tabbing}
   124 }
   125 \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}:
   126 {\tt
   127 \begin{tabbing}
   128 xx\=xx\=xx\=xx\=xx\=\kill
   129 fun parse thy str =\\
   130 \>(let val t = ({typ\_a2real} o numbers\_to\_string)\\
   131 \>\>\>\>({Syntax.read\_term\_global thy} str)\\
   132 \>\>in SOME (cterm\_of thy t) end)\\
   133 \>\>\>handle \_ => NONE;\\
   134       \end{tabbing}
   135 }
   136 
   137 \subsection{Die Initialisierung von ``contexts''}\label{init-ctxt}
   138 ``Contexts'' werden an zwei Stellen von Lucas-Interpretation initialisiert: am Beginn der Spezifikationsphase und zu Beginn der L\"osungsphase.
   139 
   140 \begin{enumerate}
   141 \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.
   142 
   143 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.
   144 
   145 \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
   146   \begin{enumerate}
   147   \item den Typdeklarationen aller in der Spezifikation vorkommenden Variablen mittels \textit{declare\_constraints}
   148   \item den ``preconditions'' des (interaktiv oder automatisch) spezifizierten Programmes, genauer: mit den ``preconditions'' des zugeh\"origen Guards, der meist gleich der Spezifikation ist
   149   \end{enumerate}
   150 \end{enumerate}
   151 
   152 
   153 \subsection{Aufbau von ``contexts'' in der Interpretation}\label{partiality}
   154 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.
   155 
   156 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!).
   157 
   158 \subsection{Transfer von ``contexts'' aus Subprogrammen}\label{transfer}
   159 ``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:
   160 {\tt
   161 \begin{tabbing}
   162 xx\=xx\=xx\=xx\=xx\=\kill
   163 fun transfer\_asms\_from\_to from\_ctxt to\_ctxt =\\
   164 \>  let\\
   165 \>\>    val to\_vars = get\_assumptions to\_ctxt |> map vars |> flat\\
   166 \>\>    fun transfer [] to\_ctxt = to\_ctxt\\
   167 \>\>\>      | transfer (from\_asm::fas) to\_ctxt =\\
   168 \>\>\>\>\>          if inter op = (vars from\_asm) to\_vars = []\\
   169 \>\>\>\>\>         then transfer fas to\_ctxt\\
   170 \>\>\>\>\>          else transfer fas (insert\_assumptions [from\_asm] to\_ctxt)\\
   171 \>  in transfer (get\_assumptions from\_ctxt) to\_ctxt end\\
   172       \end{tabbing}
   173 }
   174 Folgende Daten werden aus dem Sub-``context'' in den ``context'' des aufrufenden Programmes zur\"uckgegeben:
   175 \begin{enumerate}
   176 \item die R\"uckgabewerte des Subprogrammes, sofern sie vom Typ \textit{bool} sind
   177 \item alle \textit{assumptions}, die eine Variable enthalten, die auch einer der R\"uckgabewerte enth\"alt
   178 \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}
   179 \begin{tabbing}
   180 xxx\=xxx\=\kill
   181      \`$\mathit{(some)}\;\mathit{assumptions}$\\
   182 $\mathit{solve}\;(\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}, x)$\\
   183 %     \`$x ^ 2 - 6 * x + 9\not=0\land x ^ 2 - 3 * x\not=0$\\
   184 %\>$\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}$ \\ \\
   185 %\>$\frac{x}{x ^ 2 + -1 * (6 * x) + 9} + \frac{-1 * 1}{x ^ 2 + -1 * (3 * x)} = \frac{1}{x}$ \\ \\
   186 \>$\frac{3 + -1 * x + x ^ 2}{9 * x + -6 * x ^ 2 + x ^ 3} = \frac{1}{x}$ \\ 
   187      \`$x\not=3\land x\not=0$\\
   188 \>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   189 \>$\mathit{solve}\;((3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3), x)$ \\
   190 %\>\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   191 %\>\>$(3 + -1 * x + x ^ 2) * x - 1 * (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   192 \>\>$(3 + -1 * x + x ^ 2) * x - (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   193 \>\>$-6 * x + 5 * x ^ 2 = 0$ \\
   194 \>\>$\mathit{solve}\;(-6 * x + 5 * x ^ 2 = 0, x)$ \\
   195 \>\>$[x = 0, x = \frac{6}{5}]$ \\
   196      \`$x = 0\land x = \frac{6}{5}$\\
   197 \>$[{x = 0}, x = \frac{6}{5}]$ \\
   198      \`{$\mathit{Check\_Elementwise}\;\mathit{Assumptions}:x\not=0\land x = 0$}\\
   199 \>$[x = \frac{6}{5}]$ \\
   200 $[x = \frac{6}{5}]$
   201 \end{tabbing}
   202 der Unterschied begr\"undet sich darin, dass Rechnungen vorzugsweise mit Variablennamen vorgehen, die block\"ubergreifend g\"ultig sind.
   203 \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:
   204 \end{enumerate}
   205 
   206 \begin{tabbing}
   207 xxx\=xxx\=\kill
   208      \`$\mathit{(some)}\;\mathit{assumptions}$\\
   209 $\mathit{solve}\;(\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}, x)$\\
   210      \`$x ^ 2 - 6 * x + 9\not=0\land x ^ 2 - 3 * x\not=0$\\
   211 \>$\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}$ \\ \\
   212 \>$\frac{x}{x ^ 2 + -1 * (6 * x) + 9} + \frac{-1 * 1}{x ^ 2 + -1 * (3 * x)} = \frac{1}{x}$ \\ \\
   213 \>$\frac{3 + -1 * x + x ^ 2}{9 * x + -6 * x ^ 2 + x ^ 3} = \frac{1}{x}$ \\ 
   214      \`$x\not=3\land x\not=0$\\
   215 \>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   216 \>$\mathit{solve}\;((3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3), x)$ \\
   217 \>\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
   218 \>\>$(3 + -1 * x + x ^ 2) * x - 1 * (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   219 \>\>$(3 + -1 * x + x ^ 2) * x - (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
   220 \>\>$-6 * x + 5 * x ^ 2 = 0$ \\
   221 \>\>$\mathit{solve}\;(-6 * x + 5 * x ^ 2 = 0, x)$ \\
   222 \>\>$[x = 0, x = \frac{6}{5}]$ \\
   223      \`$x = 0\land x = \frac{6}{5}$\\
   224 \>$[{x = 0}, x = \frac{6}{5}]$ \\
   225      \`{$\mathit{Check\_Elementwise}\;\mathit{Assumptions}:x\not=0\land x = 0$}\\
   226 \>$[x = \frac{6}{5}]$ \\
   227 $[x = \frac{6}{5}]$
   228 \end{tabbing}
   229 Aufgrund von Punkt \ref{conflict}. oben wird es m\"oglich, aus dem Programm, das obige Rechnung erzeugt, das Statement \textit{Chec\_Elementwise Assumptions} zu streichen:
   230 {\tt
   231 \begin{tabbing}
   232 xx\=xx\=xx\=xx\=xx\=xx\=\kill
   233 Script Solve\_root\_equation (e\_e::bool) (v\_v::real) =      \\
   234 \> (let e\_e = ((Try (Rewrite\_Set norm\_equation False)) \@\@   \\
   235 \>\>\>            (Try (Rewrite\_Set Test\_simplify False))) e\_e; \\
   236 \>\>     (L\_L::bool list) =                                   \\
   237 \>\>\>            (SubProblem (Test',                           \\
   238 \>\>\>\>                         [linear,univariate,equation,test]\\
   239 \>\>\>\>                         [Test,solve\_linear])             \\
   240 \>\>\>\>                        [BOOL e\_e, REAL v\_v])             \\
   241 \>  in {Check\_Elementwise L\_L \{(v\_v::real). Assumptions\}})\\      
   242 \end{tabbing}
   243 }
   244 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.
   245 
   246 \subsection{\"Uberblick: ``contexts'' bei Lucas-Interpretation}
   247 
   248 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}.
   249 
   250 \paragraph{Formulierung der Aufgabenstellung und Spezifikation}~\\
   251 
   252 Erklärung siehe \ref{init-ctxt-spec}.
   253 \begin{verbatim}
   254 val fmz = ["equality (x+1=(2::real))", "solveFor x", "solutions L"];
   255 val (dI',pI',mI') =
   256   ("Test", ["sqroot-test","univariate","equation","test"],
   257    ["Test","squ-equ-test-subpbl1"]);
   258 val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
   259 \end{verbatim}
   260 \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.\\
   261 \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.
   262 \begin{verbatim}
   263 val ctxt = get_ctxt pt p;
   264 val SOME known_x = parseNEW ctxt "x + y + z";
   265 val SOME unknown = parseNEW ctxt "a + b + c";
   266 \end{verbatim}
   267 Dies erzeugt folgenden Output:
   268 \begin{verbatim}
   269 val ctxt = <context>: Proof.context
   270 val known_x =
   271    Const ("Groups.plus_class.plus",
   272        "RealDef.real => RealDef.real => RealDef.real") $
   273      (Const ("Groups.plus_class.plus",
   274          "RealDef.real => RealDef.real => RealDef.real") $
   275        Free ("x", "RealDef.real") $ Free ("y", "RealDef.real")) $
   276      Free ("z", "RealDef.real"):
   277    term
   278 val unknown =
   279    Const ("Groups.plus_class.plus", "'a => 'a => 'a") $
   280      (Const ("Groups.plus_class.plus", "'a => 'a => 'a")
   281        $ Free ("a", "'a") $ Free ("b", "'a")) $
   282      Free ("c", "'a"):
   283    term
   284 \end{verbatim}
   285 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}.
   286 
   287 \paragraph{Beginn der Interpretation}~\\
   288 
   289 Nach einigen Schritten der Mathematik-Engine ist die Spezifikationsphase beendet und die Interpretation des Programmes kann beginnen. Die ``precondition'' ist in den Assumptions enthalten:
   290 \begin{verbatim}
   291 get_assumptions_ pt p |> terms2strs
   292 \end{verbatim}
   293 Output:
   294 \begin{verbatim}
   295 val it = ["precond_rootmet x"]: string list
   296 \end{verbatim}
   297 
   298 \paragraph{Bearbeitung eines Subproblems}~\\
   299 
   300 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.\\
   301 In einem Zwischenschritt bestehen die lokalen Assumptions aus der Annahme, dass die Gleichung mit der Gleichheitsregel zu matchen ist:\\
   302 \begin{verbatim}
   303 ["matches (?a = ?b) (-1 + x = 0)"]: string list
   304 \end{verbatim}
   305 Nach künstlichem Einfügen zweier Assumptions und Beendigung des Subproblems steht eine Lösung für \textit{x} in den Assumptions:\\
   306 \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}\\
   307 \\
   308 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}).
   309 
   310 \paragraph{Abschluss der Berechnung}~\\
   311 
   312 Nach den letzten Aufrufen der Mathematik-Engine stehen alle Schritte fest:
   313 \begin{verbatim}[
   314 (([], Frm), solve (x + 1 = 2, x)),
   315 (([1], Frm), x + 1 = 2),
   316 (([1], Res), x + 1 + -1 * 2 = 0),
   317 (([2], Res), -1 + x = 0),
   318 (([3], Pbl), solve (-1 + x = 0, x)),
   319 (([3,1], Frm), -1 + x = 0),
   320 (([3,1], Res), x = 0 + -1 * -1),
   321 (([3,2], Res), x = 1),
   322 (([3], Res), [x = 1]),
   323 (([4], Res), [x = 1]),
   324 (([], Res), [x = 1])] 
   325 \end{verbatim}
   326 
   327 \section{Beschreibung der Meilensteine}\label{ms-desc}
   328 \subsection{Voraussetzungen zum Arbeitsbeginn schaffen}\label{ms1_desc}
   329 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.
   330 
   331 \subsection{\isac{} auf die letzte Isabelle-Release updaten}\label{ms2_desc}
   332 Die Arbeit mit den Isabelle {\it context}s wird Anfragen in isabelle-dev@
   333 erfordern. isabelle-dev@ beantwortet Fragen i.A. nur f\"ur die aktuelle
   334 Release. Überraschenderweise wurde zwei Wochen vor Beginn des Projektpraktikums eine neue Release
   335 veröffentlicht. Daher muss auf diese vor Arbeitsbeginn upgedatet werden.
   336 
   337 \subsection{Parsen aus {\it context}s}\label{ms3_desc}
   338 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.
   339 
   340 \subsection{Spezifikationsphase mit {\it context}s}\label{ms4_desc}
   341 \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.
   342 
   343 \subsection{L\"osungsphase mit {\it context}s}\label{ms5_desc}
   344 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.
   345 
   346 \section{Bericht zum Projektverlauf}
   347 
   348 \subsection{Voraussetzungen zum Arbeitsbeginn schaffen}
   349 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.
   350 
   351 \subsection{\isac{} auf die letzte Isabelle-Release updaten}
   352 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.\\
   353 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.
   354 
   355 \subsection{Parsen aus {\it context}s}
   356 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.
   357 
   358 \subsection{Spezifikationsphase mit {\it context}s}
   359 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.
   360 Insgesamt verlief diese Phase trotz der langwierigen Fehlersuche nicht viel langsamer als geplant.
   361 
   362 \subsection{L\"osungsphase mit {\it context}s}
   363 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.
   364 
   365 
   366 \section{Abschließende Bemerkungen}
   367 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 ich im Verlauf meines Studiums leider erst einmal davor machen durfte.\\
   368 Der nicht zuletzt durch das überraschend notwendig gewordene Update bedingte zähe Verlauf bis ich endlich wirklich an der eigentlichen Aufgabenstellung arbeiten konnte war etwas ernüchternd, da ich gehofft hatte, das Praktikum bis spätestens Ende März abschließen zu können.\\
   369 Die Zusammenarbeit mit Herrn Neuper hat jedenfalls sehr gut funktioniert und aus meiner Sicht haben wir uns sehr gut verstanden. Das hat ein entspanntes Arbeitsklima ermöglicht.\\
   370 Da mir bis zum Abschluss meiner Arbeit nicht bewusst war, dass eine Präsentation zu halten und ein umfangreicher Projektbericht abzufassen sind, musste ich den für eine Lehrveranstaltung von 6 ECTS vorgesehenen Arbeitsaufwand deutlich überschreiten. Das und die zeitliche Verzögerung des Projektes geben der Freude über den erfolgreichen Abschluss der geplanten Aufgaben und deren interessanten Charakter einen bitteren Beigeschmack.
   371 
   372 \clearpage
   373 
   374 \bibliography{bib}
   375 
   376 \clearpage
   377 
   378 \appendix
   379 %\section*{Anhang}
   380 \section{Demobeispiel}\label{demo-code}
   381 \begin{verbatim}
   382 
   383 theory All_Ctxt imports Isac begin
   384 
   385 text {* all changes of context are demonstrated in a mini example.
   386   see test/../mstools.sml --- all ctxt changes in minimsubpbl x+1=2 --- *}
   387 
   388 section {* start of the mini example *}
   389 
   390 ML {*
   391   val fmz = ["equality (x+1=(2::real))", "solveFor x", "solutions L"];
   392   val (dI',pI',mI') =
   393     ("Test", ["sqroot-test","univariate","equation","test"],
   394      ["Test","squ-equ-test-subpbl1"]);
   395   val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
   396 *}
   397 
   398 section {* start of specify phase *}
   399 
   400 text {* variables known from formalisation provide type-inference 
   401   for further input *}
   402 
   403 ML {*
   404   val ctxt = get_ctxt pt p;
   405   val SOME known_x = parseNEW ctxt "x + y + z";
   406   val SOME unknown = parseNEW ctxt "a + b + c";
   407 *}
   408 
   409 ML {*
   410   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   411   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   412   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   413   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   414   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   415   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   416   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   417   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   418 *}
   419 
   420 section {* start interpretation of method *}
   421 
   422 text {* preconditions are known at start of
   423         interpretation of (root-)method *}
   424 
   425 ML {*
   426   get_assumptions_ pt p |> terms2strs;
   427 *}
   428 
   429 ML {*
   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 *}
   434 
   435 section {* start a subproblem: specification *}
   436 
   437 text {* variables known from arguments of (sub-)method
   438         provide type-inference for further input *}
   439 
   440 ML {*
   441   val ctxt = get_ctxt pt p;
   442   val SOME known_x = parseNEW ctxt "x+y+z";
   443   val SOME unknown = parseNEW ctxt "a+b+c";
   444 *}
   445 
   446 ML {*
   447   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   448   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   449   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   450   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   451   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   452   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   453   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   454   val (p,_,f,nxt,_,pt) = me nxt p [] pt; 
   455 *}
   456 
   457 section {* interpretation of subproblem's method *}
   458 
   459 text {* preconds are known at start of interpretation of (sub-)method *}
   460 
   461 ML {*
   462  get_assumptions_ pt p |> terms2strs
   463 *}
   464 
   465 ML {*
   466  val (p,_,f,nxt,_,pt) = me nxt p [] pt; 
   467 *}
   468 
   469 ML {*
   470   "artifically inject assumptions";
   471   val (SOME (iform, cform), SOME (ires, cres)) = get_obj g_loc pt (fst p);
   472   val ctxt = insert_assumptions [str2term "x < sub_asm_out",
   473                                  str2term "a < sub_asm_local"] cres;
   474   val pt = update_loc' pt (fst p) (SOME (iform, cform), SOME (ires, ctxt));
   475 *}
   476 
   477 ML {* 
   478 val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   479 val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   480 *}
   481 
   482 section {* finish subproblem, return to calling method*}
   483 
   484 text {* transfer non-local assumptions and result from sub-method
   485         to root-method.
   486         non-local assumptions are those contaning a variable known
   487         in root-method.
   488 *}
   489 
   490 ML {*
   491   terms2strs (get_assumptions_ pt p);
   492 *}
   493 
   494 ML {*
   495   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   496   val (p,_,f,nxt,_,pt) = me nxt p [] pt;
   497 *}
   498 
   499 section {* finish Lucas interpretation *}
   500 
   501 text {* assumptions collected during lucas-interpretation
   502         for proof of postcondition *}
   503 
   504 ML {*
   505   terms2strs (get_assumptions_ pt p);
   506 *}
   507 
   508 ML {*
   509   show_pt pt;
   510 *}
   511 
   512 end
   513 \end{verbatim}
   514 
   515 \section{Stundenliste}
   516 
   517 \subsection*{Voraussetzungen zum Arbeitsbeginn schaffen}
   518 \begin{tabular}[t]{lll}
   519     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   520     10.02.2011 & 2:00 & Besprechung der Problemstellung \\
   521     11.02.2011 & 1:30 & {\it context}s studieren, Isabelle/Mercurial Installation \\
   522     18.02.2011 & 0:15 & meld/tortoisehg installieren \\
   523     20.02.2011 & 1:00 & Projektbeschreibung, jedit Probleme \\
   524     25.02.2011 & 1:00 & Ausarbeitung Meilensteine \\
   525     26.02.2011 & 1:00 & Ausarbeitung Ist-/Soll-Zustand, {\it context}s studieren\\
   526     28.02.2011 & 1:15 & Einführungsbeispiel {\it context}s \\
   527     28.02.2011 & 1:15 & Projektplan erstellen, formatieren \\
   528     01.03.2011 & 1:00 & Projektplan überarbeiten, Stundenlisten \\
   529 \end{tabular}
   530 
   531 \subsection*{\isac{} auf die letzte Isabelle-Release updaten}
   532 \begin{tabular}[t]{lll}
   533     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   534     18.02.2011 & 2:45 & Anpassungen an Isabelle2011 \\
   535     20.02.2011 & 2:45 & Update auf Isabelle2011, Fehlersuche \\
   536     21.02.2011 & 6:30 & ... \\
   537     25.02.2011 & 5:30 & ... \\
   538     26.02.2011 & 4:30 & ... \\
   539     03.03.2011 & 5:00 & ... \\
   540     04.03.2011 & 6:00 & Tests reparieren \\
   541 \end{tabular}
   542 
   543 \subsection*{Parsen aus \textit{contexts}}
   544 \begin{tabular}[t]{lll}
   545     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   546     02.03.2011 & 1:30 & vorbereitendes Übungsbeispiel \\
   547     03.03.2011 & 1:00 & ... \\
   548     04.03.2011 & 5:00 & Funktion {\tt parseNEW} schreiben \\
   549     05.03.2011 & 3:00 & Funktion {\tt vars} anpassen, {\tt declare\_constraints} neu \\
   550     07.03.2011 & 8:45 & {\tt parseNEW}, Spezifikationen studieren \\
   551     08.03.2011 & 6:00 & {\it context} in zentrale Datenstrukturen einbauen \\
   552     09.03.2011 & 2:00 & Fehlersuche {\it context}-Integration \\
   553 \end{tabular}
   554 
   555 \subsection*{Spezifikationsphase mit \textit{context}s}
   556 \begin{tabular}[t]{lll}
   557     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   558     10.03.2011 & 2:30 & {\it context} in {\tt prep\_ori} und {\tt appl\_add} einbauen\\
   559     11.03.2011 & 5:45 & {\tt appl\_add} überarbeiten \\
   560     12.03.2011 & 5:15 & Fehlersuche \\
   561     14.03.2011 & 2:00 & ... \\
   562     16.03.2011 & 2:30 & ... \\
   563     17.03.2011 & 1:45 & ... \\
   564     18.03.2011 & 4:45 & ..., Optimierung \\
   565     19.03.2011 & 5:30 & ... \\
   566     21.03.2011 & 3:00 & Abschluss Spezifikationsphase \\
   567 \end{tabular}
   568 
   569 \subsection*{L\"osungsphase mit \textit{context}s}
   570 \begin{tabular}[t]{lll}
   571     {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
   572     22.03.2011 & 4:30 & {\it context} in Funktion {\tt solve} einbauen\\
   573     23.03.2011 & 4:45 & Tests reparieren \\
   574     24.03.2011 & 3:30 & ... \\
   575     25.03.2011 & 2:00 & ... \\
   576     03.04.2011 & 4:00 & ... \\
   577     05.04.2011 & 8:00 & Optimierung \\
   578     06.04.2011 & 7:15 & L\"osung Exponentenoperator \\
   579     07.04.2011 & 7:00 & ... \\
   580     12.04.2011 & 3:30 & Projektbericht \\
   581 \end{tabular}
   582 
   583 \end{document}