Grundlagen der Informatik I “Programmierung”
Grundlagen der Informatik I “Programmierung” Grundlagen der Informatik I “Programmierung”
Funktionen, die auf allen Elementen von A definiert sind, heißen total. Ist eine Funktionen – wie die Funktion f mit f(x)=1/x – auf einigen Elementen undefiniert sein, dann heißen sie partiell. Die Menge der Argumente, auf denen eine Funktion f definiert ist, heißt der Domain von f. Den Ausdruck “f ist die Funktion mit f(x)=1/x für alle x” kürzen wir manchmal mit “f=λx. 1/x” ab. Zwei Funktionen f:A→B und g:B→C können durch Komposition zusammengesetzt werden zu einer neuen Funktion h:A→C mit h(x)=g(f(x)) für alle x. 2.3.2 Bedingte Ausdrücke Bei der Beschreibung der Prädikatenlogik wurde jeder syntaktischen Konstruktion ein Wert in der Zielsprache (der Grundmengen und Wahrheitswerte) zugeordnet. Im allgemeinen ist eine solche Zuordnung nicht ganz einfach sondern benötigt einen komplexen Ausdruck zur Beschreibung des Wertes. Bei der Semantik des Allquantors, z.B. mußten wir schreiben: s ((∀ Variable : Bereich . Satz), state) = if Bereich = {} then wahr else let x ∈ Bereich in s (Satz, state + [Variable ↦→ x]) und s ((∀ Variable : Bereich-{x} . Satz), state) Hierbei haben wir eine Fallunterscheidung eingesetzt, die wir – angepaßt an die meist englischsprachige Literatur mit if..then..else bezeichnen. Sie erlaubt es, Werte abhängig von einer Bedingung zu berechnen: Wert1 falls Bedingung wahr ist Wert = if Bedingung then Wert1 else Wert2 entspricht Wert = Wert2 sonst Mit der Fallunterscheidung lassen sich z.B. die Zieloperatoren der Aussagenlogik beschreiben: a und b = if a then b else falsch a oder b = if a then wahr else b . 2.3.3 Abkürzungen Um zu vermeiden, daß komplexe Teilausdrücke mehrmals explizit in einem Ausdruck genannt werden müssen, kann man abkürzende Bezeichnungen dafür einführen. Die Konstruktion “let x=Teilausdruck in Ausdruck” bedeutet, daß einmal der Wert des Teilausdrucks bestimmt wird und dann alle Vorkommen von x im Term Ausdruck durch den Wert des Teilausdrucks ersetzt werden. Der Wert des gesamten Ausdrucks ist dann der Wert von Ausdruck nach dieser Ersetzung, d.h. der Wert des Terms Ausdruck Teilausdruck x Beispiel 2.3.1 Der Wert von let r=10 in let π=3.1415 in 2*π*r ist let π=3.1415 in 2*π*10. Weiteres Auswerten ergibt 2*3.1415*10 = 62.830. Die Konstruktion “let x ∈Bereich in Ausdruck” bedeutet, daß zunächst die durch Bereich bezeichnete (endliche) Menge berechnet wird und dann ein beliebiger Wert aus dieser Menge gewählt wird. Dann werden, wie zuvor, alle Vorkommen von x im Term Ausdruck durch diesen Wert ersetzt. Der Wert des gesamten Ausdrucks ist dann der Wert von Ausdruck nach der Ersetzung. Üblicherweise kann man nicht genau sagen, was dieser Wert ist – er ist indeterminiert Beispiel 2.3.2 Der Wert von ‘let x ∈{1,2,3} in 2*x’ ist entweder 2 oder 4 oder 6.
Wichtig ist, daß die Auswahl des Wertes aus dem Bereich frei ist, aber dann innerhalb des Ausdruckes festliegt. Zuweilen ist die let-Schreibweise etwas unübersichtlich, wenn der Teilausdruck so groß ist, daß er die eigentliche Funktionsdefinition in den Hintergrund drängt. In diesem Fall schreibt man Ausdruck where x=Teilausdruck statt let x=Teilausdruck in Ausdruck und Ausdruck where x ∈Bereich statt let x ∈Bereich in Ausdruck 2.3.4 Tabellen Tabellen wurden bereits im Abschnitt 2.1.3 (siehe Seite 36) verwendet um die Belegung logischer Variablen zu beschreiben. Darüberhinaus benötigt man sie zur Erklärung der Bedeutung von Bezeichnern einer Programmiersprache, zur Charakterisierung des Speichers usw. Daher ist es sinnvoll, den Begriff der Tabelle und die hierbei verwendeten Notationen näher zu erklären. Im Prinzip ist eine Tabelle nichts anderes als eine Funktion, die nur auf endlich vielen Argumenten definiert ist, also einen endlichen Domain hat: tab : Argumenttyp → Werttyp Im Gegensatz zu Funktionen, die auf unendlich vielen Argumenten definiert sind, lassen sich endliche Funktionen durch ihren Graphen oder eine Wertetabelle beschreiben (daher der Name). Jedem gegebenen Argument arg ordnet die Tabelle einen Wert aus dem Wertebereich zu. Die Argumente werden links, die Werte rechts aufgelistet. Beispiel 2.3.3 Die Funktion fak5:IN→IN sei die Funktion, welche auf den Argumenten 1..5 die Fakultät angibt: Definitionsbereich Wertebereich 1 1 2 2 3 6 4 24 5 120 Den aus der Tabelle tab ersichtlichen Funktionswert wert eines Arguments arg beschreiben wir durch die bei Funktionen übliche Schreibweise: “tab(arg)=wert”. So ist also z.B. fak5(4)=24. Da der Domain einer Tabelle endlich ist, können wir ihn aufzählen. Die Funktion, die den Domain einer Tabelle bestimmt, nennen wir domain. Beispiel: domain(fak5) = {1,2,3,4,5} Der Test, ob die Tabelle tab für ein Argument arg definiert ist, entspricht der Frage, ob arg ein Element von domain(tab) ist und wird entsprechend mit arg ∈ domain(tab) ausgedrückt. Damit sind die allgemeinen Zugriffe auf eine gegebene Tabelle beschrieben. Darüberhinaus ist es aber auch nötig, Tabellen neu aufzubauen oder zu verändern, wie z.B. bei einer Zustandstabelle für einen Speicher. Mit [] wird die leere Tabelle bezeichnet, also eine Tabelle mit domain([]) = {}. [] entspricht also einer nirgends definierten Funktion. Eine Tabelle, die aus einem einzigen Wertepaar (arg,wert) besteht, wird (zur besseren Unterscheidung gegenüber anderen Mengen von Paaren) durch [arg↦→wert] beschrieben. Der Pfeil soll dabei die Zuordnung symbolisieren. Diese Tabelle hat beim Argument arg den Wert wert und ist sonst undefiniert. Tabellen mit mehreren Einträgen werden als Folge von Einträgen dargestellt. Beispiel: fak5 = [1↦→1, 2↦→2, 3↦→6, 4↦→24, 5↦→120] Manchmal ist es nötig, eine Tabelle um weitere Einträge zu ergänzen, also eine Tabelle tab1 mit einer Tabelle tab2 zu verschmelzen. Da es aber prinzipiell möglich ist, daß beide Tabellen auf demselben Argument bereits definiert sind, aber verschiedene Werte an dieser Stelle haben, müssen wir festlegen, welcher von den beiden Einträgen nach der Verschmelzung noch gültig sein soll. Als Konvention hat sich bewährt, im Zweifel immer
- Seite 20 und 21: ser Zweig der Informatik beschäfti
- Seite 22 und 23: 5. Kompatibilität ist ein Maß daf
- Seite 24 und 25: ∀a ∈IN. teilt(a,a) ∧ teilt(a,
- Seite 26 und 27: durchgeführt werden, sofern man ni
- Seite 28 und 29: 1.2.2.3 Diskussion Bei der deskript
- Seite 30 und 31: Da 1215 ist wird die erste Anweisun
- Seite 32 und 33: Rahmen zu weit führen. Auffällig
- Seite 34 und 35: Durch das Konzept des Übersetzers
- Seite 36 und 37: und “örtlich” durch Zerlegung
- Seite 38 und 39: 1.3.4 Prozeduralisierung Das Beispi
- Seite 40 und 41: Man könnte das Objektkonzept von d
- Seite 43 und 44: Kapitel 2 Logik und formale Sprachb
- Seite 45 und 46: 2.1 Formale Sprachbeschreibungen Di
- Seite 47 und 48: möglichen Alternativen auf der rec
- Seite 49 und 50: Wenn wir eine Menge von Sprachen be
- Seite 51 und 52: Da wir im folgenden den Begriff der
- Seite 53 und 54: Für die Zuordnung zwischen der Obj
- Seite 55 und 56: Diese Form der Definition findet ih
- Seite 57 und 58: K1: Kommutativ-Gesetz E1 ∧E2 ≡
- Seite 59 und 60: Axiomenschemata: L1 A ∨ ¬A L2 (A
- Seite 61 und 62: In dem Kapitel über die Programmve
- Seite 63 und 64: 2. Es werden Quantoren eingeführt,
- Seite 65 und 66: s (T, state) = wahr s (F, state) =
- Seite 67 und 68: • x ist gebunden in p(t1, ..., tn
- Seite 69: Der Wert einer Aussage mit mehreren
- Seite 73 und 74: Wir geben hier eine Funktion an, di
- Seite 75: wichtigste formale Sprache zur Besc
- Seite 78 und 79: Wir wollen jedoch deutlich darauf h
- Seite 80 und 81: Buch, sondern sollten besser als ei
- Seite 82 und 83: Viel sinnvoller ist es, bei der Bes
- Seite 84 und 85: Entsprechend ihrer beabsichtigten B
- Seite 86 und 87: Klassen sind rein statische Beschre
- Seite 88 und 89: leeren Verweis (d.h. von machen Per
- Seite 90 und 91: haben wie z.B. “(jahr:INTEGER)”
- Seite 92 und 93: und diese erzeugten Objekte mit Ver
- Seite 94 und 95: Bei der Erzeugung von Objekten mitt
- Seite 96 und 97: über den Namen eines Attributs Wer
- Seite 98 und 99: • Die Veränderung und Auswertung
- Seite 100 und 101: 3.5 Copy- und Referenz-Semantik In
- Seite 102 und 103: 3.5.2 expanded: Klassen mit Copy-Se
- Seite 104 und 105: class LIST[X] creation new feature
- Seite 106 und 107: Dieses Problem wird durch das Konze
- Seite 108 und 109: 3.7.1 Zusicherungen Eiffel logische
- Seite 110 und 111: class ARRAY[X] creation make featur
- Seite 112 und 113: class ARRAY[X] creation make featur
- Seite 114 und 115: formulieren und zu überwachen. Eig
- Seite 116 und 117: 3.8.2 Export geerbter Features Norm
- Seite 118 und 119: Ist also p ein Personenobjekt und a
Funktionen, die auf allen Elementen von A definiert sind, heißen total. Ist eine Funktionen – wie die Funktion<br />
f mit f(x)=1/x – auf einigen Elementen undefiniert sein, dann heißen sie partiell. Die Menge <strong>der</strong> Argumente,<br />
auf denen eine Funktion f definiert ist, heißt <strong>der</strong> Domain von f.<br />
Den Ausdruck “f ist die Funktion mit f(x)=1/x für alle x” kürzen wir manchmal mit “f=λx. 1/x” ab.<br />
Zwei Funktionen f:A→B und g:B→C können durch Komposition zusammengesetzt werden zu einer neuen<br />
Funktion h:A→C mit h(x)=g(f(x)) für alle x.<br />
2.3.2 Bedingte Ausdrücke<br />
Bei <strong>der</strong> Beschreibung <strong>der</strong> Prädikatenlogik wurde je<strong>der</strong> syntaktischen Konstruktion ein Wert in <strong>der</strong> Zielsprache<br />
(<strong>der</strong> Grundmengen und Wahrheitswerte) zugeordnet. Im allgemeinen ist eine solche Zuordnung nicht ganz<br />
einfach son<strong>der</strong>n benötigt einen komplexen Ausdruck zur Beschreibung des Wertes. Bei <strong>der</strong> Semantik des<br />
Allquantors, z.B. mußten wir schreiben:<br />
s ((∀ Variable : Bereich . Satz), state) = if Bereich = {} then wahr<br />
else let x ∈ Bereich in<br />
s (Satz, state + [Variable ↦→ x]) und<br />
s ((∀ Variable : Bereich-{x} . Satz), state)<br />
Hierbei haben wir eine Fallunterscheidung eingesetzt, die wir – angepaßt an die meist englischsprachige Literatur<br />
mit if..then..else bezeichnen. Sie erlaubt es, Werte abhängig von einer Bedingung zu berechnen:<br />
<br />
Wert1 falls Bedingung wahr ist<br />
Wert = if Bedingung then Wert1 else Wert2 entspricht Wert =<br />
Wert2 sonst<br />
Mit <strong>der</strong> Fallunterscheidung lassen sich z.B. die Zieloperatoren <strong>der</strong> Aussagenlogik beschreiben:<br />
a und b = if a then b else falsch<br />
a o<strong>der</strong> b = if a then wahr else b<br />
.<br />
2.3.3 Abkürzungen<br />
Um zu vermeiden, daß komplexe Teilausdrücke mehrmals explizit in einem Ausdruck genannt werden müssen,<br />
kann man abkürzende Bezeichnungen dafür einführen.<br />
Die Konstruktion “let x=Teilausdruck in Ausdruck” bedeutet, daß einmal <strong>der</strong> Wert des Teilausdrucks<br />
bestimmt wird und dann alle Vorkommen von x im Term Ausdruck durch den Wert des Teilausdrucks ersetzt<br />
werden. Der Wert des gesamten Ausdrucks ist dann <strong>der</strong> Wert von Ausdruck nach dieser Ersetzung, d.h. <strong>der</strong><br />
Wert des Terms Ausdruck <br />
Teilausdruck<br />
x<br />
Beispiel 2.3.1<br />
Der Wert von let r=10 in let π=3.1415 in 2*π*r ist let π=3.1415 in 2*π*10.<br />
Weiteres Auswerten ergibt 2*3.1415*10 = 62.830.<br />
Die Konstruktion “let x ∈Bereich in Ausdruck” bedeutet, daß zunächst die durch Bereich bezeichnete<br />
(endliche) Menge berechnet wird und dann ein beliebiger Wert aus dieser Menge gewählt wird. Dann werden,<br />
wie zuvor, alle Vorkommen von x im Term Ausdruck durch diesen Wert ersetzt. Der Wert des gesamten<br />
Ausdrucks ist dann <strong>der</strong> Wert von Ausdruck nach <strong>der</strong> Ersetzung. Üblicherweise kann man nicht genau sagen,<br />
was dieser Wert ist – er ist indeterminiert<br />
Beispiel 2.3.2 Der Wert von ‘let x ∈{1,2,3} in 2*x’ ist entwe<strong>der</strong> 2 o<strong>der</strong> 4 o<strong>der</strong> 6.