Gedächtnisprotokoll zur mündlichen Diplomprüfung im Kurs
1816 "logische und funktionale Programmierung"
Prüfungsdatum: 28.1.2002
Prüfer: Prof. Beierle
Note: 1,0
Beisitzer: Gab's auch, Name ist an mir vorbei gegangen.
Fragen:
-
Sie kennen ja imperative Programmierung, was ist bei der logischen
Programmierung anders?
Ich habe erst mal spontan "Alles" gesagt und dann ungeordnet aufgezählt:
Anderes Berechenbarkeitsmodell, beruht auf der Prädikatenlogik 1.
Stufe, Programm besteht aus Klauseln, die nur deklarativ die Bedeutung
festlegen, keine globalen Variablen, bei rein logischer Programmierung
keine Seiteneffekte
-
Wie sieht das konkret aus, z. B. bei einem Programm für ein append?
Ich habe dann angefangen aufzuschreiben: erst mal als Faktum append(A,[],A).
Dann als Regel append([K|R],A,[K|R2]) :- append(R,A,R2). Dabei festgestellt,
daß das Faktum nicht paßt, und append([],A,A) noch dadrüber
geschrieben und dazu gesagt, daß durch die Rekursion das erste Element
abgebaut wird, bis schließlich das Faktum paßt. Er fragte dann
noch nach, ob ich die Fallunterscheidung nicht doch wie ursprünglich
geplant im zweiten Argument machen könnte. Ich guckte etwas verwirrt,
worauf er ir dagte, daß er mich nicht verwirren wolle. Ich fing an
zu zeichen, erkläre, daß es mit dem zweiten Argument nicht paßt,
weil ich nur ans erste und nicht ans letzte Listenelement käme, worauf
er dann das Thema wechselte:
-
Es gibt ja auch die nichtlogischen Komponenten in Prolog, welche? Ich sagte
"Cut", holte Luft und er fragte weiter: Ja, erklären sie den mal.
Daraufhin habe ich dann schnell etwas übers Backtracking erzählt
und dann erklärte, daß das Backtracking genau das unterbinde.
Er fragte dann nach einem konkreten Beispiel. Mir fiel nichts passendes
ein und ich habe dann sinnfreie Prädikate genommen. Ich drückte
mich zunächst nicht ganz korrekt aus, weil ich sagte, der Cut verhindere,
daß ein Backtracking-Punkt (er sagte wohl "Wahlpunkt") angelegt wird.
Er fragte dann nach, wann der Wahlpunkt angelegt wird (bei Betrachtung
der Klauselköpfe) und wann der Cut verarbeitet wird (auf der linken
Klauselseite), weshalb ich mich dann korrigierte zu "der Cut löscht
den Wahlpunkt vom Stack". Dann fragte er noch, was bei mehr alternativen
Klauseln passieren würde. Ich sagte dann, daß diese alle nicht
mehr ausprobiert werden, wenn der Cut erreicht wird.
-
Was ist ein Akkumulator? Eine Programmiertechnik, die eine Hilfsdatenstruktur
für Zwischenergebnisse verwendet. Zeigen Sie das doch mal am Beispiel
vom reverse. Ich habe dann die reverse-Klauseln wie im Kurstext aufgeschrieben
und dazu erklärt, wie wann welche Parameter verwendet werden.
-
Was ist funktionale Programmierung? Programmierung mit Funktionen, wobei
diese Ein- und Ausgabeparameter von Funktionen sein können, in den
Funktionen gibt es dann Funktionsaufrufe, ggf. auch rekursiv, und Fallunterscheidungen
-
Wie läuft das ab? Im Interpreter in einer Lesen-Auswerten-Schreiben-Schleife
(das war glaube ich nicht so wichtig), ein Programm ist ein Ausdruck, der
vom Interpreter ausgewertet wird. Nachfrage: Wie wertet er aus? Bindung,
Rahmen, Umgebung erklärt (das war wohl der wichtige Punkt)
-
Was ist ein Abschlußobjekt? Eine Bindung für ein Funktionssymbol
zusammen mit einem Verweis auf die Definitionsumgebung. Dadurch wird statische
Bindung möglich, die Variablenwerte ergeben sich also aus dem nackten
Programmtext und sind von der Aufrufreihenfolge unabhängig.
-
Geben Sie doch mal ein Beispiel an - (einen Moment fürchtete ich hier,
er wolle ein Beispiel zu statischer und dynamischer Bindung) - z. B. wieder
für das append. Ich habe dann das append in Lisp aufgeschrieben. Ich
hatte zunächst einen Fehler im null?-Teil des if - Rückgabe
war bei mir '(), und ich hatte sogar laut überlegt, ob ich das Quote
setzen muß. Er hat mich erst zuende schreiben lassen und dann gesagt,
"schauen sie sich das if noch mal an, was soll die Funktion machen?", worauf
ich dann noch mal guckte und korrigierte, daß die zweite Eingabeliste
Ausgabe sein muß.
-
Was sind Streams, und wozu braucht man sie? Verallgemeinerte endliche oder
unendliche Listen, Mittel, um komplexe Aufgaben auf mehrere kleinere Programme
mit einer einheitlichen Schnittstelle zu verteilen. Diese akzeptieren jeweils
einen Stream als Eingabe und geben meist auch einen raus. Wie implementiert
man unendliche Streams? Als Paar aus Startwert und einem Funktionsobjekt,
daß angibt, wie daraus die weiteren Werte berechnet werden können.
-
Im Kurs geht es ja noch um constraintlogische Programmierung, was sind
Constraints? Bedingungen, die an die Instantiierung der ansonsten universalen
logischen Variablen gestellt werden. Müssen für vollständig
instantiierte Eingaben effektiv überprüfbar sein.
-
Was ändert sich im Vergleich zu normalen Prolog? Constraint-Solver
kommt hinzu, schränkt Suchraum im Vorweg ein. Konkretisierung der
Frage: Was ändert sich bei der Unifikation? Unifikation mit Domainvariablen
erläutert.
-
Er hat dann irgendwie nach den erweiterten Inferenzregeln gefragt, ich
weiß nicht mehr, wie. Ich habe dann FCIR erklärt. Anschließend
befand er, daß die Zeit um sei.
Gesamteindruck: Sehr gut. Ich habe mich eine knappe halbe Stunde vor dem
eigentlichen Prüfungstermin bei seiner Sekretärin gemeldet. Er
kam dann gleich, begrüßte mich und fragte, ob wir gleich anfangen
können. Er hat dann den Beisitzer geholt, mir die Finanzamtsbescheinigung
gegeben, kurz gefragt, ob es um den Kurs logische und funktionale Programmierung
gehen soll, und angefangen. Das war zwar nicht großer Smalltalk wie
bei einigen Kollegen, war aber ausreichend, damit ich chronisches Nervenbündel
mich einigermaßen sammeln konnte.
Für seine Fragen hatte er einen Stapel Karteikarten, auf denen
anscheinend sortiert Stichpunkte zum Kurs standen, und hat zu vielleicht
etwa jeder dritten eine Frage gestellt. Wie oben hoffentlich herauskommt,
fing er zu den drei Bereichen sehr allgemein an und hat dann allmählich
konkretere Fragen gestellt. Dabei hat er mich immer erst mal ausreden oder
-schreiben lassen und wies anschließend bei Bedarf auf Stellen hin,
die falsch oder noch nicht präzise genug waren. Ich habe die Programme
natürlich genau aufgeschrieben, ansonsten entweder nur geredet oder
bei Bedarf eher halbformal die Definitionen mitgeschrieben, z. B. bei der
Unifikation oder beim FCIR, und dazu erzählt, was die Sachen im einzelnen
bedeuten. War offensichtlich so in Ordnung.
Ich hatte vorher befürchtet, daß er mehr Programmbeispiele
abfragt, und insbesondere Lisp-Programme für die Standardfunktionen
(map, filter, right-reduce,..) geübt. So detailliert war das zwar
anscheinend nicht nötig, aber es hat mir in dem Moment massiv geholfen,
nicht groß nachzudenken, was und wie ich klammern muß. Stures
Definitionslernen scheint überflüssig zu sein, wichtiger ist,
für alles mögliche auf die Frage "Wie funktioniert das?" antworten
zu können.