Teil 2 - Professur für Künstliche Intelligenz und Softwaretechnologie

Werbung
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
Herunterladen