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