doc-src/isac/mlehnfeld/projektbericht.tex
author Walther Neuper <neuper@ist.tugraz.at>
Sun, 29 May 2011 21:02:40 +0200
branchdecompose-isar
changeset 42035 c37929507c1d
parent 42034 918b8bc80a2f
child 42036 145514dbfb57
permissions -rw-r--r--
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
neuper@42035
    45
%\clearpage
e0726734@42034
    46
neuper@42035
    47
\section{Planung des Projektes}
e0726734@42034
    48
\subsection{Ist-Zustand vor dem Projekt}
e0726734@42034
    49
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
    50
e0726734@42034
    51
\subsection{Geplanter Soll-Zustand nach dem Projekt}
e0726734@42034
    52
\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
    53
neuper@42035
    54
\subsection{Zeitplanung f\"ur das Projekt}
neuper@42035
    55
Die Planung f\"ur das Projekt sah folgende Meilensteine vor:
neuper@42035
    56
\begin{enumerate}
neuper@42035
    57
\item \textbf{Voraussetzungen zum Arbeitsbeginn schaffen} (10.Feb. -- 28.Feb)\\
neuper@42035
    58
TODO
neuper@42035
    59
\item \textbf{\isac{} auf die letzte Isabelle-Release updaten} (TODO)\\
neuper@42035
    60
TODO
neuper@42035
    61
\item 
neuper@42035
    62
\item 
neuper@42035
    63
\end{enumerate}
neuper@42035
    64
%\clearpage
e0726734@42034
    65
neuper@42035
    66
\section{Konzepte und L\"osungen}
neuper@42035
    67
\subsection{Architektur von \isac}
neuper@42035
    68
Die Grafik auf Seite p.\pageref{architektur} gibt einen \"Uberblick \"uber die Architektur von \sisac:
e0726734@42034
    69
neuper@42035
    70
\begin{figure} [htb]
neuper@42035
    71
\begin{center}
neuper@42035
    72
    \includegraphics[width=120mm]{overview.pdf}
neuper@42035
    73
\end{center}
neuper@42035
    74
\caption{Lucas-interpreter und Isabelle}
neuper@42035
    75
\label{architektur}
neuper@42035
    76
\end{figure}
neuper@42035
    77
Die Mathematik-Engine von \sisac{} ist nach dem Konzept eines ``Lucas-Interpreters'' (LI) gebaut. Ein LI interpretiert drei Arten von Daten:
neuper@42035
    78
\begin{enumerate}
neuper@42035
    79
\item\label{spec}\textbf{Spezifikationen}: diese beschreiben ein Problem der angewandten Mathematik durch die Ein-Ausgabe-Daten, die ``Precondition'' (Pr\"adikate auf den Eingabe-Daten) und eine eine ``Postcondition'' (eine Relation zwischen Ein- und Ausgabe-Daten). Spezifikationen stellen den \textit{applikations-orientierten} Aspekt der Mathematik dar.
neuper@42035
    80
\item \textbf{Programme}: beschreiben den Algorithmus zur L\"osung des spezifizierten Problems. \sisac's programmsprache ist funktional und hat keine Ein-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@42035
    81
\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 Umfangt. Theorien  stellen den \textit{deduktiven} Aspekt der Mathematik dar.
neuper@42035
    82
\end{enumerate}
neuper@42035
    83
neuper@42035
    84
Die Funktionalit\"at eines LI kann in kurzer Form so beschrieben werden \footnote{Siehe http://www.ist.tugraz.at/isac/index.php/Description}:
neuper@42035
    85
\begin{enumerate}
neuper@42035
    86
\item 
neuper@42035
    87
\item 
neuper@42035
    88
\item 
neuper@42035
    89
\end{enumerate}
neuper@42035
    90
neuper@42035
    91
\subsection{Isabelles Konzept von ``contexts''}
neuper@42035
    92
Die Beschreibung dieses bew\"ahrten Konzeptes findet sich in einem internen Papier zur Implementation von Isabelles Beweissprache Isar \cite{isar-impl}. Isabelle stellt einen sehr generellen Funktor zur Verf\"ugung:
neuper@42035
    93
neuper@42035
    94
{\tt
neuper@42035
    95
\begin{tabbing}
neuper@42035
    96
xx\=xx\=in\=\kill
neuper@42035
    97
structure ContextData =  {Proof\_Data}\\
neuper@42035
    98
\>~({type T} = term list\\
neuper@42035
    99
\>\>{fun init \_} = []);\\
neuper@42035
   100
\\
neuper@42035
   101
fun insert\_assumptions asms = \\
neuper@42035
   102
\>\>\>ContextData{.map} (fn xs => distinct (data@xs));\\
neuper@42035
   103
\\
neuper@42035
   104
fun get\_assumptions ctxt = ContextData{.get} ctxt;\\
neuper@42035
   105
\\
neuper@42035
   106
\\
neuper@42035
   107
val declare\_constraints : \\
neuper@42035
   108
\>\>\>term -> Proof.context -> Proof.context
neuper@42035
   109
\end{tabbing}
neuper@42035
   110
}
neuper@42035
   111
Das Einzige, was die Definition eines''contexts'' braucht, sind eine 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
   112
neuper@42035
   113
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
   114
{\tt
neuper@42035
   115
\begin{tabbing}
neuper@42035
   116
xx\=xx\=xx\=xx\=xx\=\kill
neuper@42035
   117
fun parseNEW ctxt str = \\
neuper@42035
   118
\>\>\>SOME ({Syntax.read\_term ctxt} str |> numbers\_to\_string)\\
neuper@42035
   119
\>\>\>handle \_ => NONE;
neuper@42035
   120
      \end{tabbing}
neuper@42035
   121
}
neuper@42035
   122
\textit{Syntax.read\_term ctxt} entnimmt den ``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} alle unbestimmten Typen einfach auf \textit{real}:
neuper@42035
   123
{\tt
neuper@42035
   124
\begin{tabbing}
neuper@42035
   125
xx\=xx\=xx\=xx\=xx\=\kill
neuper@42035
   126
fun parse thy str =\\
neuper@42035
   127
\>(let val t = ({typ\_a2real} o numbers\_to\_string)\\
neuper@42035
   128
\>\>\>\>({Syntax.read\_term\_global thy} str)\\
neuper@42035
   129
\>\>in SOME (cterm\_of thy t) end)\\
neuper@42035
   130
\>\>\>handle \_ => NONE;\\
neuper@42035
   131
      \end{tabbing}
neuper@42035
   132
}
neuper@42035
   133
neuper@42035
   134
\subsection{Die Initialisierung von ``contexts''}\label{init-ctxt}
neuper@42035
   135
``Contexts'' werden anzwei Stellen von Lucas-Interpretation initialisiert: am Beginn der Spezifikations-Phase und zu Beginn der L\"ose-Phase.
neuper@42035
   136
neuper@42035
   137
\begin{enumerate}
neuper@42035
   138
\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 initialisiert mit den Typdeklarationen aller vorkommenden Variablen mittels \textit{declare\_constraints}.
neuper@42035
   139
neuper@42035
   140
Im Falle eines Rootproblems kommen die Variablen von einer ``formalization'', einer Kurzbeschreibung der Eingabe-Daten durch einen Autor. Im Falle eines Subproblems kommen die Variablen von den ``actual arguments'' des Subprogrammes.
neuper@42035
   141
neuper@42035
   142
\item\label{init-ctxt-solve}{Die L\"ose-Phase} erzeugt die Rechenschritte aus dem spezifizierten Programm. Zu Beginn der Interpretation des Programmes wird der ``context'' initialisiert mit
neuper@42035
   143
  \begin{enumerate}
neuper@42035
   144
  \item den Typdeklarationen aller in der Spezifikation vorkommenden Variablen mittels \textit{declare\_constraints}
neuper@42035
   145
  \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
   146
  \end{enumerate}
neuper@42035
   147
\end{enumerate}
neuper@42035
   148
neuper@42035
   149
neuper@42035
   150
\subsection{Aufbau von ``contexts'' in der Interpretation}\label{partiality}
neuper@42035
   151
W\"ahrend der Interpretation eines Programmes baut der Lucas-Interpreter einen ``context'' auf, indem er alle relevanten ``preconditions'', andere Pr\"adikate -- insbesonders ``partiality conditions'' einsammelt. Eine ``partiality condition'' ist zum Beispiel $x\not=0$, die Division durch $0$ verhindert.
neuper@42035
   152
neuper@42035
   153
Am Ende eines Programmes soll der ``context'' hinreichend logische Information enthalten, sodass Isabelles automatische Beweise die ``postcondition'' automatisch beweisen k\"onnen (das ist eine k\"unftige Entwicklungsaufgabe~!).
neuper@42035
   154
neuper@42035
   155
\subsection{Transfer von ``contexts'' aus Subprogrammen}\label{transfer}
neuper@42035
   156
``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
   157
{\tt
neuper@42035
   158
\begin{tabbing}
neuper@42035
   159
xx\=xx\=xx\=xx\=xx\=\kill
neuper@42035
   160
fun transfer\_asms\_from\_to from\_ctxt to\_ctxt =\\
neuper@42035
   161
\>  let\\
neuper@42035
   162
\>\>    val to\_vars = get\_assumptions to\_ctxt |> map vars |> flat\\
neuper@42035
   163
\>\>    fun transfer [] to\_ctxt = to\_ctxt\\
neuper@42035
   164
\>\>\>      | transfer (from\_asm::fas) to\_ctxt =\\
neuper@42035
   165
\>\>\>\>\>          if inter op = (vars from\_asm) to\_vars = []\\
neuper@42035
   166
\>\>\>\>\>         then transfer fas to\_ctxt\\
neuper@42035
   167
\>\>\>\>\>          else transfer fas (insert\_assumptions [from\_asm] to\_ctxt)\\
neuper@42035
   168
\>  in transfer (get\_assumptions from\_ctxt) to\_ctxt end\\
neuper@42035
   169
      \end{tabbing}
neuper@42035
   170
}
neuper@42035
   171
Folgende Daten werden aus dem Sub-``context'' in den ``context'' des aufrufenden Programmes zur\"uckgegeben:
neuper@42035
   172
\begin{enumerate}
neuper@42035
   173
\item die R\"uckgabewerte des Subprogrammes, soferne sie vom Typ \textit{bool} sind
neuper@42035
   174
\item alle \textit{assumptions}, die eine Variable enthalten, die auch ein R\"uckgabewerte enth\"alt
neuper@42035
   175
\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; \begin{tabbing}
neuper@42035
   176
xxx\=xxx\=\kill
neuper@42035
   177
     \`$\mathit{(some)}\;\mathit{assumptions}$\\
neuper@42035
   178
$\mathit{solve}\;(\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}, x)$\\
neuper@42035
   179
%     \`$x ^ 2 - 6 * x + 9\not=0\land x ^ 2 - 3 * x\not=0$\\
neuper@42035
   180
%\>$\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}$ \\ \\
neuper@42035
   181
%\>$\frac{x}{x ^ 2 + -1 * (6 * x) + 9} + \frac{-1 * 1}{x ^ 2 + -1 * (3 * x)} = \frac{1}{x}$ \\ \\
neuper@42035
   182
\>$\frac{3 + -1 * x + x ^ 2}{9 * x + -6 * x ^ 2 + x ^ 3} = \frac{1}{x}$ \\ 
neuper@42035
   183
     \`$x\not=3\land x\not=0$\\
neuper@42035
   184
\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
neuper@42035
   185
\>$\mathit{solve}\;((3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3), x)$ \\
neuper@42035
   186
%\>\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
neuper@42035
   187
%\>\>$(3 + -1 * x + x ^ 2) * x - 1 * (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
neuper@42035
   188
\>\>$(3 + -1 * x + x ^ 2) * x - (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
neuper@42035
   189
\>\>$-6 * x + 5 * x ^ 2 = 0$ \\
neuper@42035
   190
\>\>$\mathit{solve}\;(-6 * x + 5 * x ^ 2 = 0, x)$ \\
neuper@42035
   191
\>\>$[x = 0, x = \frac{6}{5}]$ \\
neuper@42035
   192
     \`$x = 0\land x = \frac{6}{5}$\\
neuper@42035
   193
\>$[{x = 0}, x = \frac{6}{5}]$ \\
neuper@42035
   194
     \`{$\mathit{Check\_Elementwise}\;\mathit{Assumptions}:x\not=0\land x = 0$}\\
neuper@42035
   195
\>$[x = \frac{6}{5}]$ \\
neuper@42035
   196
$[x = \frac{6}{5}]$
neuper@42035
   197
\end{tabbing}
neuper@42035
   198
der Unterschied begr\"undet sich darin, dass Rechnungen vorzugsweise mit Variablennamen vorgehen, die \"uber die Block-\"ubergreifend g\"ultig sind.}
neuper@42035
   199
\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
   200
\end{enumerate}
neuper@42035
   201
neuper@42035
   202
\begin{tabbing}
neuper@42035
   203
xxx\=xxx\=\kill
neuper@42035
   204
     \`$\mathit{(some)}\;\mathit{assumptions}$\\
neuper@42035
   205
$\mathit{solve}\;(\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}, x)$\\
neuper@42035
   206
     \`$x ^ 2 - 6 * x + 9\not=0\land x ^ 2 - 3 * x\not=0$\\
neuper@42035
   207
\>$\frac{x}{x ^ 2 - 6 * x + 9} - \frac{1}{x ^ 2 - 3 * x} = \frac{1}{x}$ \\ \\
neuper@42035
   208
\>$\frac{x}{x ^ 2 + -1 * (6 * x) + 9} + \frac{-1 * 1}{x ^ 2 + -1 * (3 * x)} = \frac{1}{x}$ \\ \\
neuper@42035
   209
\>$\frac{3 + -1 * x + x ^ 2}{9 * x + -6 * x ^ 2 + x ^ 3} = \frac{1}{x}$ \\ 
neuper@42035
   210
     \`$x\not=3\land x\not=0$\\
neuper@42035
   211
\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
neuper@42035
   212
\>$\mathit{solve}\;((3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3), x)$ \\
neuper@42035
   213
\>\>$(3 + -1 * x + x ^ 2) * x = 1 * (9 * x + -6 * x ^ 2 + x ^ 3)$ \\
neuper@42035
   214
\>\>$(3 + -1 * x + x ^ 2) * x - 1 * (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
neuper@42035
   215
\>\>$(3 + -1 * x + x ^ 2) * x - (9 * x + -6 * x ^ 2 + x ^ 3) = 0$ \\
neuper@42035
   216
\>\>$-6 * x + 5 * x ^ 2 = 0$ \\
neuper@42035
   217
\>\>$\mathit{solve}\;(-6 * x + 5 * x ^ 2 = 0, x)$ \\
neuper@42035
   218
\>\>$[x = 0, x = \frac{6}{5}]$ \\
neuper@42035
   219
     \`$x = 0\land x = \frac{6}{5}$\\
neuper@42035
   220
\>$[{x = 0}, x = \frac{6}{5}]$ \\
neuper@42035
   221
     \`{$\mathit{Check\_Elementwise}\;\mathit{Assumptions}:x\not=0\land x = 0$}\\
neuper@42035
   222
\>$[x = \frac{6}{5}]$ \\
neuper@42035
   223
$[x = \frac{6}{5}]$
neuper@42035
   224
\end{tabbing}
neuper@42035
   225
Aufgrund von Punkt.\ref{conflict} oben wird es m\"oglich, aus dem Programm, das obige Rechnung erzeugt, das Statement \textit{Chec\_Elementwise Assumptions} zu streichen:
neuper@42035
   226
{\tt
neuper@42035
   227
\begin{tabbing}
neuper@42035
   228
xx\=xx\=xx\=xx\=xx\=xx\=\kill
neuper@42035
   229
Script Solve\_root\_equation (e\_e::bool) (v\_v::real) =      \\
neuper@42035
   230
\> (let e\_e = ((Try (Rewrite\_Set norm\_equation False)) \@\@   \\
neuper@42035
   231
\>\>\>            (Try (Rewrite\_Set Test\_simplify False))) e\_e; \\
neuper@42035
   232
\>\>     (L\_L::bool list) =                                   \\
neuper@42035
   233
\>\>\>            (SubProblem (Test',                           \\
neuper@42035
   234
\>\>\>\>                         [linear,univariate,equation,test]\\
neuper@42035
   235
\>\>\>\>                         [Test,solve\_linear])             \\
neuper@42035
   236
\>\>\>\>                        [BOOL e\_e, REAL v\_v])             \\
neuper@42035
   237
\>  in {Check\_elementwise L\_L \{(v\_v::real). Assumptions\}})\\      
neuper@42035
   238
\end{tabbing}
neuper@42035
   239
}
neuper@42035
   240
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
   241
neuper@42035
   242
\subsection{\"Uberblick: ``contexts'' bei Lucas-Interpretation}
neuper@42035
   243
jedit
neuper@42035
   244
neuper@42035
   245
\ref{init-ctxt-spec}
neuper@42035
   246
\ref{init-ctxt-solve}
neuper@42035
   247
\ref{init-ctxt-spec}
neuper@42035
   248
\ref{init-ctxt-solve}
neuper@42035
   249
\ref{partiality}
neuper@42035
   250
\ref{transfer}
neuper@42035
   251
\ref{conflict}
neuper@42035
   252
neuper@42035
   253
\section{Dokumentation der Meilensteine}Assertions
e0726734@42034
   254
\subsection{Voraussetzungen zum Arbeitsbeginn schaffen}
e0726734@42034
   255
\begin{tabular}[t]{lll}
e0726734@42034
   256
    {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
e0726734@42034
   257
    10.02.2011 & 2:00 & Besprechung der Problemstellung \\
e0726734@42034
   258
    11.02.2011 & 1:30 & {\it context}s studieren, Isabelle/Mercurial Installation \\
e0726734@42034
   259
    18.02.2011 & 0:15 & meld/tortoisehg installieren \\
e0726734@42034
   260
    20.02.2011 & 1:00 & Projektbeschreibung, jedit Probleme \\
e0726734@42034
   261
    25.02.2011 & 1:00 & Ausarbeitung Meilensteine \\
e0726734@42034
   262
    26.02.2011 & 1:00 & Ausarbeitung Ist-/Soll-Zustand, {\it context}s studieren\\
e0726734@42034
   263
    28.02.2011 & 1:15 & Einführungsbeispiel {\it context}s \\
e0726734@42034
   264
    28.02.2011 & 1:15 & Projektplan erstellen, formatieren \\
e0726734@42034
   265
    01.03.2011 & 1:00 & Projektplan überarbeiten, Stundenlisten \\
e0726734@42034
   266
\end{tabular}
e0726734@42034
   267
e0726734@42034
   268
\subsection{\isac{} auf die letzte Isabelle-Release updaten}
e0726734@42034
   269
Die Arbeit mit den Isabelle {\it context}s wird Anfragen in isabelle-dev@
e0726734@42034
   270
erfordern. isabelle-dev@ beantwortet Fragen i.A. nur für die aktuelle
e0726734@42034
   271
Release. Überraschenderweise wurde vor zwei Wochen eine neue Release
e0726734@42034
   272
veröffentlicht. Daher muss auf diese vor Arbeitsbeginn upgedatet werden.\\
e0726734@42034
   273
\\
e0726734@42034
   274
\begin{tabular}[t]{lll}
e0726734@42034
   275
    {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
e0726734@42034
   276
    18.02.2011 & 2:45 & Anpassungen an Isabelle2011 \\
e0726734@42034
   277
    20.02.2011 & 2:45 & Update auf Isabelle2011, Fehlersuche \\
e0726734@42034
   278
    21.02.2011 & 6:30 & ... \\
e0726734@42034
   279
    25.02.2011 & 5:30 & ... \\
e0726734@42034
   280
    26.02.2011 & 4:30 & ... \\
e0726734@42034
   281
    03.03.2011 & 5:00 & ... \\
e0726734@42034
   282
    04.03.2011 & 6:00 & Tests reparieren \\
e0726734@42034
   283
\end{tabular}
e0726734@42034
   284
e0726734@42034
   285
\subsection{Parsen aus {\it context}s}
e0726734@42034
   286
Bisher nahm \sisac{} für jede Variable den Typ {\it real} an. Ab jetzt werden Variablen, Terme und Prädikate beim ersten Auftreten im {\it context} eingetragen. User-Input wird mithilfe des {\it context}s typgerecht geparst.\\
e0726734@42034
   287
\\
e0726734@42034
   288
\begin{tabular}[t]{lll}
e0726734@42034
   289
    {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
e0726734@42034
   290
    02.03.2011 & 1:30 & vorbereitendes Übungsbeispiel \\
e0726734@42034
   291
    03.03.2011 & 1:00 & ... \\
e0726734@42034
   292
    04.03.2011 & 5:00 & Funktion {\tt parseNEW} schreiben \\
e0726734@42034
   293
    05.03.2011 & 3:00 & Funktion {\tt vars} anpassen, {\tt declare\_constraints} neu \\
e0726734@42034
   294
    07.03.2011 & 8:45 & {\tt parseNEW}, Spezifikationen studieren \\
e0726734@42034
   295
    08.03.2011 & 6:00 & {\it context} in zentrale Datenstrukturen einbauen \\
e0726734@42034
   296
    09.03.2011 & 2:00 & Fehlersuche {\it context}-Integration \\
e0726734@42034
   297
\end{tabular}
e0726734@42034
   298
e0726734@42034
   299
\subsection{Spezifikationsphase mit {\it context}s}
e0726734@42034
   300
\sisac{} sah für die Spezifikation eine Datenstruktur vor, die interaktives Spezifizieren effizient unterstützt. Diese Datenstruktur ist nun durch {\it context}s ersetzt. Dadurch ist die bisherige Fixierung auf {\it real} aufgehoben und beliebige Typen werden fehlerfrei behandelt.\\
e0726734@42034
   301
\\
e0726734@42034
   302
\begin{tabular}[t]{lll}
e0726734@42034
   303
    {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
e0726734@42034
   304
    10.03.2011 & 2:30 & {\it context} in {\tt prep\_ori} und {\tt appl\_add} einbauen\\
e0726734@42034
   305
    11.03.2011 & 5:45 & {\tt appl\_add} überarbeiten \\
e0726734@42034
   306
    12.03.2011 & 5:15 & Fehlersuche \\
e0726734@42034
   307
    14.03.2011 & 2:00 & ... \\
e0726734@42034
   308
    16.03.2011 & 2:30 & ... \\
e0726734@42034
   309
    17.03.2011 & 1:45 & ... \\
e0726734@42034
   310
    18.03.2011 & 4:45 & ..., Optimierung \\
e0726734@42034
   311
    19.03.2011 & 5:30 & ... \\
e0726734@42034
   312
    21.03.2011 & 3:00 & Abschluss Spezifikationsphase \\
e0726734@42034
   313
\end{tabular}
e0726734@42034
   314
e0726734@42034
   315
\subsection{Lösungsphase mit {\it context}s}
e0726734@42034
   316
Der Lucas-Interpreter hatte Environment und Assertions (precondition, partiality conditions, etc) getrennt gespeichert. Nun sind Environment und Assertions im {\it context} vereint, der Interpreter einfacher und genereller.\\
e0726734@42034
   317
\\
e0726734@42034
   318
\begin{tabular}[t]{lll}
e0726734@42034
   319
    {\bf Datum} & {\bf Stunden} & {\bf Beschreibung} \\
e0726734@42034
   320
    22.03.2011 & 4:30 & {\it context} in Funktion {\tt solve} einbauen\\
e0726734@42034
   321
    23.03.2011 & 4:45 & Tests reparieren \\
e0726734@42034
   322
    24.03.2011 & 3:30 & ... \\
e0726734@42034
   323
    25.03.2011 & 2:00 & ... \\
e0726734@42034
   324
    03.04.2011 & 4:00 & ... \\
e0726734@42034
   325
    05.04.2011 & 8:00 & Optimierung \\
e0726734@42034
   326
    06.04.2011 & 7:15 & Lösung Exponentenoperator \\
e0726734@42034
   327
    07.03.2011 & 7:00 & ... \\
e0726734@42034
   328
    12.04.2011 & 3:30 & Projektbericht \\
e0726734@42034
   329
\end{tabular}
e0726734@42034
   330
e0726734@42034
   331
\section{Bericht zum Projektverlauf}
e0726734@42034
   332
e0726734@42034
   333
\subsection{Voraussetzungen zum Arbeitsbeginn schaffen}
e0726734@42034
   334
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. Die lange Vorbereitung hat sich aber positiv auf den weiteren Verlauf des Projektes ausgewirkt.
e0726734@42034
   335
e0726734@42034
   336
\subsection{\isac{} auf die letzte Isabelle-Release updaten}
e0726734@42034
   337
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@42034
   338
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.
e0726734@42034
   339
e0726734@42034
   340
\subsection{Parsen aus {\it context}s}
e0726734@42034
   341
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
   342
e0726734@42034
   343
\subsection{Spezifikationsphase mit {\it context}s}
e0726734@42034
   344
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@42034
   345
Insgesamt verlief diese Phase trotz der langwierigen Fehlersuche entsprechend dem Zeitplan.
e0726734@42034
   346
e0726734@42034
   347
\subsection{Lösungsphase mit {\it context}s}
e0726734@42034
   348
Die Integration von {\it context}s in die Lösungsphase zur Ersetzung und Zusammenführung von Environment und Assertions konnte in enger Zusammenarbeit mit Herrn Neuper fertiggestellt werden. Der Code des Lucas-Interpreters ist jetzt sauberer und die Logik vereinfacht.
e0726734@42034
   349
e0726734@42034
   350
e0726734@42034
   351
\section{Abschließende Bemerkungen}
e0726734@42034
   352
Rückblickend betrachte ich das Projektpraktikum als sehr positive Erfahrung, da ich das Gefühl habe, etwas nicht Unwesentliches  zur Erweiterung von \sisac{} beigetragen zu haben. Die persönliche Zusammenarbeit mit Akademikern und auch die Verrichtung einer Arbeit, die nach Abschluss gebraucht und verwendet wird, ist eine Erfahrung, die ich im Verlauf meines Studiums leider erst einmal davor machen durfte.\\
e0726734@42034
   353
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@42034
   354
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@42034
   355
neuper@42035
   356
%\section*{Anhang}
neuper@42035
   357
\section{Anhang: Demobeispiel}
neuper@42035
   358
\begin{verbatim}
neuper@42035
   359
neuper@42035
   360
theory All_Ctxt imports Isac begin
neuper@42035
   361
neuper@42035
   362
text {* all changes of context are demonstrated in a mini example.
neuper@42035
   363
  see test/../mstools.sml --- all ctxt changes in minimsubpbl x+1=2 --- *}
neuper@42035
   364
neuper@42035
   365
section {* start of the mini example *}
neuper@42035
   366
neuper@42035
   367
ML {*
neuper@42035
   368
  val fmz = ["equality (x+1=(2::real))", "solveFor x", "solutions L"];
neuper@42035
   369
  val (dI',pI',mI') =
neuper@42035
   370
    ("Test", ["sqroot-test","univariate","equation","test"],
neuper@42035
   371
     ["Test","squ-equ-test-subpbl1"]);
neuper@42035
   372
  val (p,_,f,nxt,_,pt) = CalcTreeTEST [(fmz, (dI',pI',mI'))];
neuper@42035
   373
*}
neuper@42035
   374
neuper@42035
   375
section {* start of specify phase *}
neuper@42035
   376
neuper@42035
   377
text {* variables known from formalisation provide type-inference 
neuper@42035
   378
  for further input *}
neuper@42035
   379
neuper@42035
   380
ML {*
neuper@42035
   381
  val ctxt = get_ctxt pt p;
neuper@42035
   382
  val SOME known_x = parseNEW ctxt "x + y + z";
neuper@42035
   383
  val SOME unknown = parseNEW ctxt "a + b + c";
neuper@42035
   384
*}
neuper@42035
   385
neuper@42035
   386
ML {*
neuper@42035
   387
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   388
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   389
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   390
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   391
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   392
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   393
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   394
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   395
*}
neuper@42035
   396
neuper@42035
   397
section {* start interpretation of method *}
neuper@42035
   398
neuper@42035
   399
text {* preconditions are known at start of interpretation of (root-)method *}
neuper@42035
   400
neuper@42035
   401
ML {*
neuper@42035
   402
  get_assumptions_ pt p |> terms2strs;
neuper@42035
   403
*}
neuper@42035
   404
neuper@42035
   405
ML {*
neuper@42035
   406
val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   407
val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   408
val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   409
*}
neuper@42035
   410
neuper@42035
   411
section {* start a subproblem: specification *}
neuper@42035
   412
neuper@42035
   413
text {* variables known from arguments of (sub-)method provide type-inference for further input *}
neuper@42035
   414
neuper@42035
   415
ML {*
neuper@42035
   416
  val ctxt = get_ctxt pt p;
neuper@42035
   417
  val SOME known_x = parseNEW ctxt "x+y+z";
neuper@42035
   418
  val SOME unknown = parseNEW ctxt "a+b+c";
neuper@42035
   419
*}
neuper@42035
   420
neuper@42035
   421
ML {*
neuper@42035
   422
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   423
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   424
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
neuper@42035
   425
  val (p,_,f,nxt,_,pt) = me nxt p [] pt;
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
*}
neuper@42035
   431
neuper@42035
   432
section {* interpretation of subproblem's method *}
neuper@42035
   433
neuper@42035
   434
text {* preconds are known at start of interpretation of (sub-)method *}
neuper@42035
   435
neuper@42035
   436
ML {*
neuper@42035
   437
 get_assumptions_ pt p |> terms2strs
neuper@42035
   438
*}
neuper@42035
   439
neuper@42035
   440
ML {*
neuper@42035
   441
 val (p,_,f,nxt,_,pt) = me nxt p [] pt; 
neuper@42035
   442
*}
neuper@42035
   443
neuper@42035
   444
ML {*
neuper@42035
   445
  "artifically inject assumptions";
neuper@42035
   446
  val (SOME (iform, cform), SOME (ires, cres)) = get_obj g_loc pt (fst p);
neuper@42035
   447
  val ctxt = insert_assumptions [str2term "x < sub_asm_out",
neuper@42035
   448
                                 str2term "a < sub_asm_local"] cres;
neuper@42035
   449
  val pt = update_loc' pt (fst p) (SOME (iform, cform), SOME (ires, ctxt));
neuper@42035
   450
*}
neuper@42035
   451
neuper@42035
   452
ML {* 
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 {* finish subproblem, return to calling method*}
neuper@42035
   458
neuper@42035
   459
text {* transfer non-local assumptions and result from sub-method to root-method.
neuper@42035
   460
  non-local assumptions are those contaning a variable known in root-method.
neuper@42035
   461
*}
neuper@42035
   462
neuper@42035
   463
ML {*
neuper@42035
   464
  terms2strs (get_assumptions_ pt p);
neuper@42035
   465
*}
neuper@42035
   466
neuper@42035
   467
ML {*
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
*}
neuper@42035
   471
neuper@42035
   472
section {* finish Lucas interpretation *}
neuper@42035
   473
neuper@42035
   474
text {* assumptions collected during lucas-interpretation for proof of postcondition *}
neuper@42035
   475
neuper@42035
   476
ML {*
neuper@42035
   477
  terms2strs (get_assumptions_ pt p);
neuper@42035
   478
*}
neuper@42035
   479
neuper@42035
   480
ML {*
neuper@42035
   481
  show_pt pt;
neuper@42035
   482
*}
neuper@42035
   483
neuper@42035
   484
end
neuper@42035
   485
\end{verbatim}
neuper@42035
   486
neuper@42035
   487
\bibliography{bib}
e0726734@42034
   488
\end{document}