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