Prof. Dr. Manfred Schmidt-Schauß Künstliche Intelligenz/Softwaretechnologie Fachbereich Informatik und Mathematik/ Institut für Informatik Goethe-Universität Frankfurt am Main Grundlagen der Programmierung 2 Sommersemester 2012 Aufgabenblatt Nr. 7 Abgabe: Mittwoch 30. Mai 2012 vor! der Vorlesung Aufgabe 1 (35 Punkte) Gegeben sei folgende kontextfreie Grammatik G = (N, T, P, σ) mit N = {R, S} T = {|, +, =} = { R R S S σ = S P → → → → |R|, =, |S|, |+|R||} a) Berechnen Sie alle Worte aus T ∗ , die durch höchstens vier Linksherleitungsschritte mithilfe von G erzeugt werden können. (25 Punkte) b) Beschreiben Sie natürlichsprachlich, welche Sprache G erzeugt. (10 Punkte) Aufgabe 2 (65 Punkte) Syntaxbäume für arithmetische Ausdrücke seien durch den folgenden Haskell-Datentypen dargestellt: data ArExp = ArExp :+: ArExp | ArExp :-: ArExp | ArExp :*: ArExp | Zahl Int deriving(Show,Eq) Hier sind :+:, :-: und :*: zweistellige Infix-Konstruktoren. Außerdem sei der Befehlssatz einer Stackmaschine S durch folgenden Datentypen dargestellt: data StackCmd = Pop | Push Int | PushK Int | Negate | Add | Mult deriving(Show,Eq) Die Semantik der Befehle sei folgendermaßen definiert: • push i: Legt das i-te Stackelement von oben in Kopie oben auf den Stack. Das oberste Element ist das 0-te Stackelement. • pushK k: Legt die Konstante k oben auf den Stack. • pop: Nimmt das oberste Element vom Stack. 1 • add: Addiert die obersten beiden Elemente des Stacks: Wenn a, b, ... oben auf dem Stack liegen, liegt danach b + a, ... auf dem Stack. • mult: Multipliziert die obersten beiden Elemente des Stacks: Wenn a, b, ... oben auf dem Stack liegen, liegt danach b · a, ... auf dem Stack. • neg: Negiert das oberste Element des Stack. Ein Stack wird durch eine Liste von Integern repräsentiert (d.h. der Stack ist vom Typ [Int]). a) Geben Sie den Ausdruck ((3+4)*(6-7))+12 als Wert des Datentyps ArExp an. (7 Punkte) b) Welcher Ausdruck wird durch das folgenden Stackmaschinenprogramm beschreiben? [PushK 17,PushK 10,Negate,Add,PushK 3,Add,PushK 2,PushK 3,Add,Mult] Führen Sie das Stackmaschinenprogramm per Hand aus, indem Sie folgenden Tabelle ausfüllen: Programm [PushK 17, PushK 10,Negate,Add,PushK 3,Add,PushK 2,PushK 3,Add,Mult] [PushK 10,Negate,Add,PushK 3,Add,PushK 2,PushK 3,Add,Mult] ... Stack [ ] [17] ... (13 Punkte) c) Implementieren Sie in Haskell einen Code-Erzeuger (codeErzeuger :: ArExp -> [StackCmd]), der als Eingabe einen Syntaxbaum des Typs ArExp erhält, und als Ausgabe die Liste von Befehlen des Typs StackCmd erzeugt. Welches Programm wird für den Ausdruck aus Aufgabenteil a) erzeugt? (20 Punkte) d) Implementieren Sie in Haskell eine Funktion exec :: StackCmd -> [Int] -> [Int], die einen Befehl auf einem Stack ausführt und anschließend den resultierenden Stack als Ergebnis liefert. (15 Punkte) e) Implementieren Sie in Haskell eine Funktion runPrg:: [StackCmd] -> [Int], die Stackmaschinenprogramme auf einem anfänglich leeren Stack ausführt und den resultieren Stack als Ergebnis liefert. Lassen Sie das von Ihnen in Aufgabenteil c) erzeugte Programm mittels runPrg ausführen. (10 Punkte) 2