Sie sind auf Seite 1von 7

Programmierung WiSe 19/20

Lösung - Übung 1
Prof.aa
Dr. J. Giesl S. Dollase, M. Hark

Tutoraufgabe 1 (Syntax und Semantik):


a) Die Menge der syntaktisch korrekten einfachen arithmetischen Ausdrücke (EAA) wird durch die Gram-
matik G1 = ({S1 }, {(, ), ; , plus, s, O}, P1 , S1 ) definiert, wobei P1 genau die folgenden Produktionsregeln
enthält:

S1 → O
S1 → s(S1 )
S1 → plus(S1 ; S1 )

Die Semantik W(A) eines syntaktisch korrekten EAAs A ist wie folgt definiert, wobei x und y ebenfalls
syntaktisch korrekte EAAs sind:

W(O) = 0
W(s(x)) = W(x) + 1
W(plus(x; y)) = W(x) + W(y)

Für alle EAAs A gilt also W(A) ∈ N.

Geben Sie für die folgenden drei Ausdrücke an, ob es sich um einen syntaktisch korrekten EAA handelt
und welche Semantik er hat.
i) plus(s(O); O) ii) plus(O; s(O); O) iii) plus(plus(O; s(O)); s(plus(O; O)))

b) Beweisen oder widerlegen Sie: Zwei Ausdrücke mit gleicher Syntax haben auch die gleiche Semantik.
c) Beweisen oder widerlegen Sie: Ein syntaktisch korrektes Programm ist auch semantisch korrekt.

Lösung:

a) i) Der Ausdruck ist syntaktisch korrekt und seine Semantik ist 1.


ii) Der Ausdruck ist syntaktisch nicht korrekt und er hat daher keine Semantik.
iii) Der Ausdruck ist syntaktisch korrekt und seine Semantik ist 2.
b) Die Aussage ist falsch. Betrachten wir den (nicht einfachen) arithmetischen Ausdruck 1 / 2. In der
Sprache Java wird dieser Ausdruck zu 0 ausgewertet, da Java bei der Division zweier ganzer Zahlen die
Ganzzahldivision ohne Rest verwendet. In der Sprache Prolog wird dieser Ausdruck hingegen zu 0.5 ausge-
wertet, da Prolog für den Operator / grundsätzlich Fließkommadivision verwendet. Dieses Gegenbeispiel
widerlegt die Aussage.
c) Die Aussage ist falsch. Ein Programm ist semantisch korrekt, wenn es genau die Anforderungen erfüllt, für
die es entwickelt wurde. Lautet die Anforderung, dass das Programm die ersten eintausend Primzahlen
ausgeben soll, so ist ein syntaktisch korrektes Programm, welches stattdessen “Hello world!” ausgibt,
nicht semantisch korrekt. Dieses Gegenbeispiel widerlegt die Aussage.

1
Programmierung WiSe 19/20
Lösung - Übung 1

Aufgabe 2 (Syntax und Semantik): (2 + 1 + 1 = 4 Punkte)


a) Die Menge der syntaktisch korrekten SASP Programme wird durch die Grammatik G2 =
({A, B, S2 }, {., :-, p, q, r, s}, P2 , S2 ) definiert, wobei P2 genau die folgenden Produktionsregeln enthält:

S2 → A.
S2 → A.S2
A → B
A → B:-B
B → p
B → q
B → r
B → s

Die Semantik W(P) eines syntaktisch korrekten SASP Programms P ist wie folgt definiert, wobei P 0
ebenfalls ein syntaktisch korrektes SASP Programm ist und x, y ∈ {p, q, r, s}:

W(x.) = {x}
W(x:-y.) = ∅
0
W(P x.) = W(P 0 ) ∪ {x}
(
W(P 0 ) ∪ {x} falls y ∈ W(P 0 )
W(P 0 x:-y.) =
W(P 0 ) sonst

Für alle SASP Programme P gilt also W(P) ⊆ {p, q, r, s}.

Geben Sie für die folgenden drei Ausdrücke an, ob es sich um ein syntaktisch korrektes SASP Programm
handelt und welche Semantik es hat.
i) p. q :- p ii) p. q :- p. s :- r. iii) a :- r.

b) Beweisen oder widerlegen Sie: Zwei Ausdrücke mit gleicher Semantik haben auch die gleiche Syntax.
c) Beweisen oder widerlegen Sie: Ein bzgl. einer Sprache S semantisch korrektes Programm ist bzgl. S auch
syntaktisch korrekt.

Lösung:

a) i) Das Programm ist syntaktisch nicht korrekt (der . fehlt am Ende) und hat daher keine Semantik.
ii) Das Programm ist syntaktisch korrekt und seine Semantik ist {p, q}.
iii) Das Programm ist syntaktisch nicht korrekt (a ist kein Terminalsymbol der Grammatik G2 ) und
hat daher keine Semantik.
b) Die Aussage ist falsch. Betrachten wir die beiden syntaktisch korrekten, aber verschiedenen SASP Pro-
gramme p. q. und das Programm ii) aus der vorigen Teilaufgabe. Beide haben die gleiche Semantik
{p, q}, sind jedoch syntaktisch verschieden. Dieses Gegenbeispiel widerlegt die Aussage.

c) Die Aussage ist wahr. Da ein syntaktisch inkorrektes Programm keine Semantik hat, ist syntaktische
Korrektheit eine Voraussetzung für semantische Korrektheit. Per Kontraposition gilt damit direkt die
Aussage.

2
Programmierung WiSe 19/20
Lösung - Übung 1

Tutoraufgabe 3 (Formale Sprachen und Grammatiken):


Gegeben sei die folgende Sprache:
L1 = {w ∈ {a, b}∗ | auf ein a folgt nie ein b oder auf ein b folgt nie ein a}
Die folgenden Wörter sind beispielsweise in der Sprache enthalten:
aaab bbaa aa ε
Folgende Wörter sind nicht Bestandteil der Sprache:
bab abba baba
a) Geben Sie eine kontextfreie Grammatik an, welche die Sprache L1 erzeugt.
b) Geben Sie eine Grammatik in EBNF an, die L1 definiert. Ihre Grammatik darf nur aus einer Regel
bestehen und diese Regel darf nicht rekursiv sein (d. h. das Nichtterminalsymbol auf der linken Seite darf
rechts nicht auftreten).
Um die Lesbarkeit zu erhöhen, dürfen Sie Anführungszeichen um Terminalsymbole weglassen.
c) Geben Sie ein Syntaxdiagramm ohne Nichtterminalsymbole an, das die Sprache L1 definiert.

Lösung:

a) Die kontextfreie Grammatik G3 = ({S3 , A, B}, {a, b}, P3 , S3 ) erzeugt die Sprache L1 , wobei P3 genau die
folgenden Produktionsregeln enthält:
S3 → AB
S3 → BA
A → ε
A → aA
B → ε
B → bB

Mit dem Nonterminal S3 wählt man, ob man zuerst a oder b Symbole erzeugen will. Das Nonterminal
A erzeugt Wörter bestehend aus beliebig vielen a Symbolen, während B Wörter aus beliebig vielen b
Symbolen erzeugt.
b) Die folgende Grammatik in EBNF mit nur einer nicht-rekursiven Regel definiert L1 .
S3 = ({a}{b} | {b}{a})
| {z } | {z }
1 2

Diese Konstruktion ist analog zu der Grammatik aus Teilaufgabe a). In Teil (1) wird ein Wort erzeugt,
bei dem beliebig viele a Symbole vor beliebig vielen b Symbolen stehen. In Teil (2) wird ein Wort erzeugt,
bei dem beliebig viele b Symbole vor beliebig vielen a Symbolen stehen.
c) Das folgende Syntaxdiagramm definiert die Sprache L1 :

a b

b a

3
Programmierung WiSe 19/20
Lösung - Übung 1

Aufgabe 4 (Formale Sprachen und Grammatiken): (2 + 1 + 1 = 4 Punkte)


Gegeben sei die folgende Sprache:

L2 = {w ∈ {a, b}∗ | für jedes b steht vorher im Wort w mindestens ein a oder das Wort w enthält kein a}

Die folgenden Wörter sind beispielsweise in der Sprache enthalten:


aaabb abab bb ε

Folgende Wörter sind nicht Bestandteil der Sprache:


bab abba baba

a) Geben Sie eine kontextfreie Grammatik an, welche die Sprache L2 erzeugt.
b) Geben Sie eine Grammatik in EBNF an, die L2 definiert. Ihre Grammatik darf nur aus höchstens zwei
Regeln bestehen. Höchstens eine dieser Regeln darf rekursiv sein (d. h. das Nichtterminalsymbol auf der
linken Seite darf rechts auftreten).
Um die Lesbarkeit zu erhöhen, dürfen Sie Anführungszeichen um Terminalsymbole weglassen.

c) Geben Sie Syntaxdiagramme an, um die Sprache L2 zu definieren. Sie dürfen Nichtterminalsymbole
verwenden und eines der Syntaxdiagramme darf rekursiv sein.

Lösung:

a) Die kontextfreie Grammatik G4 = ({S4 , B, C}, {a, b}, P4 , S4 ) erzeugt die Sprache L2 , wobei P4 genau die
folgenden Produktionsregeln enthält:

S4 → B
S4 → C
B → bB
B → b
C → aCbC
C → aC
C → ε

Mit den ersten beiden Regeln entscheidet man, ob das Wort ein a enthält oder nicht. Aus dem Nichtter-
minal B kann man Wörter beliebiger Länge größer 0 erzeugen, die nur aus b bestehen. Mit der ersten
C Regel kann man ein b erzeugen und das zugehörige a, das vorher im Wort stehen muss. Die zweite C
Regel erzeugt beliebig viele a, die ohne weitere Einschränkung im Wort stehen dürfen. Mit der letzten
Regel kann man das leere Wort erzeugen oder C Symbole entfernen.

b) Die folgende Grammatik in EBNF mit nur zwei Regeln definiert L2 .

S4 = ({b} | C) C = {(aCb
|{z} | |{z}
a )}
1 2

Diese Konstruktion ist analog zu der Grammatik aus Teilaufgabe a). Mit S4 entscheidet man zwischen
einem Wort aus beliebig vielen b oder einem Wort, das auch a enthält. In Teil (1) der C–Regel wird ein b
mit zugehörigem a vorher im Wort erzeugt. In Teil (2) werden beliebig viele a erzeugt. Da Teil (2) auch
das leere Wort erzeugen kann, übernimmt es auch die Funktion der letzten Regel aus Teilaufgabe a).

c) Das Syntaxdiagramm für S4 definiert die Sprache L2 :

4
Programmierung WiSe 19/20
Lösung - Übung 1

C a C b
S4 C

b a

Tutoraufgabe 5 (Zweierkomplement):
a) Sei x eine ganze Zahl. Wie unterscheiden sich die Zweierkomplement-Darstellungen von x und −x?
b) Erklären Sie im Detail, wie die beiden Ausgaben des folgenden Programms berechnet werden.

public class Test {


public static void main ( String [] args ) {
int zahl = -2147483648;

System . out . println ( zahl + 1);


System . out . println ( zahl - 1);
}
}

Hinweis: −231 = −2147483648


c) Welche Zahlen repräsentieren die folgenden Bitfolgen im 5-Bit Zweierkomplement?

00010 10111 11011 01101 10000

Lösung:

a) Ausgehend von der Zweierkomplement-Darstellung von x erreicht man durch die folgenden beiden Schrit-
te die Zweierkomplement-Darstellung von −x:
a) vertausche alle 0en und 1en
b) addiere 1
Mit diesen beiden Schritten ist auch die Rückrichtung (−x zu x) möglich.
In der folgenden Tabelle finden Sie alle Binärzahlen mit drei Ziffern. Man erkennt das Muster, nach dem
das genannte Verfahren funktioniert.
3 011
2 010
1 001
0 000
-1 111
-2 110
-3 101
-4 100
b) Im Folgenden werden Binärzahlen mit einem Z markiert, wenn die Zahl im Zweierkomplement verstanden
werden muss. Die Zahl 1111 Z ist also als −1 zu verstehen, während 1111 für die Zahl 15 steht.
Der Datentyp int benutzt 32 Bit. Die Darstellung der Zahl −2147483648 im Zweierkomplement ist:

5
Programmierung WiSe 19/20
Lösung - Übung 1

10000000000000000000000000000000 Z (31 Nullen)

Das Ergebnis der Addition zahl + 1 berechnet sich wie folgt:

10000000000000000000000000000000 Z
00000000000000000000000000000001 Z
--------------------------------
10000000000000000000000000000001 Z

Auch hier gibt die führende 1 an, dass die dargestellte Zahl negativ ist. Den Dezimalwert der dargestellten
Zahl erhält man durch Invertieren und Addieren von 1:

01111111111111111111111111111110
00000000000000000000000000000001
--------------------------------
01111111111111111111111111111111

Dies steht für 2147483647. Mit der Vorzeicheninformation von oben ergibt sich -2147483647.
Berechnet man zahl - 1, berechnet sich das Ergebnis durch die Addition mit -1. Die Zahl -1 ist im
Zweierkomplement dargestellt durch:

11111111111111111111111111111111 Z

Die Addition -2147483648 + (-1) ergibt demzufolge:

10000000000000000000000000000000 Z
11111111111111111111111111111111 Z
--------------------------------
01111111111111111111111111111111 Z

Das Ergebnis ist also nicht negativ (erkennbar durch die führende 0) und entspricht der Dezimalzahl
+2147483647. Dieses Ergebnis wird auch durch das Java-Programm ausgegeben.
c)
Bitfolge 5-Bit Zweierkomplement
00010 2
10111 -9
11011 -5
01101 13
10000 -16

Aufgabe 6 (Zweierkomplement): (2,5 + 3,5 = 6 Punkte)


a) Welche Zahlen repräsentieren die folgenden Bitfolgen im 10-Bit Zweierkomplement?

0101010101 1000000000 0100101110 1100011001 1000101110

b) Die zwei folgenden Java-Ausdrücke werten jeweils zu true aus. Geben Sie dafür jeweils eine Begründung.
1) −1 000 000 000 − 1 100 000 000 − 1 200 000 000 > 0
2) −(0 − 2 000 000 000 − 147 000 000 − 483 000 − 648) < 0

Lösung:

6
Programmierung WiSe 19/20
Lösung - Übung 1

a)

Bitfolge 10-Bit Zweierkomplement


0101010101 341
1000000000 -512
0100101110 302
1100011001 -231
1000101110 -466

b) 1) Die Berechnung von −1 000 000 000 − 1 100 000 000 hat als Ergebnis −2 100 000 000. Bei der weiteren
Berechnung −2 100 000 000 − 1 200 000 000, also der Addition zweier negativer Zahlen, werden intern
die Zweierkomplement-Darstellungen mittels normaler Binärzahl-Rechnung addiert. Hierbei ist das
Ergebnis zu groß, um mit 32 Stellen dargestellt zu werden (ein Überlauf passiert). Das zusätzliche
Bit wird ignoriert und das restliche Ergebnis wird als Zahl im Zweierkomplement interpretiert. Bei
dieser konkreten Berechnung ergibt sich eine Binärzahl, bei der das vorderste Bit eine 0 ist, weshalb
das Ergebnis der Berechnung eine positive Zahl ist.
2) Der Wert in der Klammer ist −2147483648, also −231 . Bei der Berechnung von −(−2147483648)
wird der entsprechende Bitvektor 10 . . . 0 zunächst invertiert (was 01 . . . 1 ergibt), und dann noch 1
auf diesen Bitvektor addiert (was den Bitvektor 10 . . . 0 ergibt). Der entstandene Bitvektor ist genau
derselbe, von dem wir ursprünglich ausgegangen sind und insbesondere negativ.

Aufgabe 7 (Intro und Deck 0): (Codescape)


Schließen Sie das Intro und das Tutorial zum Spiel Codescape ab und lösen Sie die Räume von Deck 0.
Ihre Lösung für Räume dieses Codescape Decks wird nur dann für die Zulassung gezählt, wenn sie die Lösung
bis Montag, den 28.10.2019, um 12:00 Uhr abschicken.

Lösung:

Das könnte Ihnen auch gefallen