29
Vorlesung: Prof. Dr. F. Bellosa Übungsleitung: Dipl.-Inform. A. Merkel Tutorium: Tutor: Informatik I Tutorium WS 07/08 Tutorium 6: Dienstag, 04. Dezember 2007 12 Jens Kehne

Informatik I Tutorium - STUDWWW s_kehne/tutorium/tutorium06.pdf · PDF file 2 Agenda des heutigen Tutoriums Übersicht heute • Rückblick • Theorie • Schleifeninvariante

Embed Size (px)

Citation preview

Vorlesung:

Prof. Dr. F. Bellosa

Übungsleitung:

Dipl.-Inform. A. Merkel

Tutorium:

Tutor:

Informatik I TutoriumWS 07/08

Tutorium 6: Dienstag, 04. Dezember 2007

12

Jens Kehne

http://info1.informatik.uni-karlsruhe.de

2

Agenda des heutigen Tutoriums

Übersicht heute

• Rückblick

• Theorie

• Schleifeninvariante

• Halbgruppen und Monoide

• Praxis

• String-Manipulation

http://info1.informatik.uni-karlsruhe.de

3

Rückblick

• „Begründen sie ihre Antwort“ meint die ganze Antwort

• ...außerdem muss natürlich eine Antwort dastehen...

• Schon wieder geschenkte Punkte

http://info1.informatik.uni-karlsruhe.de

4

TheorieSchleifeninvariante

http://info1.informatik.uni-karlsruhe.de

5

Definition

• Eine Schleifeninvariante ist eine Zusicherung, die in

jedem Schleifendurchlauf gilt.

• Beispiel:

int i = 1; for (i = 2;i<=100;i++) n = n + i;

• Eine Invariante dafür wäre 1

( 1)

2

i

k

i in k

http://info1.informatik.uni-karlsruhe.de

6

Gegeben sei folgendes Programmstück:

int a = In.readInt();

int b = In.readInt();

if (a > b) {

int h = a;

a = b;

b = h;

}

int z = b;

int i = 1;

while ((z % a) != 0){ /*1*/

z += b; /*2*/

i++; /*3*/

}

Beweisen oder widerlegen Sie die Korrektheit der folgenden Aussagen:

a) z == b * i ist eine Schleifeninvariante für die while-Schleife.

b) kgV(a,b) == kgV(a,z) ist eine Schleifeninvariante für die while-Schleife.

c) Die while-Schleife terminiert.Hinweis:

Nutzen Sie geeignete Zusicherungen an den Stellen position 1, position 2 und position 3,

um die Beweise zu führen.

Aufgabe 1: Schleifeninvariante

http://info1.informatik.uni-karlsruhe.de

7

Aufgabe 1.3a: Schleifeninvariante (15T)

Lösung a): Beweis über vollständige Induktion.

Induktionsanfang:

Beim ersten Schleifendurchlauf gilt z == b * i

denn (z == b) && (i == 1)

Induktionsschluss:

Annahme:

Beim n-ten Durchlauf gilt bei Schleifenbeginn (position 1) z == b * i

Zu zeigen:

Beim (n+1)-ten Durchlauf gilt bei Schleifenbeginn (position 1) z == b * i

Damit muss gelten: Beim n-ten Durchlauf gilt bei Schleifenende (position 3) z == b * i

int a = In.readInt();

int b = In.readInt();

if (a > b) {

int h = a;

a = b;

b = h;

}

int z = b;

int i = 1;

while ((z % a) != 0){

/*1*/

z += b; /*2*/

i++; /*3*/

}

http://info1.informatik.uni-karlsruhe.de

8

Aufgabe 1.3a: Schleifeninvariante (15T)

Lösung a) (Fortsetzung): Beweis über vollständige Induktion.

Es gelten folgende Zusicherungen:

position 1:

zalt == b * ialt

position 2:

zneu == zalt + b

position 3:

ineu == ialt + 1

Somit gilt am Ende der Schleife (position 3):

zneu == zalt + b == b * ialt + b == b * (ialt + 1) == b * ineu

Durch vollständige Induktion ist damit bewiesen, dass z = b * i am Anfang und am Ende jedes

Schleifendurchlaufs gilt.

Da der Ausdruck z = b * i am Anfang und am Ende jedes Schleifendurchlaufs gilt, ist nachgewiesen,

dass es sich bei diesem Ausdruck um eine Schleifeninvariante handelt.

int a = In.readInt();

int b = In.readInt();

if (a > b) {

int h = a;

a = b;

b = h;

}

int z = b;

int i = 1;

while ((z % a) != 0){

/*1*/

z += b; /*2*/

i++; /*3*/

}

http://info1.informatik.uni-karlsruhe.de

9

Aufgabe 1.3b: Schleifeninvariante (15T)

Lösung b): Beweis durch Gegenbeispiel:

Sei beispielsweise

a == 3

b == 5

Zu Beginn des ersten Schleifendurchlaufs (position 1) gilt z == b == 5

Somit gilt kgV(a,b) == kgV(3,5) == 15 == kgV(3,5) == kgV(a,z)

Am Ende des ersten Schleifendurchlaufs (position 3) gilt zneu == b * ineu (siehe Teilaufgabe a))

=> ineu == ialt + 1 == 1 + 1 == 2

=> zneu == b * 2 == 5 * 2 == 10

aber kgV(a, b) != kgV(a, zneu)

kgV(a, b) == 15 aber kgV(a, zneu) == 30

int a = In.readInt();

int b = In.readInt();

if (a > b) {

int h = a;

a = b;

b = h;

}

int z = b;

int i = 1;

while ((z % a) != 0){

/*1*/

z += b; /*2*/

i++; /*3*/

}

http://info1.informatik.uni-karlsruhe.de

10

Aufgabe 1.3b: Schleifeninvariante (15T)

Lösung c):

I) zu Beginn gilt z ==b

II) z wächst mit jedem Schleifendurchlauf streng monoton um b.

III) a * b ist ein gemeinsames Vielfaches von a und b.

IV) Aus I), II) und III) => a * b ist obere Schranke für z.

V) aus I), II) und IV) => die Schleife terminiert.

int a = In.readInt();

int b = In.readInt();

if (a > b) {

int h = a;

a = b;

b = h;

}

int z = b;

int i = 1;

while ((z % a) != 0){

z += b;

i++;

}

http://info1.informatik.uni-karlsruhe.de

Gegeben sei folgendes Programmstück:

public static double exp(byte b, byte e) {

// assertion: 0 <= e <= 127

double r = 1;

int i = 0;

while (i < e) {

// assertion when entering loop: (i < e)

// position 1

r = r * b;

// position 2

i++;

// position 3

}

return r; // return b^e

}

Beweisen oder widerlegen Sie die Korrektheit der folgenden Aussagen:

a) r == bi ist eine Schleifeninvariante für die while-Schleife.Hinweis:

Nutzen Sie geeignete Zusicherungen an den Stellen position 1, position 2 und position 3,

um die Beweise zu führen. 11

Aufgabe 2: Schleifeninvariante

http://info1.informatik.uni-karlsruhe.de

12

Aufgabe 1.3a: Schleifeninvariante (15T)

Lösung a): Beweis über vollständige Induktion.

Induktionsanfang:

An position 1 gilt im ersten Schleifendurchlauf: r == 1 == b0 == bi.

Induktionsschluss:

Annahme:

An Position 1 gelte für beliebiges i: r == bi .

Zu zeigen:

Beim (n+1)-ten Durchlauf gilt bei Schleifenbeginn (position 1):r == bi

Damit muss gelten: Beim n-ten Durchlauf gilt bei Schleifenende (position 3) r == bi

public static double

exp(byte b, byte e)

{

// assertion: 0 <= e <= 127

double r = 1;

int i = 0;

while (i < e) {

// assertion when entering

loop: (i < e)

// position 1

r = r * b;

// position 2

i++;

// position 3

}

return r; // return b^e

}

http://info1.informatik.uni-karlsruhe.de

public static double

exp(byte b, byte e)

{

// assertion: 0 <= e <= 127

double r = 1;

int i = 0;

while (i < e) {

// assertion when entering

loop: (i < e)

// position 1

r = r * b;

// position 2

i++;

// position 3

}

return r; // return b^e

}

13

Aufgabe 1.3a: Schleifeninvariante (15T)

Lösung a) (Fortsetzung): Beweis über vollständige Induktion.

Es gelten folgende Zusicherungen:

Position 1: ralt == bialt (laut Induktionsvoraussetzung)

Position 2: rneu == ralt * b

Position 3: ineu == ialt + 1

Somit gilt am Ende der Schleife (position 3):

rneu == ralt * b == bialt * b == bi

alt+1 == bi

neu

Durch vollständige Induktion ist damit bewiesen, dass r == bi am Anfang und am Ende jedes

Schleifendurchlaufs gilt.

Da der Ausdruck z == bi am Anfang und am Ende jedes Schleifendurchlaufs gilt, ist nachgewiesen,

dass es sich bei diesem Ausdruck um eine Schleifeninvariante handelt.

http://info1.informatik.uni-karlsruhe.de

14

TheorieHalbgruppen und Monoide

http://info1.informatik.uni-karlsruhe.de

15

Halbgruppe

• Die in der Zeichenverarbeitung auftretende Beziehung des Nebeneinanderschreibens von Zeichen lässt sich als eine Halbgruppe auffassen

• Mathematische Formulierung als Algebra• Menge

• Zeichenreihen über der Grundmenge

• Operationen

• . Konkatenation

• Gesetze

• HG1: (a . b) . c = a . (b . c) Assoziativgesetz

• Die Eigenschaft der algebraischen Abgeschlossenheit ist erfüllt

• Die beschriebene Algebra ( . HG1 , kurz auch als bezeichnet, bildet eine Halbgruppe

Au

s d

er

Vo

rle

su

ng

http://info1.informatik.uni-karlsruhe.de

16

Monoid

• Ein Monoid ist eine Halbgruppe mit Einselement• Eigenschaft eines Einselements

(1) a = a

(2) a = a

• das Einselement ist eindeutig

Beweis: Seien , ´ Einselemente

= ´ = ´ (Im ersten Schritt wurde die Einselement-

Eigenschaft von ausgenutzt, im Zweiten die von ´)

• Beispiel eines Monoids: • ist das leere Wort, d.h. die Länge ist 0

• falls wn die n-fache Wiederholung des Wortes w bezeichnet, so gilt w0=

http://info1.informatik.uni-karlsruhe.de

17

Monoid U* über Monoid *

• In der Informatik werden Monoide U* häufig über anderen Grundmengen als Zeichen gebildet• Grundmenge U kann aus Zeichenreihen bestehen, die aus

einem anderen Monoid stammen

• Elemente von U* heißen Listen

• oder alternativ: Sequenzen, Folgen

• Notation:

• Liste: [x1,x2,...,xn], wobei xi U

• [] ist die leere Liste

• [U] als alternative Schreibweise für U*

• Beispiel: U = {Apfel,Birne,Pflaume,Kirsche,Traube}• [Apfel,Birne], [Pflaume,Kirsche,Traube] sind Listen

• append([Apfel,Birne], [Pflaume,Kirsche,Traube]) ist eine alternative Funktionsschreibweise für

[Apfel,Birne] [Pflaume,Kirsche,Traube] (Infix-Operator)

http://info1.informatik.uni-karlsruhe.de

18

Beispielvorgehen: Nachweis: Halbgruppe – Monoid

Die gegebene Struktur ist ein Monoid. Die Relation R auf der Menge M ist

abgeschlossen, erfüllt das Assoziativgesetz und besitzt das Einselement E.

Beweis:

Abgeschlossenheit: für alle x, y ∈ M gilt, x R y ∈ M

Assoziativität: für alle x, y, z ∈ M gilt, (x R y) R z = x R (y R z)

Einselement: für alle x ∈ M gilt, E R x = x und x R E = x

Die gegebene Struktur ist eine Halbgruppe, aber kein Monoid. Die Relation R auf

der Menge M ist abgeschlossen, erfüllt das Assoziativgesetz, sie besitzt aber kein

Einselement.

Beweis:

Abgeschlossenheit: für alle x, y ∈ M gilt, x R y ∈ M

Assoziativität: für alle x, y, z ∈ M gilt, (x R y) R z = x R (y R z)

Einselement: es gibt kein Einselement (Wieso? Begründung!)

http://info1.informatik.uni-karlsruhe.de

19

Aufgabe 1: Nachweis: Halbgruppe – Monoid

Überprüfen Sie, ob es sich bei folgenden Strukturen um Halbgruppen oder Monoide

oder keines von beidem handelt. Beweisen Sie Ihre Aussage. Sie dürfen zum

Beweisen auf schon bekannte Eigenschaften aus der Vorlesung zurückgreifen. Zum

Widerlegen genügen begründete Gegenbeispiele.

a) Die Addition auf der Menge ℕ0, der natürlichen Zahlen mit der Zahl Null.

Lösung a):

Die Struktur ist ein Monoid. Die Addition auf ℕ0 ist abgeschlossen, erfüllt das

Assoziativgesetz und besitzt das Einselement Null.

Beweis:

Abgeschlossenheit: für alle x, y ∈ ℕ0 gilt, x + y ∈ ℕ0

Assoziativität: für alle x, y, z ∈ ℕ0 gilt, (x + y) + z = x + (y + z)

Einselement: für alle x ∈ ℕ0 gilt, 0 + x = x und x + 0 = x

http://info1.informatik.uni-karlsruhe.de

20

Aufgabe 1: Nachweis: Halbgruppe – Monoid

Überprüfen Sie, ob es sich bei folgenden Strukturen um Halbgruppen oder Monoide

oder keines von beidem handelt. Beweisen Sie Ihre Aussage. Sie dürfen zum

Beweisen auf schon bekannte Eigenschaften aus der Vorlesung zurückgreifen. Zum

Widerlegen genügen begründete Gegenbeispiele.

b) Die Multiplikation ∗ auf der Menge M={r ∈ ℝ | r > 1}, wobei ℝ die Menge der

reellen Zahlen ist.

Lösung b):

Die Struktur ist eine Halbgruppe, aber kein Monoid. Die Multiplikation auf ℝ ist

abgeschlossen, erfüllt das Assoziativgesetz, sie besitzt aber kein Einselement.

Beweis:

Abgeschlossenheit: für alle x, y ∈ M gilt, x∗ y ∈ M

Assoziativität: für alle x, y, z ∈ M gilt, (x ∗ y) ∗ z = x ∗ (y ∗ z)

Einselement: es gibt kein Einselement (Die Vermutung das dies die 1 ist, ist

falsch, denn 1 liegt nicht M)

http://info1.informatik.uni-karlsruhe.de

21

Aufgabe 1: Nachweis: Halbgruppe – Monoid

Überprüfen Sie, ob es sich bei folgenden Strukturen um Halbgruppen oder Monoide

oder keines von beidem handelt. Beweisen Sie Ihre Aussage. Sie dürfen zum

Beweisen auf schon bekannte Eigenschaften aus der Vorlesung zurückgreifen. Zum

Widerlegen genügen begründete Gegenbeispiele.

c) Die Vektoraddition mit der Verknüpfung + : (a, b) + (c, d) = (a + c, b + d) auf der Mengeℕ0, der natürlichen Zahlen mit der Zahl Null.

Lösung c):

Die Struktur ist ein Monoid.

Beweis:

In beiden Stellen des Vektors findet unabhängig voneinander eine normale

Addition wie bei der Struktur in Aufgabenteil a) statt. Von dieser ist bekannt, dass

sie abgeschlossen und assoziativ ist und mit der Null ein Einselement, besitzt.

http://info1.informatik.uni-karlsruhe.de

22

Aufgabe 1: Nachweis: Halbgruppe – Monoid

Überprüfen Sie, ob es sich bei folgenden Strukturen um Halbgruppen oder Monoide

oder keines von beidem handelt. Beweisen Sie Ihre Aussage. Sie dürfen zum

Beweisen auf schon bekannte Eigenschaften aus der Vorlesung zurückgreifen. Zum

Widerlegen genügen begründete Gegenbeispiele.

d) Die Linksidentität mit der Verknüpfung # : a # b = a auf der Menge ℕ0 der

natürlichen Zahlen mit der Zahl Null.

Lösung d):

Die Struktur ist eine Halbgruppe, aber kein Monoid. Die Linksidentität mit der

Verknüpfung # auf ℕ0 ist abgeschlossen, erfüllt das Assoziativgesetz, sie besitzt

aber kein Einselement.

Beweis:

Abgeschlossenheit: für alle a, b ∈ ℕ0 gilt, a # b = a ∈ ℕ0

Assoziativität: für alle a, b, c ∈ ℕ0 gilt, a # (b # c) = a # b = a = a # c = (a # b) # c

Einselement: es gibt kein Einselement (z.B. a # e = a ⇒ jedes e ∈ ℕ0 ist

Rechtseins, aber e # a = e ⇒ kein e ∈ ℕ0 ist Linkseins )

http://info1.informatik.uni-karlsruhe.de

23

Aufgabe 1: Nachweis: Halbgruppe – Monoid

Überprüfen Sie, ob es sich bei folgenden Strukturen um Halbgruppen oder Monoide

oder keines von beidem handelt. Beweisen Sie Ihre Aussage. Sie dürfen zum

Beweisen auf schon bekannte Eigenschaften aus der Vorlesung zurückgreifen. Zum

Widerlegen genügen begründete Gegenbeispiele.

e) Die Konkatenation von Zeichenketten (Strings) in Java.

Lösung e):

Die Struktur ist ein Monoid. Die Konkatenation von Zeichenketten (Strings) in Java

ist abgeschlossen, erfüllt das Assoziativgesetz und besitzt als Einselement die

leere Zeichenkette.

Beweis:

Abgeschlossenheit: für alle a, b ∈ String gilt, a b = a ∈ String

Assoziativität: für alle a, b, c ∈ String gilt, a (b c) = a (bc) = abc = (ab) c = (a b) c

Einselement: Der String e=“ “ leere Zeichenkette ist das Einselement.

Es gilt a = a e und a = e a.

http://info1.informatik.uni-karlsruhe.de

24

PraxisString-Manipulation

http://info1.informatik.uni-karlsruhe.de

25

Java (String-Manipulation)

• Es gibt viele verschiedene Wege mit Strings zu arbeiten

• Viele Dinge lassen sich direkt mit den Methoden des String-Objekts bewerkstelligen (String.length(), String.charAt(int), String.equals(String), String.startsWith(String), …)

• Für komplexere Anwendungen empfiehlt sich die Umwandlung in andere Datenstrukturen. Hier sind die Folgenden besonders wichtig:• char-Array

• StringBuffer

• Beim char-Array handelt es sich um ein normales Array, das jedes Zeichen im String enthält (v.l.n.r.). Für einen String der Länge 10 wird also ein Array der Größe 10 mit den Indizes 0 bis 9 erstellt.• Umwandlung erfolgt mit der Methode String.toCharArray()

http://info1.informatik.uni-karlsruhe.de

26

Java (StringBuffer)

• Häufig ist es jedoch angebracht, mit dem komplexen Datentyp StringBuffer zu arbeiten, da dieser viele nützliche (und schnelle) Funktionen bietet (u.a. zur Zeichenersetzung, Vertauschung, Suche, …)• Erzeugen eines neuen StringBuffers mittels Konstruktor:

• StringBuffer sb = new StringBuffer(String);

• Nützliche Methoden:

• StringBuffer.length(), StringBuffer.charAt(int), StringBuffer.toString(), StringBuffer.append(Sting), StringBuffer.delete(int, int), StringBuffer.substring(int, int), StringBuffer.replace(int, int, String)

• Beispielsweise lässt sich im String "Java ist doof!" das letzte Wort folgendermaßen ersetzen:

• StringBuffer sb = new StringBuffer("Java ist doof!");

• sb.replace(9, 13, "klasse");

http://info1.informatik.uni-karlsruhe.de

27

Fragen? Questions?

Fragen? Questions?

Fragen? Questions?

Fragen? Questions?

Fragen? Questions?Fragen? Questions?

Fragen? Questions?

Fragen? Questions?

Fragen? Questions? Fragen? Questions?

Fragen? Questions? Fragen? Questions?

Fragen? Questions?

Questions?

Fragen?

http://info1.informatik.uni-karlsruhe.de

28

Bis bald …

http://info1.informatik.uni-karlsruhe.de

29

Credits

• Erstellung und Zusammenstellung des Materials:

• Christian Maier (Zusammenstellung)

• Stephan Kessler (Überarbeitung und Erweiterung)

• Till Fischer (Folien zur String-Manipulation)