• Keine Ergebnisse gefunden

Lehrstuhl für Programmierparadigmen

N/A
N/A
Protected

Academic year: 2022

Aktie "Lehrstuhl für Programmierparadigmen"

Copied!
5
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Lehrstuhl für Programmierparadigmen

Sebastian Ullrich Max Wagner

sebastian.ullrich@kit.edu maximilian.wagner@kit.edu

Semantik von Programmiersprachen – SS 2019

http://pp.ipd.kit.edu/lehre/SS2019/semantik

Lösungen zu Blatt 9: Denotationale Semantik mit Fixpunktiteration Bespre- chung: 24.06.2019

1. Welche der folgenden Aussagen sind richtig, welche falsch? (H)

(a) Die folgende Rekursionsgleichung definiert die Funktionf :N→Neindeutig:

f(n) =

(2·f n2

fallsngerade f(n+ 1)−1 fallsnungerade

(b) Die folgende Rekursionsgleichung definiert die Funktiong:N→Neindeutig:

g(n) =

( g n22

fallsngerade g(n−1) fallsnungerade (c) Das FunktionalF : (Σ*Σ)→(Σ*Σ) mit

F(f) =λσ.

((f(σ[x7→42]))[y7→23] fallsσ(z)≤17

σ[z7→0] sonst

gehört zur Rekursionsgleichung Q(σ) =

((Q(σ[x7→42]))[y7→23] fallsσ(z)≤17

σ[z7→0] sonst

(d) Für das FunktionalF : (Σ*Σ)→(Σ*Σ) mit F(f) =λσ.

(f(σ[y7→12]) fallsσ(x) = 13 σ[x7→10] sonst

gilt

F42(⊥)(σ) =

(⊥ fallsσ(x) = 13 σ[x7→10] sonst

(e) DJc1; (c2; c3)K=DJ(c2; c1); c3K

(f) DJ(if (x <= y) then z := x else z := y); skipKσ=σ[z7→min(σ(x), σ(y))]

(2)

Lösung:

(1a) Richtig. Man muss dafür zeigen, dass es eine Lösung gibt und dass die Rekursion irgendwann terminiert.

Die Identitätsfunktionid ist eine Lösung:

n=id(n) =

(2·n2 = 2·id n2

fallsngerade (n+ 1)−1 =id(n+ 1)−1 fallsnungerade Damit ist klar, dass die Rekursionsgleichung erfüllbar ist.

Für die Eindeutigkeit muss man nur noch beweisen, dass wennf die Gleichung für alle n erfüllt, dann giltf(n) =n für allen. Beweis per vollständiger Induktion über n:

Sei alsonbeliebig. Induktionsannahme: Für allem < ngilt: f(m) =m. Zu zeigen:f(n) =n.

• Fall n= 0: Aus der Rekursionsgleichung folgt: f(0) = 2·f 02

= 2·f(0) und damit f(0) = 0.

• Fall n= 1: Dann gilt entsprechend:f(1) =f(1 + 1)−1 = 2·f(1)−1 und damit durch Umstellen f(1) = 1.

• Fall n >1gerade: Dann ist n2 < n, also folgt aus der Induktionsannahme mit m = n2, dassf n2

= n2. Damit gilt f(n) = 2·f n2

= 2·n2 =n.

• Fall n >1ungerade: Dann ist n+12 < n, also folgt aus der Induktionsannahme mitm=

n+1

2 , dassf n+12

= n+12 . Damit gilt:f(n) =f(n+1)−1 = 2·f n+12

−1 = 2·n+12 −1 =n.

Damit istid die einzige Funktion, die die Rekursionsgleichung erfüllt.

(1b) Falsch. Die konstanten Funktioneng1(n) = 0 undg2(n) = 1erfüllen beide die Rekursions- gleichung.

(1c) Richtig.

(1d) Richtig. Es gilt:

F0(⊥)(σ) =⊥

F1(⊥)(σ) =F(⊥)(σ) =

(⊥ fallsσ(x) = 13 σ[x7→10] sonst

F2(⊥)(σ) =F(F1(⊥))(σ) =

(F1(⊥)(σ[y7→12]) =⊥ fallsσ(x) = 13

σ[x7→10] sonst =F1(⊥)

EntsprechendF42(⊥) =F41(⊥) =. . .=F1(⊥)

Intuitiv kann man sich als Begründung hierfür überlegen, wie ein Programm aussähe, dessen SemantikF entspricht.1. Der Schleifenrumpf in einem solchen Programm würde lediglich y verändern, aber als Schleifenbedingung lediglich den Wert von xbenutzen. Dementsprechend kann die Semantik des rekursiven Falls (und alle Approximationen daran) nur⊥ sein, denn eine solche Schleife terminiert nie!

(3)

(1f) Richtig. Seicdas ganze Programm, if der if-Teil.

DJPKσ = (DJskipK◦ DJifK)(σ) = (id ◦ DJifK)(σ) =DJifKσ

= IF (BJx <= yK, DJz := xK, DJz := yK)σ

= IF (λσ. σ(x)≤σ(y), λσ. σ[z7→σ(y)], λσ. σ[z7→σ(y)])σ

=

(σ[z7→σ(x)] fallsσ(x)≤σ(y) σ[z7→σ(y)] sonst

=σ[z7→min(σ(x), σ(y))]

2. Fixpunktiteration (H)

Gegeben sei folgendes ProgrammP:

x := 0; i := n; while (1 <= i) do (x := x + 2 * i; i := i - 1)

(a) Geben Sie das FunktionalF an, das in der denotationellen Semantik zur Schleife gehört.

(b) Berechnen SieF0(⊥),F1(⊥),F2(⊥) und F3(⊥).

(c) Geben SieFn(⊥) und (ein sinnvolles) FIX (F) an (ohne Beweis).

(d) Geben Sie basierend darauf DJPKan.

Lösung:

(2a) Zuerst die Semantik des Schleifenrumpfs:

DJx := x + 2 * i; i := i - 1Kσ= (DJi := i - 1K◦ DJx := x + 2 * iK)(σ)

=DJi := i - 1K(σ[x7→σ(x) + 2·σ(i)])

=σ[x7→σ(x) + 2·σ(i), i7→σ(i)−1]

Damit ergibt sich das FunktionalF zu:

F(f)(σ) = IF (BJ1 <= iK, f ◦ DJx := x + 2 * i; i := i - 1K, id)σ

= IF (λσ.1≤σ(i), λσ. f(σ[x7→σ(x) + 2·σ(i), i7→σ(i)−1]), id)σ

=

(σ falls1> σ(i)

f(σ[x7→σ(x) + 2·σ(i), i7→σ(i)−1]) falls1≤σ(i) (2b) Seibody definiert als

body(σ) : =DJx := x + 2 * i; i := i - 1Kσ

=σ[x7→σ(x) + 2·σ(i), i7→σ(i)−1]

(4)

F0(⊥)(σ) =⊥

F1(⊥)(σ) =F(F0(⊥))(σ) =

(σ falls1> σ(i)

F0(⊥)(body(σ)) =⊥ falls1≤σ(i) F2(⊥)(σ) =F(F1(⊥))(σ) =

(σ falls1> σ(i) F1(⊥)(body(σ)) falls1≤σ(i)

=





σ falls1> σ(i)

body(σ) falls1≤σ(i) und 1> body(σ)(i)

⊥ falls1≤σ(i) und 1≤body(σ)(i)

=





σ falls1> σ(i)

σ[x7→σ(x) + 2,i7→0] falls1 =σ(i)

⊥ falls1< σ(i)

F3(⊥)(σ) =F(F2(⊥))(σ) =

(σ falls1> σ(i) F2(⊥)(body(σ)) falls1≤σ(i)

=









σ falls1> σ(i)

body(σ) falls1≤σ(i)und 1> body(σ)(i) body(σ)[x7→body(σ)(x) + 2,i7→0] falls1≤σ(i)und 1 =body(σ)(i)

⊥ falls1≤σ(i)und 1< σ0(i)

=









σ falls1> σ(i)

σ[x7→σ(x) + 2,i7→0] falls1 =σ(i) σ[x7→σ(x) + 6,i7→0] falls2 =σ(i)

⊥ falls2< σ(i)

(2c)

Fn(⊥)(σ) =





σ falls1> σ(i)

σ[x7→σ(i)·(σ(i) + 1) +σ(x),i7→0] fallsσ(i)∈ {1, . . . , n}

⊥ fallsn < σ(i)

FIX (F)σ =

(σ falls1> σ(i)

σ[x7→σ(i)·(σ(i) + 1) +σ(x),i7→0] falls1≤σ(i) (2d) Seiw=while (1 <= i) do (x := x + 2 * i; i := i - 1)

DJPKσ = (DJwK◦ DJi := nK◦ DJx := 0K)(σ) = (DJwK◦ DJi := nK)(σ[x7→0])

(5)

(b) Zeigen oder widerlegen Sie:

DJ{ var z = x; x := y; y := z }K=DJx := x + y; y := x - y; x := x - yK Lösung:

(3a) Letztendlich ist ein Block nichts anderes als die Zuweisung des Startwerts anx, der Ausfüh- rung vonc und einer erneuten Zuweisung (des ursprünglichen Werts von x) anx. Damit ergibt sich:

DJ{ var x = a; c }Kσ = ((λσ0. σ0[x7→σ(x)]◦ DJcK◦(λσ0. σ0[x7→ AJaKσ]))(σ)

= (DJcK(σ[x7→ AJaKσ]))[x7→σ(x)]

wobei das äußere Zustandsupdate Undefiniertheit propagieren soll. Die denotationale Seman- tik bleibt dadurch kompositional, da nur die BedeutungenAJaKundDJcKder Teileaundc verwendet werden.

(3b) Beweis:

DJ{ var z = x; x := y; y := z }Kσ

= (DJx := y; y := zK(σ[z7→σ(x)]))[z7→σ(z)]

= (DJy := zK◦ DJx := yK)(σ[z7→σ(x)]))[z7→σ(z)]

= (DJy := zK(σ[z7→σ(x), x7→(σ[z7→σ(x)])(y)]))[z7→σ(z)]

= (DJy := zK(σ[z7→σ(x), x7→σ(y)]))[z7→σ(z)]

=σ[z7→σ(x), x7→σ(y), y7→(σ[z7→σ(x), x7→σ(y)])(z), z7→σ(z)]

=σ[x7→σ(y), y7→σ(x),z7→σ(z)] =σ[x7→σ(y), y7→σ(x)]

DJx := x + y; y := x - y; x := x - yKσ

= (DJx := x - yK◦ DJy := x - yK◦ DJx := x + yK)σ

= (DJx := x - yK◦ DJy := x - yK)(σ[x7→σ(x) +σ(y)])

=DJx := x - yK(σ[x7→σ(x) +σ(y), y7→(σ[x7→σ(x) +σ(y)])(x)−(σ[x7→σ(x) +σ(y)])(y)])

=DJx := x - yK(σ[x7→σ(x) +σ(y), y7→(σ(x) +σ(y))−σ(y)])

=DJx := x - yK(σ[x7→σ(x) +σ(y), y7→σ(x)])

=σ[x7→σ(x) +σ(y), y7→σ(x),

x7→(σ[x7→σ(x) +σ(y), y7→σ(x)])(x)−(σ[x7→σ(x) +σ(y), y7→σ(x)])(y)]

=σ[y7→σ(x), x7→(σ(x) +σ(y))−σ(x)] =σ[y7→σ(x), x7→σ(y)]

Referenzen

ÄHNLICHE DOKUMENTE

Beachten Sie, dass sich diese Implementierung nicht direkt mit der Implementierung von for mittels while kombinieren lässt, da auch bei continue die Zählvariable erhöht werden

Typsicherheit lässt sich auch für eine Big-Step-Semantik zeigen, in dieser Aufgabe für While T : (a) Ändern Sie die Auswertungsrelation so, dass eine Anweisung mit einem Zustand

R ist total geordnet, damit auch das Intervall, somit ist jede Teilmenge eine Kette.. Sei also M ⊆

Damit kann man dann auch die denotationale Semantik eines Programms c zu einer Funktion Σ → (P(Σ) × B ) erweitern, wobei das boolesche Flag angibt, ob c für den

In dieser Aufgabe sollen Sie nun eine denotationale Fortsetzungssemantik für

In einer früheren Aufgabe haben wir schon die operationale Semantik einer repeat-Schleife

In dieser Aufgabe sollen Sie nun eine denotationale Fortsetzungssemantik für

Der Standard-Beweis zur Äquivalenz der Klassen von GOTO- und WHILE-Programmen kann hierfür nicht hergenommen werden, da er für die Transformation von GOTO nach WHILE eine