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