Praktikum Funktionale Programmierung 3. Besprechung Professur für Künstliche Intelligenz und Softwaretechnologie Sommersemester 2007 Teil 1 Meilenstein 1 Teil 2 Status Status Teil 1 sollte bis heute abgeschlossen sein. Wie ist der Stand? Professur KIST, SoSe 2007 2 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Zeitplan Abschluss Meilenstein 1 Zeitplan Meilenstein 1 Teil 1: Lexen und Parsen Teil 2: Semantische Analyse und Transformation 30. April (2 Wochen) 07. Mai (1 Woche) Meilenstein 2 Teil 3: Abstrakte Maschinen Mark 1 und Mark 2 Teil 4: de Bruijn-Indices und die Mark 3 28. Mai (3 Wochen) 11. Juni (2 Wochen) Meilenstein 3 Teil 5: Nebenläufigkeit: Concurrent Mark 3 Teil 6: Codeerzeugung, Compiler, Interpreter und VM Teil 7: Verbesserungen: Garbage Collection Professur KIST, SoSe 2007 2. Juli (3 Wochen) 9. Juli (1 Woche) 16. Juli (1 Woche) 3 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Zeitplan Abschluss Meilenstein 1 Nächste Woche Montag: Abgabe der Ausarbeitung (aktueller Stand) Einchecken der Programme Präsentation der Ergebnisse von Meilenstein 1: ca. 20 Minuten pro Gruppe Termine Montag ab 14:00 Dienstag bis 12:00 Mittwoch ab 14:00 Donnerstag Freitag Professur KIST, SoSe 2007 4 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Semantische Analyse Aufgabe Implementieren Sie im Modul LFPC.SemAna.RenameBV die Funktion renameLFPC :: CoreLFPC -> [Var] -> (CoreLFPC,[Var]) die einen Ausdruck und eine Liste von neuen Variablennamen erwartet die gebundenen Variablen durch Verwendung der neuen Variablennamen umbenennt ein Paar bestehend aus dem umbenannten Ausdruck und den nicht verwendeten Variablennamen zurück gibt. Gleichzeitig soll dabei geprüft werden, ob freie Variablen im Ausdruck vorkommen und in diesem Fall eine aussagekräftige Fehlermeldung generiert werden. Professur KIST, SoSe 2007 5 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Semantische Analyse: Beispiele Der Ausdruck letrec x=y in x enthält die ungebundene (freie) Variable y: Aufruf: > renameLFPC (Let [((1,8),True,"x","x") :=: V ((1,10),True,"y","y")] (V ((1,15),True,"x","x"))) [" internal"++ show x | x <- [1..]] Ausgabe: (Let [((1,8),True,"x"," internal1") :=: *** Exception: Semantical error: Found unbound variable:y Zeile: 1 Spalte: 10 Professur KIST, SoSe 2007 6 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Semantische Analyse: Beispiele Der Ausdruck letrec x = (\x -> x) in x ist geschlossen, aber die gebundenen Variablen sollen umbenannt werden. Aufruf: > (fst . renameLFPC) (Let [((1,8),True,"x","x") :=: Lambda ((1,12),True,"x","x") (V ((1,17),True,"x","x"))] (V ((1,22),True,"x","x")) [" internal"++ show x | x <- [1..]] Ausgabe: Let [((1,8),True,"x"," internal1") :=: Lambda ((1,12),True,"x"," internal2") (V ((1,12),True,"x"," internal2"))] (V ((1,8),True,"x"," internal1")) Das zweite Argument der Ausgabe ist dann gerade die Liste [" internal3"," internal4",. . .] Professur KIST, SoSe 2007 7 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Semantische Analyse Wie funktionierts? rekursiv durch den Term laufen bei gebundener Variablen (Binder sind lambda, letrec-Bindungen, Pattern): die Variable merken“, umbenennen und den neuen Namen merken ” bei freier Variablen: nachschauen, ob man sich die Variable gemerkt“ hat: ” Falls nicht vorhanden, dann Fehler Falls vorhanden: Umbenennen beim rekursiven Durchlaufen muss man immer das richtige Gemerkte mit sich führen. z.B. (s t) und bisherige gemerkte Variablen mp: Dann für beide Teile der Applikation mit dem gleichen mp starten, aber man muss es trotzdem sequentiell machen, wg. den neuen Namen (bevor man t umbenennt muss man wissen, welche neuen Variablennamen die Umbenennung von s schon verbraucht hat.) z.b. ((\x -> x) x) muss zu einem Fehler führen da x rechts frei ist. Professur KIST, SoSe 2007 8 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Wie merken? Datenstruktur Map aus dem Modul Data.Map (Doku: http://www.haskell.org/ghc/docs/6.6/html/libraries/base/Data-Map.html) Man sollte das Modul qualifiziert importieren (da Funktionsnamen denen aus der Prelude gleichen) > import qualified Data.Map as Map data Map k a polymorph über Schlüsseln k und Einträge a Nützliche Funktionen auf Map: empty :: Map k a erzeugt leere Map lookup :: Ord k => k -> Map k a -> Maybe a Nachschauen, ob ein Eintrag vorhanden ist (ergibt Just x, oder Nothing) insert :: Ord k => k -> a -> Map k a -> Map k a Einfügen eines neuen Eintrages, ...if the key is already present in the map, the associated value is replaced with ” the supplied value-...“ Professur KIST, SoSe 2007 9 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Transformation in CoreLFPCR Aufgabe Implementieren Sie im Modul LFPC.CoreL.TransCode eine Funktion transLFPCtoLFCPR :: CoreLFPC -> [Var]-> (CoreLFPCR,[Var]), die einen Ausdruck vom Typ CoreLFPC und eine Liste (neuer) Variablennamen erhält und ein Paar liefert, bestehend aus dem CoreLFPCR-Ausdruck und der Restliste von Variablennamen (jene, die nicht benutzt wurden). Professur KIST, SoSe 2007 10 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC data CoreLFPCR = V Var | App CoreLFPCR Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = data Bind = Var :=: CoreLFPCR CoreVar :=: CoreLFPC type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Professur KIST, SoSe 2007 12 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC data CoreLFPCR = V Var | App CoreLFPCR Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = data Bind = Var :=: CoreLFPCR CoreVar :=: CoreLFPC type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Alle CoreVar sind nun Var Professur KIST, SoSe 2007 12 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC data CoreLFPCR = V Var | App CoreLFPCR Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = data Bind = Var :=: CoreLFPCR CoreVar :=: CoreLFPC type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Alle CoreVar sind nun Var Professur KIST, SoSe 2007 2. Argument von App: Nur Variablen erlaubt! 12 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC data CoreLFPCR = V Var | App CoreLFPCR Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = data Bind = Var :=: CoreLFPCR CoreVar :=: CoreLFPC type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Alle CoreVar sind nun Var Professur KIST, SoSe 2007 2. Argument von App: Nur Variablen erlaubt! 3. Argument von Cons: Nur Variablenlisten erlaubt! 12 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Wie funktionierts? CoreLFPC-Term rekursiv durchlaufen und CoreLFPCR-Term daraus bauen CoreVar werden zur Var App s t wird zu Let [" internXY":=: t] (App s " internXY"), wobei " internXY" neue Variable. entsprechend für Konstruktorapplikationen. Professur KIST, SoSe 2007 13 Praktikum Funktionale Programmierung, 3. Besprechung Teil 1 Meilenstein 1 Teil 2 Semantische Analyse Transformation in CoreLFPCR Wie funktionierts? Aufpassen Wegen gleicher Konstruktornamen (App usw.), sollten am besten beide Module LFPC.CoreL.CoreExpression und LFPC.CoreL.MachineExp qualifiziert importiert werden. import qualified LFPC.CoreL.MachineExp as M import qualified LFPC.CoreL.CoreExpression as C dann ist M.App gerade das App von CoreLFPCR und C.App das App von CoreLFPC Professur KIST, SoSe 2007 14 Praktikum Funktionale Programmierung, 3. Besprechung