Grundlagen der Programmierung 2 Aufgabenblatt Nr. 7 Aufgabe 1

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 2016
Aufgabenblatt Nr. 7
Abgabe: Mittwoch 01. Juni 2016 vor! der Vorlesung
Aufgabe 1 (35 Punkte)
Wie in der Vorlesung und im Skript erläutert, kann die Auswertung einer Stackmaschine mit den
Befehlen pop, pushK, push, slide, branchz, jump und mit arithmetischen Operationen +, − und ∗
sowie Marken wie folgt als Funktion I definiert werden:
I
I
I
I
I
I
I
I
I
I
Programm
[]
(pop : prest)
((pushK k) : prest)
((push i) : prest)
(+ : prest)
(− : prest)
(∗ : prest)
((slide m n) : prest)
(marke : prest)
((branchz marke) : prest)
I (jump marke) : prest)
Stack
stack
(a : srest)
stack
stack
(a : b : srest)
(a : b : srest)
(a : b : srest)
stack
stack
(a : srest)
Kopie
prg
prg
prg
prg
prg
prg
prg
prg
prg
prg
−→
−→
−→
−→
−→
−→
−→
−→
−→
−→
stack
prg
−→
Nächster Aufruf (Resultat)
stack
I prest srest prg
I prest (k : stack ) prg
I prest ((stack !!i) : stack ) prg
I prest (b + a : srest) prg
I prest (b − a : srest) prg
I prest (b ∗ a : srest) prg
I prest (take m stack ++ (drop (n + m) stack )) prg
I prest stack prg
if (0 == a) then
I (dropWhile (marke /=) prg) srest prg
else I prest srest prg
I (dropWhile (marke /=) prg) stack prg
a) Führen Sie das Stackmaschinenprogramm (bestehend aus 15 Befehlen)
1
2
3
4
5
pushK
pushK
-;
pushK
push
5;
1;
9;
1;
marke1;
7 slide 2 1;
8 push 1;
9 push 0;
10 -;
6
11
12
13
14
15
branchz marke2;
pushK 3;
jump marke1;
marke2;
pop;
beginnend mit leerem Stack per Hand entsprechend der obigen Regeln aus, indem Sie das Programm und den Stack nach Ausführung jedes Befehls angeben.
(10 Punkte)
b) In dieser Aufgabe soll die Stackmaschine in Haskell implementiert werden. Befehle der Stackmaschine werden durch den folgenden Datentyp Kommando repräsentiert. Für Marken werden dabei
Zahlen verwendet und die arithmetischen Operationen werden durch den Datentyp ArithOp
zusammengefasst:
data Kommando = PushK Int | Pop | Push Int | Op ArithOp | Mark Marke
| Jump Marke | Branchz Marke | Slide Int Int
deriving (Eq,Show)
type Marke = Int
data ArithOp = Add | Mult | Sub | Div
deriving(Eq,Show)
1
Ein Stackmaschinenprogramm ist eine Liste von Befehlen und der Stack ist eine Liste von Zahlen:
type Programm = [Kommando]
type Stack = [Int]
Implementieren Sie in Haskell eine Funktion runProgramm :: Programm -> Stack, die ein
Stackmaschinenprogramm erwartet und den resultierenden Stack als Ergebnis liefert. Implementieren Sie hierfür zunächst eine Hilfsfunktion
interpretiere :: Programm -> Stack -> Programm -> Stack
die genau die oben angegebene Funktion I in Haskell umsetzt und rufen Sie diese innerhalb von
runProgramm auf.
(25 Punkte)
Aufgabe 2 (65 Punkte)
In dieser Aufgabe soll die Schaltung einer Ampel betrachtet werden. Dabei wird jeder Zustand der
Ampel wie folgt modelliert:
Zustand
Rot
Rot-Gelb
Grün
Gelb
Oberste Elemente des Stacks
1, 0, 0
1, 1, 0
0, 0, 1
0, 1, 0
Dabei wird der Abschluss eines Schaltvorgangs zwischen je zwei Zuständen mit einer −1 als oberstes
Element dargestellt. Das heißt die obersten drei Elemente des Stacks [1, 0, 0, ... repräsentieren einen
noch nicht abgeschlossenen Schaltvorgang, während die obersten vier des Stacks [−1, 1, 0, 0, ... einen
abgeschlossenen Schaltvorgang darstellen. Bei allen Teilaufgaben ist das oberste Stack-Element anfangs
größer −1.
Zur Lösung der folgenden Aufgaben kann der Stackmaschinen Simulator nützlich sein:
http://www.ki.informatik.uni-frankfurt.de/stackmachine
a) Implementieren Sie ein Stackprogramm, das von Rot auf Rot-Gelb schaltet. Hierzu muss nicht
geprüft werden, ob die Ampel aktuell rot ist.
(5 Punkte)
b) Implementieren Sie ein Stackprogramm, das den Stack [1] zurückliefert, wenn die Ampel grün
ist, andernfalls soll [0] als Ergebnis berechnet werden. Sie können annehmen, dass der Stack
anfangs nur drei beliebige Elemente gemäß der obigen Tabelle enthält.
(20 Punkte)
c) Implementieren Sie ein Stackprogramm, das den aktuellen Zustand erkennt und den Folgezustand
berechnet. Beachten Sie, dass nach dem abgeschlossenen Schaltvorgang −1 oben auf dem Stack
liegen muss.
(30 Punkte)
d) Implementieren Sie ein Stackprogramm, das den Ampelzyklus endlos durchlaufen lässt. Hierzu
genügt eine Erweiterung Ihrer Lösung aus Aufgabenteil c). Für diese Teilaufgabe ist die schrittweise Ausführung mit dem Stackmaschinen Simulator zum Testen sinnvoll.
(10 Punkte)
2