03.01.2013 Aufrufe

Definition: (Kette, noethersche Ordnung) Definition: (Kette ...

Definition: (Kette, noethersche Ordnung) Definition: (Kette ...

Definition: (Kette, noethersche Ordnung) Definition: (Kette ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!