Grundlagen der Informatik I “Programmierung”

Grundlagen der Informatik I “Programmierung” Grundlagen der Informatik I “Programmierung”

22.08.2013 Aufrufe

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

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.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!