Definition: (Kette, noethersche Ordnung) Definition: (Kette ...
Definition: (Kette, noethersche Ordnung) Definition: (Kette ...
Definition: (Kette, noethersche Ordnung) Definition: (Kette ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
<strong>Definition</strong>: (<strong>Kette</strong>, <strong>noethersche</strong> <strong>Ordnung</strong>)<br />
Sei (M, ≤) eine <strong>Ordnung</strong>. Eine Folge ϕ : N → M heißt eine (abzählbar<br />
unendliche) aufsteigende <strong>Kette</strong>, wenn für alle i ∈ N gilt:<br />
(absteigende <strong>Kette</strong>: entsprechend).<br />
ϕ(i) ≤ ϕ(i + 1)<br />
Eine <strong>Kette</strong> ϕ wird stationär, falls es ein j ∈ N gibt, so dass<br />
ϕ(j) = ϕ(j + k) für alle k ∈ N<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 533<br />
Lemma:<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
Eine <strong>Ordnung</strong> ist genau dann noethersch, wenn jede absteigende<br />
<strong>Kette</strong> stationär wird.<br />
Beweis: (siehe Theorievorlesung)<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 535<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
<strong>Definition</strong>: (<strong>Kette</strong>, <strong>noethersche</strong> <strong>Ordnung</strong>) (2)<br />
Sei N eine Teilmenge von M. x ∈ N heißt:<br />
• größtes Element von N, wenn ∀y ∈ N gilt: y ≤ x.<br />
• kleinstes Element von N, wenn ∀y ∈ N gilt: x ≤ y.<br />
• maximales Element von N, wenn ∀y ∈ N gilt:<br />
x ≤ y impliziert x = y.<br />
• minimales Element von N, wenn ∀y ∈ N gilt:<br />
y ≤ x impliziert x = y.<br />
Eine <strong>Ordnung</strong> (M, ≤) heißt noethersch, wenn jede nicht-leere<br />
Teilmenge von M ein minimales Element besitzt.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 534<br />
Terminierungskriterium:<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
Sei f : S → T eine rekursive Funktionsdeklaration mit formalem<br />
Parameter n und sei P die Menge der zulässigen Parameter von f .<br />
Jede Anwendung von f auf Elemente von P terminiert,<br />
• wenn es eine <strong>noethersche</strong> <strong>Ordnung</strong> (M, ≤)<br />
• und eine Abb. δ : P → M gibt,<br />
• so dass für jede rekursive Anwendung f (G(n)) im Rumpf der<br />
Deklaration gilt:<br />
i) G(n) ist ein zulässiger Parameter, d.h. G(n) ∈ P.<br />
ii) Die aktuellen Parameter werden echt kleiner, d.h.<br />
δ(G(n)) < δ(n)<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 536
Bemerkung:<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
• Da die aktuellen Parameter nur endlich oft echt kleiner werden<br />
können (und dann stationär werden), garantiert das obige<br />
Kriterium die Terminierung.<br />
• Um die Terminierung nachzuweisen, muss man also eine<br />
geeignete <strong>noethersche</strong> <strong>Ordnung</strong> und eine geeignete Abbildung δ<br />
finden.<br />
• Ist der Argumentbereich bereits noethersch geordnet, kann δ<br />
selbstverständlich auch die Identität sein.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 537<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
Beispiele: (Terminierungsbeweis) (2)<br />
2. einfuegen ([],z,ix) = [z]<br />
einfuegen (xs,z,0) = z:xs<br />
einfuegen (x:xs,z,ix) = einfuegen (xs,z,ix -1)<br />
P ist die Menge aller Tripel aus (a,[a],Int).<br />
Noethersche <strong>Ordnung</strong> (N, ≤).<br />
Als δ wähle die Funktion längefst, die länge auf die erste<br />
Komponente anwendet.<br />
Zu zeigen:<br />
i) (xs,z,ix-1) ist ein zulässiger Parameter : ok.<br />
ii) längefst(xs,z,ix-1) < längefst(x:xs,z,ix) : ok.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 539<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
Beispiele: (Terminierungsbeweis)<br />
1. foldrplus xs =<br />
if null xs then 0<br />
else (headd xs) + foldrplus (tail xs)<br />
P ist die Menge aller endlichen Listen über Integer.<br />
Noethersche <strong>Ordnung</strong> (N, ≤).<br />
Als δ wähle die Funktion länge (Länge einer Liste).<br />
Zu zeigen:<br />
i) tail xs ist ein zulässiger Parameter: ok.<br />
ii) länge (tail xs) < länge xs: ok.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 538<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
Beispiele: (Terminierungsbeweis) (3)<br />
Bemerkung:<br />
Hätte man stattdessen für δ die Selektion auf die dritte Komponente<br />
gewählt, hätte man Terminierung nur für eine kleinere Menge<br />
zulässiger Parameter zeigen können, nämlich z.B. für Parametertripel<br />
(xl,el,ix) mit ix ≥ 0.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 540
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
Beispiele: (Terminierungsbeweis) (4)<br />
3. foo(m,n) =<br />
if m 0.<br />
Noethersche <strong>Ordnung</strong> (N, ≤).<br />
δ : Z × Z → N mit<br />
δ(m, n) =<br />
� 0 , falls m < n<br />
m − n + 1 , falls m ≥ n<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 541<br />
Bemerkung:<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
• Terminierungsbeweise sind bei der Entwicklung von<br />
Qualitätssoftware sehr wichtig, und zwar unabhängig vom<br />
verwendeten Modellierungs- bzw. Programmierparadigma.<br />
• Es sollte zur Routine der Softwareentwicklung, gehören, den<br />
zulässigen Parameterbereich festzulegen und dafür Terminierung<br />
zu zeigen.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 543<br />
3. Funktionales Programmieren 3.4 Semantik, Testen und Verifikation<br />
Beispiele: (Terminierungsbeweis) (5)<br />
Zu zeigen:<br />
i) (m − n, n) ist ein zulässiger Parameter: ok.<br />
ii) Unter der Voraussetzung m ≥ n und n > 0:<br />
1. Fall: m − n ≥ n:<br />
δ(m − n, n) = m − n − n + 1 < m − n + 1 = δ(m, n)<br />
2. Fall: m − n < n:<br />
δ(m − n, n) = 0 < m − n + 1 = δ(m, n)<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 542<br />
Kapitel 4<br />
4. Prozedurales Programmieren 4.0<br />
Prozedurales<br />
Programmieren<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 544
Übersicht<br />
4. Prozedurales Programmieren 4.0<br />
4. Prozedurales Programmieren<br />
Der Begriff des Algorithmus<br />
Grundkonzepte prozeduraler Programmierung<br />
Sprachliche Basis: Teilsprache von Java<br />
Anweisungen<br />
Prozeduren<br />
Variablen in Programm und Speicher<br />
Felder<br />
Benutzerdefinierte Typen<br />
Sichtbarkeit von Bindungen<br />
Iteration und Rekursion<br />
Weitere prozedurale Sprachkonzepte<br />
Algorithmen in prozeduraler Formulierung<br />
Einführung in die Algorithmenanalyse<br />
Speicherverwaltung<br />
Laufzeitverhalten<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 545<br />
Abschnitt 4.1<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Der Begriff des Algorithmus<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 547<br />
Übersicht (2)<br />
4. Prozedurales Programmieren 4.0<br />
Prozedurale Algorithmen und deren Analyse<br />
Algorithmenklassen & -entwicklung<br />
Verifikation prozeduraler Programme<br />
Spezifikation von Prozedureigenschaften<br />
Verifikation von Prozeduren<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 546<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Der Begriff des Algorithmus<br />
Zentrale Begriffe der algorithmischen Vorgehens:<br />
• Algorithmus<br />
• Variablen zur Speicherung von Werten<br />
• Ausführungszustand = Speicherzustand + Steuerungszustand<br />
• Zustandsveränderung<br />
• Aktion<br />
• Ablauf<br />
• Determinismus, Determiniertheit<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 548
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Der Begriff des Algorithmus (2)<br />
Die prozedurale Modellierung und Programmierung baut auf den<br />
klassischen Algorithmusbegriff auf.<br />
Eine Berechnung wird als zustandsverändernder Ablauf betrachtet.<br />
Damit orientiert sie sich am Berechnungskonzept von Rechnern, das<br />
auch auf der Beschreibung von Abläufen basiert, in denen sich in<br />
jedem Schritt der Ausführungszustand ändern kann.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 549<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Begriffsklärung: (Algorithmus) (2)<br />
Man sagt, die Ausführung eines Algorithmus terminiert, wenn sie<br />
nach endlich vielen Schritten beendet ist; andernfalls spricht man von<br />
einer nicht-terminierenden Ausführung.<br />
Bemerkung:<br />
Es gibt viele Begriffsklärungen für " Algorithmus", die sich aber in den<br />
wesentlichen Aspekten gleichen.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 551<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Begriffsklärung: (Algorithmus)<br />
Ein Algorithmus ist ein Verfahren zur schrittweisen Ausführung von<br />
(Berechnungs-) Abläufen, das sich präzise und endlich beschreiben<br />
lässt, so dass:<br />
• die Beschreibung auf wohlverstandenen, ausführbaren<br />
(" effektiven") Einzelschritten basiert;<br />
• in jedem Schritt eine oder mehrere Aktionen ggf. parallel<br />
ausgeführt werden;<br />
• jede Aktion von einem Zustand in einen Nachfolgezustand führt.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 550<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Beispiel: (Algorithmus, der erste)<br />
Verdoppeln nach Adam Riese (1574):<br />
Dupliren:<br />
Lehret wie du ein zahl zweyfaltigen solt.<br />
Thu ihm also<br />
Schreib die zahl vor dich /<br />
mach ein Linien darunder /<br />
heb an zu forderst /<br />
Duplir die erste Figur.<br />
Kompt ein zahl die du mit einer Figur schreiben magst /<br />
so setz die unden.<br />
Wo mit zweyen /<br />
schreib die erste/ Die ander behalt im sinn.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 552
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Beispiel: (Algorithmus, der erste) (2)<br />
Darnach duplir die ander /<br />
und gib darzu/<br />
das du behalten hast /<br />
und schreib abermals die erste Figur /<br />
wo zwo vorhanden /<br />
und duplir fort biß zur letzsten /<br />
die schreibe gantz auß /<br />
als folgende Exempel außweisen:<br />
...<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 553<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Begriffsklärung: (Speichervariable)<br />
Eine Speichervariable (oder einfach nur Variable) ist ein<br />
Speicher/Behälter für Werte. Charakteristische Operationen auf einer<br />
Variablen v:<br />
• Zuweisen eines Werts w an v;<br />
• Lesen des Wertes, den v enthält/speichert/hat.<br />
Der Zustand einer Variablen v ist undefiniert, wenn ihr noch kein Wert<br />
zugewiesen wurde; andernfalls ist der Zustand von v durch den<br />
gespeicherten Wert charakterisiert.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 555<br />
Speichervariablen:<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Um die Zustände zwischen den Schritten präziser fassen zu können,<br />
führt man Variablen ein, die Werte speichern können:<br />
Variablen stellen wir graphisch durch Rechtecke dar:<br />
v: True v enthält/speichert den Wert True<br />
v1: 7 v1 enthält/speichert den Wert 7<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 554<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Beispiel: (Algorithmus, der zweite)<br />
Berechnung des größten gemeinsamen Teilers:<br />
Seien m, n, v Variablen fuer Integer-Werte;<br />
lese die Werte w1 und w2 ein, fuer die der ggT berechnet werden soll,<br />
und weise w1 an m und w2 an n zu;<br />
solange der Wert von m groesser als 0 ist, tue Folgendes und pruefe<br />
danach wieder die Bedingung:<br />
• berechne n mod m und weise das Ergebnis an v zu;<br />
• weise den Wert von m an n zu;<br />
• weise den Wert von v an m zu;<br />
gebe den Wert aus, den n enthaelt.<br />
Ausführen des Algorithmus für mehrere Eingaben!<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 556
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Algorithmusformulierung:<br />
Formulierung des obigen Algorithmus durch ein Flussdiagramm:<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 557<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Algorithmusformulierung: (3)<br />
Formulierung des obigen Algorithmus durch ein C++ Programm (ohne<br />
zusätzliche Ausgaben):<br />
#include <br />
// Berechnet ggT fuer 2 gelesene Werte<br />
void main(){<br />
int m; int n; int v;<br />
cin >> m;<br />
cin >> n;<br />
}<br />
while( m>0 ) {<br />
v = n % m;<br />
n = m;<br />
m = v;<br />
}<br />
cout 0 ) {<br />
v = n % m;<br />
n = m;<br />
m = v;<br />
}<br />
IO.println( n );<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 558<br />
Bemerkung<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
• Algorithmen können mehr oder weniger formal beschrieben sein.<br />
• Ein Algorithmus ist unabhängig von der verwendeten<br />
Beschreibungstechnik bzw. Sprache.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 560
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Begriffsklärung: (Zustände)<br />
Jeder Schritt bei der Ausführung eines Algorithmus führt von einem<br />
Ausführungszustand zum Nachfolgezustand. Ein<br />
Ausführungszustand ist gekennzeichnet durch<br />
• den Speicherzustand (im Wesentlichen der Zustand der<br />
Variablen);<br />
• den Steuerungszustand (vereinfacht gesagt, die Stelle im<br />
Programm, an der die Ausführung angekommen ist).<br />
Ein Ausführungsschritt führt zu einer Zustandsveränderung, also einer<br />
Veränderung von Speicher- und/oder Steuerungszustand.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 561<br />
Begriffsklärung: (Ablauf)<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Der Ablauf eines Algorithmus zu gegebenen Eingaben wird<br />
charakterisiert durch<br />
• die Sequenz der Ausführungszustände,<br />
• die Sequenz der ausgeführten Aktionen.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 563<br />
Begriffsklärung: (Aktion)<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
In einem Ausführungsschritt wird üblicherweise eine Aktion<br />
ausgeführt. Aktionen sind:<br />
• Zuweisungen an Variablen<br />
• Kommunikation mit der Umgebung (Ein- und Ausgabe)?<br />
Die Aktion bestimmt nachfolgende Steuerungszustände bzw. die<br />
Terminierung des Algorithmus.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 562<br />
4. Prozedurales Programmieren 4.1 Der Begriff des Algorithmus<br />
Begriffsklärung: (Effizienz)<br />
Ein Algorithmus A heißt effizienter als ein Algorithmus B, wenn der<br />
" Aufwand" zur Ausführung von A geringer ist als der " Aufwand" zur<br />
Ausführung von B und zwar für die zulässigen Eingabedaten.<br />
Oft wird nur erwartet, dass der Aufwand für alle bis auf endlich viele<br />
Eingaben geringer ist oder nur im Mittel über die zulässigen Eingaben.<br />
©Arnd Poetzsch-Heffter TU Kaiserslautern 564