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