2. Aufgabenblatt zur Vorlesung Semantik von Programmiersprachen SoSe 2017 Wolfgang Mulzer, Max Willert Abgabe bis zum 02. Mai 2017, 12 Uhr, in den Briefkasten neben Raum 111 Aufgabe 1 Die Sprache While 10 Punkte In der Vorlesung haben wir die Sprache While definiert, welche durch folgende kontextfreie Grammatik gegeben ist: A → Zahl | Var | A + A | A * A | A - A B → true | false | A = A | A ≤ A | ¬B | B ∧ B S → Var := A | skip | S ; S | if B then S else S | while B do S (a) Geben Sie einen Syntaxbaum für das folgende While-Programm: x := 1; while ¬(n ≤ 1) do (x := x * n; n := n - 1) (b) Erklären Sie informell, was passiert, wenn man das While-Programm aus (a) auf dem folgenden Zustand ausführt: [n 7→ 4, x 7→ 100]. (c) Schreiben Sie ein While-Programm, welches für zwei Eingaben m, n ∈ N die Potenz mn berechnet. Aufgabe 2 Semantische Funktionen für Zahl 10 Punkte Betrachten Sie die folgende kontextfreie Grammatik für Binärzahlen: Z → N | -N N → 0 | 1 | N0 | N1 Sei Zahl die semantische Kategorie aller (syntaktischen) Zahlen, welche sich aus Z ableiten lassen. (a) Definieren Sie eine semantische Funktion N : Zahl → Z, welcher jeder syntaktischen Zahl sinnvoll ein Element aus Z zuordnet. (b) Beweisen Sie mit Hilfe von struktureller Induktion, dass N eine totale Funktion ist, d.h., jedem Element aus Zahl wird genau eine ganze Zahl aus Z zugeordnet. (c) Beweisen Sie, dass N surjektiv ist. Ist die Funktion auch injektiv? Aufgabe 3 Implementierung von While 10 Punkte (a) Implementieren Sie die abstrakte Syntax von While auf geeignete Weise in Haskell. (Notfalls auch in Java). Implementieren Sie auch die semantische Funktion N aus Aufgabe 2. (b) Versuchen Sie, eine möglichst präzise verbale Spezifikation für die Sprachkonstrukte if B then S1 else S2 und while B do S zu geben. An welchen Stellen gibt es mögliche Unklarheiten?