Grundlagen der Informatik I “Programmierung”

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

22.08.2013 Aufrufe

2.1.3 Semantik Wir werden nun zeigen, wie man die Semantik einer Sprache definieren kann. Zu diesem Zweck führen wir die ’denotationale’ Semantik ein. Vorab sei jedoch gesagt, daß weitere Formen existieren. Streng genommen ist die denotationale Interpretation einer Sprache die Beschreibung des Zusammenhangs zwischen Sätzen der zu definierenden Sprache (Quellsprache) und einer zweiten, bei der man so tut, als wäre deren Bedeutung klar. Dies ist bespielsweise der Fall, wenn die Semantik der französischen Sprache mittels der deutschen beschrieben wird. Diese zweite Sprache bezeichnen wir als Zielsprache. Die Berechtigung für die Annahme, daß die Bedeutung der Zielsprache bekannt sei, ergibt sich daraus, daß für die Interpretation der Zielsprache häufig eine Struktur gewählt wird, die mathematisch gesehen, eine bekannte ist. Beispiele hierfür sind der (mathematische) Verband, Ring usw. Der erste Schritt besteht darin, daß die Objekte (i.e. die Terminalsymbole) der Zielsprache aufgeführt werden. In unserem Fall ist das die Menge der Wahrheitswerte, wahr und falsch. Weiter benötigen wir eine Menge von Operationen auf den Objekten der Zielsprache. Im Fall der Aussagenlogik sind das die Operationen und, oder, nicht, impl und gleich. Man beachte, daß wir im vorhergegangenen Abschnitt ’Syntax der Aussagenlogik’ nur eine Menge von Zeichen (¬, ∧, ∨, ⇒ , ⇔ , (, )) eingeführt haben. Den einzelnen syntaktischen Alternativen der Quellsprache wird mittels einer Interpretationsfunktion eine Bedeutung in der Zielsprache zugeordnet. Die Zielsprache ist eine funktionale, d.h. alle Ausdrücke werden als Funktionen beschrieben. Dem französischen Wort ’chien’ wird das deutsche Wort ’Hund’ zugeordnet. Eine Eigenschaft der formalen Logik soll hier noch hervorgehoben werden. Üblicherweise wird bei der Definition einer formalen Logik unterschieden zwischen Symbolen, die Operationen ausdrücken (z.B. ∧) und anderen, z.B. Bezeichnern. Erstere werden auch als Operatoren bezeichnet. In der Definition der Semantik wird dann jedem Operationssymbol der Logiksprache genau ein Operationssymbol der Semantiksprache zugeordnet. Dies ist für die Definition der Semantik einer formalen Sprache aber nicht zwingend. Es ist statt dessen natürlich auch möglich, alle Symbole der Quellsprache auf ein Symbol der Semantiksprache abzubilden (u.U. mit verschiedenen Parametern) oder abhängig von dem Zusammenhang in dem das quellsprachliche Symbol auftritt, verschiedene Zielsprachensymbole zu verwenden. Typische Beispiele für solche Fälle finden sich bei der Übersetzung natürlicher Sprachen ineinander. Hier kommt es sowohl vor, daß einem Verb (als Analogon zu einem Operator) mehrere Bedeutungen in der anderen Sprache zugeordnet werden oder aber mehreren Verben nur eine. Beispiel für den ersten Fall ist die Interpretation des deutschen Wortes ’können’ als ’savoir’ oder ’pouvoir’, je nach intendierter Bedeutung. Ein Beispiel für den zweiten Fall ergibt sich aus der Umkehrung, wenn Französich in Deutsch ’übersetzt’ wird. Normalerweise ist man in der Logik an den Eigenschaften formaler Systeme interessiert. Daraus ergibt sich die Notwendigkeit, diesen Systemen eine Semantik zu geben. Hierbei ist es häufig von Interesse, zu prüfen, welche Typen von Semantik für ein formales System ’Sinn machen’ und welche Typen von Aussagen unabhängig von der gewählten Semantik immer ’richtig’ sind. Wir benutzen die Logik als formales Beschreibungsmittel. Also müssen wir auch eine Idee davon entwickeln, welcher Typ Aussage ’wahr’ ist, bzw. wie der Begriff der Wahrheit überhaupt in unserem formalen System gefaßt werden kann. Eine allgemeinere Motivation für die Einführung von Quellsprachen überhaupt ist, daß es hierdurch ermöglicht wird, die betrachtete Abstraktionsebene zu verändern, bzw. das Beschreibungswerkzeug, denn das genau ist die Sprache, den Anforderungen des zu beschreibenden Gebietes anzupassen. In üblichen Lehrbüchern zum Thema Logik wird häufig mehr oder weniger darüber hinweggegangen, daß zunächst die Syntax und anschließend die Semantik der verwendeten formalen Sprache definiert werden müssen. Häufig werden die quell- und die metasprachlichen Operatoren einfach gleichgesetzt und der Zwischenschritt über die Semantik vermieden. Die dann angegebene Wertetafel erscheint dann eine Wertetafel für die Quellsprache zu sein. Unsere Motivation, diese Dinge möglichst sauber zu trennen, ist eine zweifache. Zum einen werden hiermit die Grundlage derjenigen Mechanismen zur Verfügung gestellt, die später für die Definition der Programmiersprache Eiffel verwendet werden. Zum anderen wird dadurch die Notwendigkeit des Kapitels über Ableitungssysteme deutlicher.

Für die Zuordnung zwischen der Objekten der Quellsprache und denen der Zielsprache benötigen wir wiederum eine Metasprache. Diese entspricht der BNF im Fall der Syntax. Deren Elemente werden wir jedoch nur insoweit einführen, als daß wir sie aktuell benötigen. Später, bei der Definition der Programmiersprache Eiffel, werden wir weitere Konstruktionselemente kennenlernen. Hier soll zunächst am Beispiel der Aussagenlogik die prinzipielle Vorgehensweise dargestellt werden. Im ersten Schritt definieren wir die Zielsprache. Wir führen zunächst die Objekte der Zielsprache ein: Ziel Wahrheitswerte = { wahr, falsch} Ziel Operatoren = { und, oder, nicht, impl, gleich } und legen weiter fest, daß für die Anwendung der Ziel Operatoren auf die Ziel Wahrheitswerte folgende Wertetabelle gelten soll. Dabei zeigt in der folgenden Tabelle jede Zeile für eine mögliche Wertekombination von b und c den Wert der fünf zielsprachlichen Operationen. b c (nicht b) (b und c) (b oder c) ( b impl c) (b gleich c) falsch falsch wahr falsch falsch wahr wahr falsch wahr wahr falsch wahr wahr falsch wahr falsch falsch falsch wahr falsch falsch wahr wahr falsch wahr wahr wahr wahr Abbildung 2.7: Wahrheitstafel für die Aussagenlogik Der Wert einer Aussage mit mehr als einem Operator wird dadurch bestimmt, daß obige Tabelle solange auf die Teilaussagen angewandt wird, bis die gesamte Aussage auf wahr oder falsch reduziert ist. Beispiel: ((wahr und falsch) oder (wahr und wahr)) ❀ (falsch oder wahr) ❀ wahr An dieser Stelle wird ’❀’ benutzt, um die sich aus der Wahrheitstafel ergebende Gleichheit zu beschreiben. ❀ ist dabei kein Element der Sprache der Aussagenlogik. Da es aber nur endlich viele Symbole für die verschiedenen Gleichheiten gibt und meist ohnehin aus dem Kontext entscheidbar ist, welches gemeint ist, werden wir im folgenden statt ❀ immer = schreiben. Nun sind wir in der Lage, in der Zielsprache zu rechnen. Der nächste Schritt besteht darin, den Zusammenhang zwischen Ausdrücken der Quell- und denen der Zielsprache festzulegen. Hierzu benötigen wir zunächst den Begriff der Funktionalität. Die Funktionalität gibt an, welche Typen Objekte haben dürfen, auf die eine Funktion angewendet werden soll. Typen sind dabei Mengen. Ein Beispiel aus der Analysis möge dies einführen. Die Funktionalität der Wurzelfunktion kann beschrieben werden als: √ : Reelle-Zahl → Reelle-Zahl Dieser Ausdruck ist so zu interpretieren, daß √ eine Abbildung von Reelle-Zahl nach Reelle-Zahl ist. Es wird also gefordert, daß die Funktion √ nur auf Elemente aus der Menge der reellen Zahlen angewendet werden darf. Ergebnis ist immer ein Element aus der Menge rechts des letzten Pfeils. Allgemeiner könnte man auch schreiben: √ : Reelle-Funktion → Reelle-Funktion Hier wäre Reelle-Funktion eine Funktion, die ihrerseits eine reelle Funktion als Ergebnis liefert. Diese Verallgemeinerung ist sinnvoll, da nur so beschrieben werden kann, daß Funktionen auf Funktionen angewendet werden dürfen. Ein Beispiel hierfür ist die Funktion 3 √ , die durch Anwendung der Funktion √ auf die Funk- tion 3 √ entsteht. Ein weiteres Beispiel ist die wohl bekannte Multiplikationsfunktion. Üblicherweise schreiben wir: a ∗ b = c, alternativ könnte man dies jedoch als mult(a, b) = c schreiben. Die erste Schreibweise bezeichnet man auch als Infix-Notation und die zweite als Prefix-Notation. mult ist eine zweistellige Funktion, mit mult : IR × IR→IR. Man mache sich deutlich, daß natürlich auch gilt: ∗ : IR × IR→IR. Durch die Infix- Schreibweise wird weniger deutlich, daß ∗, + usw. natürlich auch Funktionen sind und zwar Funktionen der Stelligkeit zwei.

2.1.3 Semantik<br />

Wir werden nun zeigen, wie man die Semantik einer Sprache definieren kann. Zu diesem Zweck führen wir<br />

die ’denotationale’ Semantik ein. Vorab sei jedoch gesagt, daß weitere Formen existieren. Streng genommen<br />

ist die denotationale Interpretation einer Sprache die Beschreibung des Zusammenhangs zwischen Sätzen <strong>der</strong><br />

zu definierenden Sprache (Quellsprache) und einer zweiten, bei <strong>der</strong> man so tut, als wäre <strong>der</strong>en Bedeutung<br />

klar. Dies ist bespielsweise <strong>der</strong> Fall, wenn die Semantik <strong>der</strong> französischen Sprache mittels <strong>der</strong> deutschen<br />

beschrieben wird. Diese zweite Sprache bezeichnen wir als Zielsprache. Die Berechtigung für die Annahme,<br />

daß die Bedeutung <strong>der</strong> Zielsprache bekannt sei, ergibt sich daraus, daß für die Interpretation <strong>der</strong> Zielsprache<br />

häufig eine Struktur gewählt wird, die mathematisch gesehen, eine bekannte ist. Beispiele hierfür sind <strong>der</strong><br />

(mathematische) Verband, Ring usw.<br />

Der erste Schritt besteht darin, daß die Objekte (i.e. die Terminalsymbole) <strong>der</strong> Zielsprache aufgeführt werden.<br />

In unserem Fall ist das die Menge <strong>der</strong> Wahrheitswerte, wahr und falsch. Weiter benötigen wir eine Menge<br />

von Operationen auf den Objekten <strong>der</strong> Zielsprache. Im Fall <strong>der</strong> Aussagenlogik sind das die Operationen<br />

und, o<strong>der</strong>, nicht, impl und gleich. Man beachte, daß wir im vorhergegangenen Abschnitt ’Syntax <strong>der</strong><br />

Aussagenlogik’ nur eine Menge von Zeichen (¬, ∧, ∨, ⇒ , ⇔ , (, )) eingeführt haben.<br />

Den einzelnen syntaktischen Alternativen <strong>der</strong> Quellsprache wird mittels einer Interpretationsfunktion eine<br />

Bedeutung in <strong>der</strong> Zielsprache zugeordnet. Die Zielsprache ist eine funktionale, d.h. alle Ausdrücke werden als<br />

Funktionen beschrieben. Dem französischen Wort ’chien’ wird das deutsche Wort ’Hund’ zugeordnet.<br />

Eine Eigenschaft <strong>der</strong> formalen Logik soll hier noch hervorgehoben werden. Üblicherweise wird bei <strong>der</strong> Definition<br />

einer formalen Logik unterschieden zwischen Symbolen, die Operationen ausdrücken (z.B. ∧) und<br />

an<strong>der</strong>en, z.B. Bezeichnern. Erstere werden auch als Operatoren bezeichnet. In <strong>der</strong> Definition <strong>der</strong> Semantik<br />

wird dann jedem Operationssymbol <strong>der</strong> Logiksprache genau ein Operationssymbol <strong>der</strong> Semantiksprache zugeordnet.<br />

Dies ist für die Definition <strong>der</strong> Semantik einer formalen Sprache aber nicht zwingend. Es ist statt<br />

dessen natürlich auch möglich, alle Symbole <strong>der</strong> Quellsprache auf ein Symbol <strong>der</strong> Semantiksprache abzubilden<br />

(u.U. mit verschiedenen Parametern) o<strong>der</strong> abhängig von dem Zusammenhang in dem das quellsprachliche<br />

Symbol auftritt, verschiedene Zielsprachensymbole zu verwenden. Typische Beispiele für solche Fälle finden<br />

sich bei <strong>der</strong> Übersetzung natürlicher Sprachen ineinan<strong>der</strong>. Hier kommt es sowohl vor, daß einem Verb (als<br />

Analogon zu einem Operator) mehrere Bedeutungen in <strong>der</strong> an<strong>der</strong>en Sprache zugeordnet werden o<strong>der</strong> aber<br />

mehreren Verben nur eine. Beispiel für den ersten Fall ist die Interpretation des deutschen Wortes ’können’<br />

als ’savoir’ o<strong>der</strong> ’pouvoir’, je nach intendierter Bedeutung. Ein Beispiel für den zweiten Fall ergibt sich aus <strong>der</strong><br />

Umkehrung, wenn Französich in Deutsch ’übersetzt’ wird. Normalerweise ist man in <strong>der</strong> Logik an den Eigenschaften<br />

formaler Systeme interessiert. Daraus ergibt sich die Notwendigkeit, diesen Systemen eine Semantik<br />

zu geben. Hierbei ist es häufig von Interesse, zu prüfen, welche Typen von Semantik für ein formales System<br />

’Sinn machen’ und welche Typen von Aussagen unabhängig von <strong>der</strong> gewählten Semantik immer ’richtig’ sind.<br />

Wir benutzen die Logik als formales Beschreibungsmittel. Also müssen wir auch eine Idee davon entwickeln,<br />

welcher Typ Aussage ’wahr’ ist, bzw. wie <strong>der</strong> Begriff <strong>der</strong> Wahrheit überhaupt in unserem formalen System<br />

gefaßt werden kann. Eine allgemeinere Motivation für die Einführung von Quellsprachen überhaupt ist, daß es<br />

hierdurch ermöglicht wird, die betrachtete Abstraktionsebene zu verän<strong>der</strong>n, bzw. das Beschreibungswerkzeug,<br />

denn das genau ist die Sprache, den Anfor<strong>der</strong>ungen des zu beschreibenden Gebietes anzupassen.<br />

In üblichen Lehrbüchern zum Thema Logik wird häufig mehr o<strong>der</strong> weniger darüber hinweggegangen, daß<br />

zunächst die Syntax und anschließend die Semantik <strong>der</strong> verwendeten formalen Sprache definiert werden<br />

müssen. Häufig werden die quell- und die metasprachlichen Operatoren einfach gleichgesetzt und <strong>der</strong> Zwischenschritt<br />

über die Semantik vermieden. Die dann angegebene Wertetafel erscheint dann eine Wertetafel<br />

für die Quellsprache zu sein. Unsere Motivation, diese Dinge möglichst sauber zu trennen, ist eine zweifache.<br />

Zum einen werden hiermit die Grundlage <strong>der</strong>jenigen Mechanismen zur Verfügung gestellt, die später für die<br />

Definition <strong>der</strong> Programmiersprache Eiffel verwendet werden. Zum an<strong>der</strong>en wird dadurch die Notwendigkeit<br />

des Kapitels über Ableitungssysteme deutlicher.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!