Praktikum Funktionale Programmierung Teil 2: Semantische Analyse und Transformation in CoreLFPCR Professur für Künstliche Intelligenz und Softwaretechnologie Sommersemester 2009 Teil 1 Meilenstein 1 Teil 2 Status Status Teil 1 sollte bis heute abgeschlossen sein. Wie ist der Stand? Professur KIST, SoSe 2009, 27. April 2009 2 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Abschluss Meilenstein 1 Zeitplan Meilenstein 1 Teil 1: Lexen und Parsen Teil 2: Semantische Analyse und Transformation 27. April (2 Wochen) 4. Mai (1 Woche) Meilenstein 2 Teil 3: Abstrakte Maschinen Mark 1 und Mark 2 1. Juni (4 Wochen) Meilenstein 3 Teil 5: Nebenläufigkeit: Concurrent Mark 2 Teil 6: Codeerzeugung, Compiler, Interpreter und VM Teil 7: Verbesserungen: Garbage Collection Professur KIST, SoSe 2009, 27. April 2009 22. Juni (3 Wochen) 6. Juli (2 Wochen) 13. Juli (1 Woche) 3 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 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 im Anschluss Dienstag bis 12:00 Mittwoch ab 14:00 Donnerstag Freitag Professur KIST, SoSe 2009, 27. April 2009 4 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick Semantische Analyse Transformation in CoreLFPCR Teil 2: Semantische Analyse und Transformation in CoreLFPCR Professur KIST, SoSe 2009, 27. April 2009 5 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick Semantische Analyse Transformation in CoreLFPCR Semantische Analyse Aufgabe 4 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 2009, 27. April 2009 6 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick 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 2009, 27. April 2009 7 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick 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 2009, 27. April 2009 8 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick 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 2009, 27. April 2009 9 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick Semantische Analyse Transformation in CoreLFPCR Wie merken? Datenstruktur Map aus dem Modul Data.Map (Doku: http://www.haskell.org/ghc/docs/latest/html/libraries/containers/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 2009, 27. April 2009 10 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick 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 2009, 27. April 2009 11 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Seq CoreLFPC CoreLFPC | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC Überblick Semantische Analyse Transformation in CoreLFPCR data CoreLFPCR = App CoreLFPCR Var | V Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Seq CoreLFPCR CoreLFPCR | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = CoreVar :=: CoreLFPC data Bind = Var :=: CoreLFPCR type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Professur KIST, SoSe 2009, 27. April 2009 12 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Seq CoreLFPC CoreLFPC | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC Überblick Semantische Analyse Transformation in CoreLFPCR data CoreLFPCR = App CoreLFPCR Var | V Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Seq CoreLFPCR CoreLFPCR | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = CoreVar :=: CoreLFPC data Bind = Var :=: CoreLFPCR type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Alle CoreVar sind nun Var Professur KIST, SoSe 2009, 27. April 2009 12 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick Semantische Analyse Transformation in CoreLFPCR data CoreLFPCR = App CoreLFPCR Var | V Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Seq CoreLFPCR CoreLFPCR | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Seq CoreLFPC CoreLFPC | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = CoreVar :=: CoreLFPC data Bind = Var :=: CoreLFPCR type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Alle CoreVar sind nun Var 2. Argument von App: Nur Variablen erlaubt! Professur KIST, SoSe 2009, 27. April 2009 12 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick Semantische Analyse Transformation in CoreLFPCR data CoreLFPCR = App CoreLFPCR Var | V Var | Lambda Var CoreLFPCR | Let [Bind] CoreLFPCR | Cons Int Int [Var] | Case CoreLFPCR [Alt] | Seq CoreLFPCR CoreLFPCR | Amb CoreLFPCR CoreLFPCR | Por CoreLFPCR CoreLFPCR data CoreLFPC = V CoreVar | App CoreLFPC CoreLFPC | Lambda CoreVar CoreLFPC | Let [Bind] CoreLFPC | Cons Int Int [CoreLFPC] | Case CoreLFPC [Alt] | Seq CoreLFPC CoreLFPC | Amb CoreLFPC CoreLFPC | Por CoreLFPC CoreLFPC data Alt = Alt Int Int [CoreVar] CoreLFPC data Alt = Alt Int Int [Var] CoreLFPCR data Bind = CoreVar :=: CoreLFPC data Bind = Var :=: CoreLFPCR type CoreVar = (CodeMark,Bool,Var,Var) type Var = String Alle CoreVar sind nun Var 2. Argument von App: Nur Variablen erlaubt! Professur KIST, SoSe 2009, 27. April 2009 3. Argument von Cons: Nur Variablenlisten erlaubt! 12 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick 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 2009, 27. April 2009 13 Praktikum Funktionale Programmierung, Teil 2 Teil 1 Meilenstein 1 Teil 2 Überblick 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 2009, 27. April 2009 14 Praktikum Funktionale Programmierung, Teil 2