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))]
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!
(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]
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])
(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)]