Grundlagen der Programmierung (Vorlesung 12)
z Vorige Vorlesung
y Korrektheit von Anweisungen
y Vorbedindungen und Nachbedingungen y Einfach- und Mehrfachzuweisung
z Inhalt dieser Vorlesung
y Wiederholung und Vertiefung des Stoffes aus VL 11 y Fallunterscheidungen
z Lernziele
y Grundlagen der systematischen Programmentwicklung
Ralf Möller, FH-Wedel
ºuº
jIH0»m¼lnoI½3¼ 1½9H
n¼9 HI½9HU¼H@
H
ÏIn¼6H0»U~H È2,1:80Ep3p3,580RÂ<¿
jIH0»m¼lnoI½9H ÃÎ1 0E!D:90E!ß7 0E!/5
Í!bß 5!/:
"bß 5!/:5AD1RÀ:
:QW"bß75!/:
Ð0Â<¿%ÀFDSm"bß75!/:
jIHUlno~ 9H Ízß7ZþS1Op3/,$Jÿ2"bß75!/:TuÎ1/ !
W"bß75!/:5,DS1:"!5#0Ep3p3:5866oß78
rstu Øç/ æOâeÚÙUç@¡ v£¢ Øç æâeÚOÙUç@¡¤
Éh¥ ¦§¨yÉh¥
ø
rH < 0E/5#©0E!/>©É
ü"0©A0E0E!5,DÎ!/, -/
"bß75!/: +0E::/ û-D1:
9JV
ÏIHjIHUJ<H9H DÎ!OCwß 58!/:5,D1:
U U
ª#«¬ K
M ® v K
¯v M
ª,9¬ K
¯v M ® ¤ K M
Ç~o U k
K
M ® v § ® ¤ K M
ºuº
jIH0»m¼lnoI½3¼ 1½9H
n¼9 HI½9HU¼H@
H
ÏIn¼6H0»U~H È2,1:80Ep3p3,580RÂ<¿
jIH0»m¼lnoI½9H ÃÎ1 0E!D:90E!ß7 0E!/5
Í!bß 5!/:
"bß 5!/:5AD1RÀ:
:QW"bß75!/:
Ð0Â<¿%ÀFDSm"bß75!/:
jIHUlno~ 9H Ízß7ZþS1Op3/,$Jÿ2"bß75!/:TuÎ1/ !
W"bß75!/:5,DS1:"!5#0Ep3p3:5866oß78
rstu Øç/ æOâeÚÙUç@¡ v£¢ Øç æâeÚOÙUç@¡¤
Éh¥ ¦§¨yÉh¥
ø
rH < 0E/5#©0E!/>©É
ü"0©A0E0E!5,DÎ!/, -/
"bß75!/: +0E::/ û-D1:
9JV
ÏIHjIHUJ<H9H DÎ!OCwß 58!/:5,D1:
U U
ª#«¬ K
M ® v K
¯v M
ª,9¬ K
¯v M ® ¤ K M
Ç~o U k
K
M ® v § ® ¤ K M
Sequentielle Anweisung, Vorbedingung finden
❚ { V } x := x + 1; y := y -1 { x + y = s }
❚ { V } x := x + 1 { P 1 } ; { P 1 } y := y -1 { x + y = s }
❚ P 1 : (x + y = s)[y ← y-1]
µ x + y -1 = s
❚ V : P 1 [x ← x +1]
µ x +1 + y -1 = s
µ x + y = s
Unterschied: Parallele und. seq. Zuweisung
❚ Werte vertauschen
❙ { y=w1 fi x=w2 } x, y := y, x { x=w1 fi y=w2 }
❚ Geht das sequentiell? Wenn ja, unter welchen Bed.?
❙ { V } x := y; y := x { x=w1 fi y=w2 }
❙ ((x=w1 fi y=w2)[ y ← x ]) [ x ← y ]
❙ (x=w1 fi x=w2) [ x ← y ]
❙ y=w1 fi y=w2
❚ Also nur, wenn w1 = w2
(dann natürlich nicht interessant)
Sequentialisierung
❚ i, S := i+1, S+i
❚ S := S + i ; i := i + 1
❚ Dependenzanalyse notwendig
❚ Erst die Variablen setzen, die von anderen abhängen (geht nicht immer)
❚ Ggf. Zwischenvariablen einführen
é ï[ðRñò'óõôðöw÷wò'ö/Z\[zò^],_lñò'ó÷ ðöw÷wò'ö|ðö/`ba4ced4fò'óhgmò'ö
³²
²F´ µ
H0ÇoU~H
jRHqno~9H
¶¸·2¹
jIHUlno~ Rº»l/:!/: þ1ȼ/Î0Q0<l./"!5#,!9© .9-!
½6¾N¿lÀ
1 ·UÁ4ÂÄÃ
À
0E!5:Eß P6ßO8zÿ2!/Tß7
"bß75!/:uÎ1/ ! / :Q
"bß75!/:Å!/5#0Ep3p3/:56)ß 8
rstu ¶Ä·OÆ æ`ÛWâeç@¡RÙUç4¡
½6ÇÀÉÈ
Øç æâeÚOÙUç@¡ v
À
¸Ã
À
Øç æOâeÚOÙUç4¡ ¤
ÀÈ<Ê
¶¸·
rH < DS1$p3
ª#«¬
Æ æ<ÛWâeç4¡RÙUç@¡nßO80E!/58:Eß P6
ª,
¬
5,+/0E5*û-58!/F#0<
½6¾e¿À
.
ßO8Øç/ æOâeÚÙ0ç4¡ v 0E!5:6DOÎ!/P
ª,
µ ¬
5,+/0E5*û-58!/F#0<
·UÁ4ÂÄÃ
À .
ßO8Øç/ æOâeÚÙ0ç4¡¤Ë0E!5:6D !/P"0E5#©/ÌÎ
ßO8
ÍËJQH Æ æ`ÛYâeç4¡RÙUç@¡I!/£Øç/ æOâeÚÙUç@¡BuÎ1/ !
- l/:Q "bß75!/:X!5#0Ep3p3/:566
ß7
rstu ¶Ä·-Æ æ<ÛWâeç4¡RÙUç@¡
½6ÇÀÉÈ
Øç æâeÚOÙUç@¡
ÀÈ<Ê
¶¸·
éëêíìwêÏÎ Ðbòy`Jóöw÷mÑãò Qöañò'óõôOðAöw÷bò>ö
rH < D1,p)0E
ÏIHjIHUJ<H9H DÎ!O l/:QË"bß75!/:
U U
ª#«¬ K
v M ® v K M
ª,9¬ K
¤ M ® ¤ K M
Ó
o U k
K þ
vÔ Õ
ÿÖ þ ¤ Ô ×Õ ÿ M
¶Ä·¼Õ
½6ÇÀÉÈ
® v À ÂÄÃ
À ® ¤ ÀÉÈ<Ê
¶Ä·
K M
ÏIHjIHUJ<H9H DÎ!O l/:QË"bß75!/:T!-p3F
½6ÇÀÉÈ
Ízß7:
U U
ª#«¬ K
M ® K M
Ó o U k
K þ Ô Õ ÿ Ö þq Ô ×\Õ ÿ M
¶Ä·Õ
½6ÇlÀÈ
®
ÀÉÈ<Ê
¶Ä·
K M
Fallunterscheidung: Vorbedingung finden
❚ { V } if x ≥ y
then { V 1 } r := x else { V 2 } r := y
endif { r ≥ x fi r ≥ y fi ( r = x fl r = y ) }
❚ V 1 : (r ≥ x fi r ≥ y fi ( r = x fl r = y ))[r ← x]
µ x ≥ x fi x ≥ y fi ( x = x fl x = y )
µ x ≥ y
❚ V 2 : y ≥ x (ähnl. Beweis)
❚ V: (B fi V 1 ) fl ( – B fi V 2 ) µ true
Satz
❚ (p fi q) fl ( – p fi r) µ (p ¡ q) fi ( – p ¡ r)
❚ Erste Anwendung des Satzes:
❚ Mit diesem Satz kann die schwächste
Vorbedingung für die Fallunterscheidung formuliert werden als:
❚ { (B ¡ V 1 ) fi ( – B ¡ V 2 ) }
Zweite Anwendung: Programmkonstruktion
❚ Aufgabe:
❙ Für eine Nachbedingung P = (B ¡ V 1 ) fi ( – B ¡ V 2 ) soll ein Programm gefunden werden, das die Nachbedingung
herstellt
❙ In dieser Form liegen Spezifikationen häufig vor
❚ Behauptung: Die Lösung sieht so aus:
❙ { true } if B then S 1 else S 2 endif { P }
❙ mit { B } S 1 { V 1 fi B }
❙ und { – B } S 2 { V 2 fi – B }
Begründung
z Wenn { B } S 1 { V 1 fi B } korrekt, dann auch
{ B } S 1 { (V 1 fi B) fl (V 2 fi – B) } (Abschwächung) z Wenn { – B } S 2 { V 2 fi – B } korrekt, dann auch
{ – B } S 2 { (V 1 fi B) fl (V 2 fi – B) } (Abschwächung) z Also ist auch die folgende Fallunterscheidung korrekt
{ (B fi B) fl ( – B fi – B) } if B then S 1 else S 2
{ (V 1 fi B) fl (V 2 fi – B) } z Die Vorbedingung ist äquivalent zu true:
{ true } if B then S 1 else S 2 { (V 1 fi B) fl (V 2 fi – B) } z Laut obigem Satz ergibt sich die Behauptung durch
Transformation der Nachbedingung
Beispiel: Spezifikation für Max
z { ( x ≥ y -> r = x ) fi ( x £ y -> r = y ) } z Idee: In Verzweigung umsetzen!
z Aber B und – B notwendig
z Idee: Nachbedingung verstärken!
z { ( x ≥ y -> r = x ) fi ( x < y -> r = y ) }
é ï[ðRñò'óõôðöw÷wò'ö/Z\[zò^],_lñò'ó÷ ðöw÷wò'ö|ðö/`ba4ced4fò'óhgmò'ö
Ù HÚ~J<ÛEÚ
¹
nojIÚo Ü /PDU0©wè|,Eß :!/:
|ȼ$1:80Ep3p3$58/80©/£:O5IÎ0E!9:&1©A
WÜ /'ß :YÊ4,ß7:!/: þqÝ Á<Ã
ÀCÞ
"bß 5!:xÿyG
rstu Ý Á<Ã
À
ØÙUÚÛWÜEÙFÝSÞ ß ·
à æOÜá vRâ Øç æOâeÚOÙUç4¡ v
ããã
à æOÜá z â Øç æOâeÚOÙUç4¡ z
À
¸Ã
À â Øç/ æOâeÚÙ0ç4¡ä
ÀÈ<Ê Ý ÁÃ
À
ÏIH Ó Hn<no~ , Î0E^"p3F» l/:Q-"bß 5!/:
à æÜá âUå ØÙUÚÛWÜEÙzÝÞ
¶Ä· à æOÜá
å à æOÜákv
½6ÇÀÉÈ
Øç æâeÚOÙUç@¡æv
À
ÂÄÃ
À ããã
¶Ä·
à æOÜá å à æOÜáFz
½6ÇÀÉÈ
Øç æâeÚOÙUç@¡z
À
ÂÄÃ
À
Øç æOâeÚOÙUç4¡ä
ÀÈ<Ê
¶¸·
ãæã<ã ÀÉÈ<Ê
¶¸·