3.Besprechung - Professur für Künstliche Intelligenz und

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