Invariante und Invariante und
Algorithmenentwurf Algorithmenentwurf
Timm Grams Timm Grams Hochschule Fulda Hochschule Fulda
Fachbereich Elektrotechnik und Fachbereich Elektrotechnik und
Informationstechnik Informationstechnik
© Timm Grams, Fulda, 07.09.02 (6.5.07)
© Timm Grams, Fulda, 07.09.02 (6.5.07)
Einführung Einführung
Was dem Naturwissenschaftler die Naturgesetze, das Was dem Naturwissenschaftler die Naturgesetze, das sind dem Informatiker die Invarianten.
sind dem Informatiker die Invarianten.
Die Invariante erfasst den wesentlichen Kern eines Die Invariante erfasst den wesentlichen Kern eines Algorithmus, sie ist sein „Gesetz“.
Algorithmus, sie ist sein „Gesetz“.
Die Invariante ist Grundlage des Algorithmenent-wurfs.
Die Invariante ist Grundlage des Algorithmenent-wurfs.
Bei einem Algorithmus ist konsequent zu unterscheiden zwischen der Handlungsanweisung und der Invarianten.
Die Handlungsanweisung erfasst den dynamischen, die Invariante den statischen Aspekt eines Algorithmus.
Beispiel: Zahlenwandlung Beispiel: Zahlenwandlung
Wandlung der Dezimalzahl 202 in die Darstellung Wandlung der Dezimalzahl 202 in die Darstellung zur Basis 5
zur Basis 5 Stufe
Stufe k k Relation Relation
0 0 202 = 202 202 = 202 5 5
001 1 202 = 40 202 = 40 5 5
11+ 2 + 2 5 5
002 2 202 = 8 202 = 8 5 5
22+ 0 + 0 5 5
11+ 2 + 2 5 5
003 3 202 = 1 202 = 1 5 5
33+ 3 + 3 5 5
22+ 0 + 0 5 5
11+ 2 + 2 5 5
00Zahlenwandlung
Zahlenwandlung
- Operatoren - OperatorenDie Zahlenwandlung basiert auf der ganzzahligen Die Zahlenwandlung basiert auf der ganzzahligen Division mit Rest
Division mit Rest
Die dafür nötigen Operatoren in C sind / und % Die dafür nötigen Operatoren in C sind / und %
/ ist der Divisionsoperator / ist der Divisionsoperator
% ist der Modulo-Operator zur Bestimmung des Rests
% ist der Modulo-Operator zur Bestimmung des Rests
Beispiele: 202/5 = 40 und 202%5 = 2 Beispiele: 202/5 = 40 und 202%5 = 2
Fundamentale Formel der ganzzahligen Arithmetik:
Fundamentale Formel der ganzzahligen Arithmetik:
z z = = ( ( z z / / b b ) · ) · b b + + z z % % b b
Invariante und Endebedingung Invariante und Endebedingung
Die Invariante Die Invariante ist eine Aussage, die vor Eintritt in ist eine Aussage, die vor Eintritt in den Rechenschritt eines Algorithmus erfüllt ist, und den Rechenschritt eines Algorithmus erfüllt ist, und die nach dem Schritt erneut wahr ist.
die nach dem Schritt erneut wahr ist.
Der Algorithmus endet, wenn die
Der Algorithmus endet, wenn die Endebedingung Endebedingung erfüllt ist
erfüllt ist
Grundstruktur von Algorithmen in C Grundstruktur von Algorithmen in C
AA Initialisierungs-AnweisungenInitialisierungs-Anweisungen BB Schleifenbedingung.Schleifenbedingung.
Für B Für B 0 wird S 0 wird S ausgeführt,ausgeführt, für B für B = 0 (Endebedingung) = 0 (Endebedingung)
nicht nicht
SS Schleifenanweisung (meist Schleifenanweisung (meist eine Verbundanweisung) eine Verbundanweisung) II InvarianteInvariante
A A
while(
while( B B ) ) S S
I I ((B B 0)
I I ((B B =0)=0)
II II
B B
S S
A A
Beispiel: Wandlung der Zahl Beispiel: Wandlung der Zahl Z Z
in Darstellung zur Basis in Darstellung zur Basis B B
I I ((zz 0)
I I ((zz =0)=0)
II II
z z
r[k++]= z%b;
r[k++]= z%b;
z= z/b;
z= z/b;
k=0; k=0;
k=0; k=0;
while(
while(z z ){ ) {
r[k++]=z%b; r[k++]=z%b;
z=z/b; z=z/b;
} }
Invariante:
Invariante:
b = b = B B
Z Z = z = z b b
kk+r[k-1] +r[k-1] b b
k-1k-1+...+r[1] +...+r[1] b b
11+r[0] +r[0] b b
000 ≤ r[
0 ≤ r[ i i ] < ] < B für i B für i < k < k
Programmbeweis
Programmbeweis mit der symbolischen Methode 1 mit der symbolischen Methode 1
Kursive Großbuchstaben bezeichnen mathematische Variable.
Kursive Großbuchstaben bezeichnen mathematische Variable.
Programmfragmente werden in Anführungszeichen geschrieben.
Programmfragmente werden in Anführungszeichen geschrieben.
Anfangs sei z=
Anfangs sei z=ZZ und durchweg gilt b= und durchweg gilt b B.B.
Zu zeigen ist zuerst, dass die Initialisierung Zu zeigen ist zuerst, dass die Initialisierung
„k=0;“„k=0;“
die Invariante wahr macht. Jedenfalls gilt nach der Initialisierung die Invariante wahr macht. Jedenfalls gilt nach der Initialisierung z=z=ZZ und k=0. Also: und k=0. Also:
ZZ = z= z
= z= zbb00
= z= bbkk + r[k-1] + r[k-1]bbk-1k-1+...+r[1]+...+r[1]bb11+r[0]+r[0]bb00
Programmbeweis
Programmbeweis mit der symbolischen Methode 2 mit der symbolischen Methode 2
Im zweite Schritt ist zu zeigen, dass die Anweisungsfolge Im zweite Schritt ist zu zeigen, dass die Anweisungsfolge
„„r[k++]=z%b; z=z/b;“r[k++]=z%b; z=z/b;“
die Invariante erhält: Vor der Anweisungsfolge ist k=
die Invariante erhält: Vor der Anweisungsfolge ist k=KK und z= und z=AA. . Die Invariante wird zu
Die Invariante wird zu
ZZ = = AAbbKK+r[+r[KK-1]-1]bbK-1K-1+...+r[1]+...+r[1]bb11+r[0]+r[0]bb00
Nach der Anweisungsfolge ist r[r[KK]=]=AA%b, k=%b, k=KK+1 und z=+1 und z=AA/b /b (ganzzahliger Quotient). Wegen
(ganzzahliger Quotient). Wegen AA=(=(AA/b)/b)b+b+AA%b gilt%b gilt ZZ = (= ((AA/b)/b)b+b+AA%b)%b bbKK+r[+r[KK-1]-1]bbK-1K-1+...+r[1]+...+r[1]bb11+r[0]+r[0]bb00
= z= bbK+1K+1 +r[ +r[KK]]bbKK+r[+r[KK-1]-1]bbK-1K-1+...+r[1]+...+r[1]bb11+r[0]+r[0]bb00
= z= bbkk + r[k-1] + r[k-1]bbk-1k-1+...+r[1]+...+r[1]bb11+r[0]+r[0]bb00
Programmbeweis
Programmbeweis mit der symbolischen Methode 3 mit der symbolischen Methode 3
Im dritten und letzten Schritt ist zu zeigen, dass aus der Im dritten und letzten Schritt ist zu zeigen, dass aus der Bedingung
Bedingung I I (z=0) das gewünschte Resultat folgt. (z=0) das gewünschte Resultat folgt.
In der Invarianten In der Invarianten
ZZ = z= bbkk + r[k-1] + r[k-1]bbk-1k-1+...+r[1]+...+r[1]bb11+r[0]+r[0]bb00 ist z=0 zu setzen. Damit ergibt sich
ZZ = r[k-1]= r[k-1]bbk-1k-1+...+r[1]+...+r[1]bb11+r[0]+r[0]bb00
Das Array r enthält die Zahlendarstellung der Zahl Z zur Basis B.