Prof. Dr. Manfred Schmidt-Schauß Goethe-Universit¨at Frankfurt am Main/ Institut f¨ur Informatik
M.Sc. Nils Dallmeyer K¨unstliche Intelligenz/Softwaretechnologie
Grundlagen der Programmierung 2
Sommersemester 2018
Aufgabenblatt Nr. 7
Abgabe: Mittwoch 30. Mai 2018 vor! der Vorlesung
Aufgabe 1 (35 Punkte)
Wie in der Vorlesung und im Skript erl¨autert kann die Auswertung einer Stackmaschine mit den Befehlen pop,pushK,push,slide, branchz,jump und mit arithmetischen Operationen +,−, und∗ sowie Marken wie folgt als FunktionI definiert werden:
Programm Stack Kopie N¨achster Aufruf (Resultat)
I [] stack prg −→stack
I (pop:prest) (a:srest) prg −→I prest srest prg I ((pushKk) :prest) stack prg −→I prest (k:stack)prg
I ((pushi) :prest) stack prg −→I prest ((stack!!i) :stack)prg I (+ :prest) (a:b:srest)prg −→I prest (b+a:srest)prg I (−:prest) (a:b:srest)prg −→I prest (b−a:srest)prg I (∗:prest) (a:b:srest)prg −→I prest (b∗a:srest)prg
I ((slidem n) :prest) stack prg −→I prest (takemstack ++(drop(n+m)stack)) prg I (marke:prest) stack prg −→I prest stack prg
I ((branchzmarke) :prest) (a:srest) prg −→if (0 ==a)then
I (dropWhile(marke /=)prg)srest prg elseI prest srest prg
I (jumpmarke) :prest) stack prg −→I (dropWhile(marke /=)prg)stack prg
a) F¨uhren Sie das Stackmaschinenprogramm (bestehend aus 15 Befehlen)
1 pushK 11;
2 pushK 13;
3 push 1;
4 -;
5 push 0;
6 marke1;
7 branchz marke2;
8 slide 1 1;
9 pushK 2;
10 pushK 4;
11 *;
12 pushK 8;
13 -;
14 jump marke1;
15 marke2
beginnend mit leerem Stack per Hand entsprechend der obigen Regeln aus, indem Sie das Pro- gramm und den Stack nach Ausf¨uhrung jedes Befehls angeben. (10 Punkte) b) In dieser Aufgabe soll die Stackmaschine in Haskell implementiert werden. Befehle der Stack- maschine werden durch den folgenden Datentyp Kommando repr¨asentiert. F¨ur Marken werden dabei Zahlen verwendet undMult,Addund Substehen f¨ur die arithmetischen Operationen:
data Befehl = PushK Int | Pop | Push Int | Mult | Add | Sub | Mark Marke
| Jump Marke | Branchz Marke | Slide Int Int deriving (Eq,Show)
type Marke = Int
Ein Stackmaschinenprogramm ist eine Liste von Befehlen und der Stack ist eine Liste von Zahlen:
1
type StackProgramm = [Befehl]
type Stack = [Int]
Implementieren Sie in Haskell eine Funktionrun :: StackProgramm -> Stack, die ein Stack- maschinenprogramm erwartet und den resultierenden Stack als Ergebnis liefert. Implementieren Sie hierf¨ur zun¨achst eine Hilfsfunktion
interpretiere :: StackProgramm -> Stack -> StackProgramm -> Stack
die genau die oben angegebene FunktionI in Haskell umsetzt und rufen Sie diese innerhalb von
runauf. (25 Punkte)
Aufgabe 2 (65 Punkte)
Abends und nachts hat man von Kowloon aus einen sch¨onen Ausblick auf die beleuchtete Skyline der Hongkong-Insel. Einige Hochh¨auser sind normal beleuchtet, andere wiederum f¨uhren in regelm¨aßigen Abst¨anden die ganze Nacht hindurch Lichtershows durch, wie zum Beispiel der Bank of China Tower.
Dieser Turm hat fachwerkartig aufgebaute Außenfl¨achen, wobei auf den Stahltr¨agern Leuchtstreifen montiert sind, die nachts dynamisch beleuchtet werden k¨onnen. Rechts ist eine Skizze des Hochhauses dargestellt. Die hellsten Linien in der Skizze k¨onnen beleuchtet werden.
Wir nutzen die Stackmaschine um die Abfolge der verschiedenen Lichtershows umzusetzen. Dabei enth¨alt der Stack drei Elemente, die wie folgt kodieren, welche Lichtershow gerade l¨auft:
Nr. Stack Lichtershow 1 [0,0,0] Alle Lichter aus 2 [0,0,1] Sterne 1
3 [0,1,0] Außen nach innen 4 [0,1,1] Aufsteigende Linien
5 [1,0,0] Abwechselndes An- und Abschalten aller Lichter 6 [1,0,1] Sterne 2
7 [1,1,0] Blitz
8 [1,1,1] Alle Lichter an
Zur L¨osung der folgenden Aufgaben kann der Stackmaschinen-Simulator n¨utzlich sein:
http://www.ki.informatik.uni-frankfurt.de/stackmachine
a) Angenommen aktuell sei die Lichtershow 5 aktiv, das heißt [1,0,0]. Implementieren Sie ein Stackprogramm, das den Wechsel zur Lichtershow 8 vollzieht, das heißt es soll der Stack [1,1,1]
zur¨uckgeliefert werden. (5 Punkte)
b) Implementieren Sie ein Stackprogramm, das den Stack [1] zur¨uckliefert, falls Lichtershow 7 aktiv ist, andernfalls soll [0] als Ergebnis berechnet werden. Sie k¨onnen annehmen dass der Stack genau
drei Elemente enth¨alt. (20 Punkte)
c) Nach jeder Lichtershow werden zun¨achst alle Lichter eine Zeit lang angeschaltet (Lichtershow 8), bevor die n¨achste Lichtershow beginnt. Geben Sie ein Stackprogramm an, das in einer Endloss- chleife der Reihe nach wie eben beschrieben die Lichtershows gem¨aß obiger Tabelle numerisch
2
aufsteigend von 2 bis 7 durchf¨uhrt – die Lichter sind nur tags¨uber aus, weshalb die Lichter- show 1 hierbei ausgenommen ist, genauso wie die Lichtershow 8 nicht mehrfach hintereinander vorkommt.
Implementiert werden soll also eine Endlosschleife der folgenden Form, wobei die jeweilige Zahl der Nummer der Lichtershow der obigen Tabelle entspricht: 2,8,3,8,4,8,5,8,6,8,7,8,2,8, ....
Um zu kodieren, dass ein Wechsel zwischen zwei Lichtershows abgeschlossen ist, soll nach jedem abgeschlossenem Wechsel eine−1 oben auf den Stack gelegt werden – sobald der n¨achste Wechsel beginnt ist sie wieder direkt zu entfernen. Gehen Sie davon aus, dass der Stack zu Beginn wie folgt aussieht: [−1,1,1,1]
Reduzieren Sie die Anzahl der Schritte ihres Programms, indem Sie beim Wechsel zweier Lichter- shows m¨oglichst viel des aktuellen Stacks wiederverwenden. Bei zwei verschiedenen L¨osungen mit gleich vielen Schritten ist diejenige mit der geringeren Anzahl an Elementen auf dem Stack
vorzuziehen. (40 Punkte)
3