Begriff der Grammatik Eine Grammatik G ist ein Viertupel (T, N, P, S) mit (a) T und N sind endliche Mengen mit T ∩ N = ∅; T heißt Menge der Terminalsymbole, N heißt Menge der Nichtterminalsymbole (Metasymbole) (b) P ist eine endliche Menge von Produktionsregeln (Ableitungsregeln) der Gestalt u → v, wobei u, v ∈ (T ∪ N )∗ sind und u wenigstens ein Nichtterminalsymbol enthält Anwendung einer solchen Regel: u darf in einer Ableitung durch v ersetzt werden (c) S ist das Startsymbol (S ∈ N ) Eine Grammatik heißt genau dann kontextfrei, falls für alle Produktionsregeln gilt, dass die linke Seite u ein Nichtterminalsymbol ist. Die durch eine Grammatik G erzeugte Sprache L(G) bestehe aus genau denjenigen Zeichenketten, die höchstens Terminalsymbole enthalten und aus dem Startsymbol in endlich vielen Schritten abgeleitet werden können. Zwei Grammatiken G1 und G2 heißen genau dann äquivalent, wenn L(G1) = L(G2) ist. 47 Backus–Naur–Grammatiken Bei den Erweiterten Backus–Naur–Form–Grammatiken (EBNF–Grammatiken) handelt es sich um eine spezielle Notationsform für kontextfreie Grammatiken. Dabei wird anstelle von ”u → v” meist ”< u >::= v” geschrieben, und u muss ein Nichtterminalsymbol sein. Weiterhin werden folgende Vereinbarungen getroffen: • die endlich vielen Regeln < u >::= v1 , < u >::= v2, · · · , < u >::= vn können zusammengefasst werden in < u >::= v1 |v2| · · · |vn (Alternative) • die beiden Regeln < u >::= αγ, < u >::= αβγ können zusammengefasst werden in < u >::= α[β]γ (Option) • die drei Regeln < u >::= αγ, < u >::= α < u1 > γ, < u1 >::= β| < u1 > β können mit u als Startsymbol zusammengefasst werden in < u >::= αβ ∗ γ (manchmal auch < u >::= α{β}γ) (Wiederholung) • die zwei Regeln < u >::= α < u1 > γ, < u1 >::= β| < u1 > β können mit u als Startsymbol zusammengefasst werden in < u >::= αβ + γ (Wiederholung, mindestens einmal) 48 Interne Darstellungen ganzer Zahlen Falls n Bit für die interne Darstellung zur Verfügung stehen, so werden Konstanten und die Werte von Variablen von • unsigned–Typen (unsigned short, unsigned int, unsigned long und unsigned long long) durch ihr duales Äquivalent intern abgespeichert, so dass also genau die Werte von 0 bis 2n − 1 möglich sind • signed–Typen (short, int, long und long long) derart intern abgespeichert, dass die Werte von 0 bis 2n−1 − 1 durch ihr duales Äquivalent (genau hier hat das höchstwertige Bit den Wert 0) dargestellt und die übrigen möglichen internen Darstellungen (das sind diejenigen, bei denen das höchstwertige Bit den Wert 1 hat) als negative Werte interpretiert werden, deren Betrag das duale Äquivalent des Zweierkomplements der internen Darstellung ist (siehe dazu beispielweiseauch die Folien 8 und 10 von cprog071.pdf) Das Zweierkomplement einer natürlichen Zahl k < 2n bzgl. eines Datenformats von n Bit hat den Wert 2n − k. Es gilt für jedes k mit 0 ≤ k < 2n : (Zweierkomplement von k bzgl. n Bit) = (Einerkomplement von k bzgl. n Bit) + 1, wobei das Einer– bzw. Stellenkomplement von k bzgl. n Bit als bitweise Negation der dualen Darstellung von k, vorher durch führende Nullen auf die Länge n ergänzt, ist. So sind also beispielsweise als Werte von Variablen des Typs short (intern 16 Bit) die Zahlen von −215 bis 215 − 1 möglich mit folgenden internen Darstellungen: dezimaler Wert −32768 −32767 .. . −2 −1 0 1 2 .. . 32767 interne Darstellung 10000000 00000000 10000000 00000001 .. . 11111111 11111110 11111111 11111111 00000000 00000000 00000000 00000001 00000000 00000010 .. . 01111111 11111111 (siehe z. B. auch die Programme int dar1.c und limit int1.c) 49 reelle Datentypen Reelle Zahlen werden intern als Gleitpunktzahlen (Fließkommazahlen, floating point numbers) abgespeichert. Über die Tastatur werden sie als Festpunktzahlen (z. B. 3.1415) oder als Gleitpunktzahlen (z. B. 314.15e-2 oder 314.15E-2) eingegeben und dann in ihre internen Darstellungen konvertiert. Beachte: Schon beispielsweise die Dezimalzahl 0.1 kann intern nicht exakt abgespeichert werden, da ihre duale Darstellung periodisch unendlich ist (siehe Übungsaufgabe 11). Von der Gleitpunktzahl 314.15e-2 ist 314.15 ihre Mantisse, e das Exponentenkennzeichen (für die Basis 10) und -2 der Exponent (zur Basis 10). Intern werden Gleitpunktzahlen im ANSI/IEEE–Format abgespeichert, und zwar in der Regel als normalisierte Gleitpunktzahlen, wobei anstelle des Exponenten die Charakteristik verwendet wird. Eine normalisiert duale Mantisse beginnt mit einer 1, gefolgt vom Dualpunkt und weiteren Dualziffern. Dabei wird die 1 vor dem Punkt nicht mit abgespeichert, aber natürlich bei Berechnungen mit berücksichtigt. Die folgende Tabelle zeigt für die reellen Datentypen float, double und long double die Anzahlen der für ihre internen Darstellungen verwendeten Bytes und wieviele Bits davon für die Mantissen (ohne das Normalisierungsbit), die Charakteristiken und das Vorzeichen der Zahl benutzt werden: Anz. Bytes Anz. Bits Mant. Anz. Bits Char. Anz. Bits Vorz. float 4 23 8 1 double 8 52 11 1 long double 10 (Intel) 63 16 1 16 (Sparc) 112 15 1 (siehe insbesondere auch das Programm limit float1.c) Je größer die Anzahl der Mantissenstellen ist, um so dichter liegen die Maschinenzahlen und umso genauer können Zahlen intern dargestellt werden. Die Lücken zwischen benachbarten Maschinenzahlen werden nach außen hin (von der Null weg) immer größer. Je größer die Anzahl der Bits für die Charakteristik ist, umso größer ist die jeweils größte intern darstellbare und umso kleiner ist die kleinste positive intern darstellbare Maschinenzahl. Die intern darstellbaren Gleitpunktzahlen liegen symmetrisch zur Null. 50 Interne Darstellung von 4–Byte–Gleitpunktzahlen nach ANSI/IEEE 754 ANSI: American Standard Institute IEEE: Institute of Electrical and Electronics Engineers Vorzeichen VZ Charakteristik c Mantisse m 1 Bit 8 Bit 23 Bit Wert einer solchen internen Darstellung: c 6= 0000 0000 (c 6= 0) und c 6= 1111 1111 (c 6= 255): (−1)V Z ∗ 2c−127 ∗ (1.m)2 (normalisierte Darstellung) größte darstellbare normalisierte Zahl: (−1)0 ∗ 2127 ∗ (1.7F F F F F )16 = 2127 ∗ (2 − 2−23) ≈ 3.4 ∗ 1038 kleinste darstellbare normalisierte positive Zahl: (−1)0 ∗ 21−127 ∗ (1.0 · · · 0)2 = 2−126 ≈ 1.1754 ∗ 10−38 Sonderfälle: c = 0, m = 0: 0 c = 0, m 6= 0: (−1)V Z ∗ 2−126 ∗ (0.m)2 (bei sehr kleinen Werten wird die Normalisierung aufgehoben, so dass 2−126 ∗ 2−23 = 2−149 ≈ 1.4013 ∗ 10−45 die kleinste intern darstellbare positive Zahl ist; im Falle c=0 ist -126 als zugehöriger Exponent festgelegt, diese Zahl ist auch für normalisierte interne Darstellungen der kleinstmögliche Exponent) c = 255, m = 0: ”(−1)V Z ∗ ∞” √ c = 255, m = 6 0: NaN (Not a Number, z.B. für ” −2”, ”0/0”, ”0 ∗ ∞”) Beispiel: interne Darstellung der Dezimalzahl -19.625 im float–Format Da (−19.625)10 = (−10011.101)2 = −24 ∗ (1.00111010 · · · 0)2 ist, ergibt sich 1 1000 0011 001 1101 0000 0000 0000 0000 (die ”1” vor dem Dualpunkt wird nicht mit abgespeichert). Die internen Darstellungen von Gleitpunktzahlen behandeln z. B. die Programme int float1.c und int float2.c. siehe dazu beispielsweise Blieberger, J., Burgstaller, B. und G.–H. Schildt: Informatik Grundlagen. Springer–Verlag Wien 2005 51 Gleitpunktarithmetik Wenn im Computer mit Gleitpunktzahlen gerechnet wird, so werden laufend Rundungsfehler gemacht. Diese werden nicht angezeigt, nur wenn die größte intern darstellbare Zahl (z. B. ≈ 3.4 ∗ 1038 für den Datentyp float) überschritten oder die kleinste (negative) intern darstellbare Zahl (z. B. ≈ −3.4 ∗ 1038 für den Datentyp float) unterschritten werden, so werden eine overflow–Fehlermeldung ausgegeben und die Berechnung abgebrochen. Addition bzw. Subtraktion zweier Gleitpunktzahlen im Computer: • falls die beiden Exponenten unterschiedlich groß sind, so werden der kleinere der beiden Exponenten an den größeren angepasst und der Dualpunkt entsprechend verschoben; jetzt stehen die Mantissenstellen zu gleichen Zweierpotenzen untereinander • Addition bzw. Subtraktion der Mantissen • Normalisierung des Ergebnisses (falls notwendig) • Rundung auf das vorgegebene interne Format (falls Anzahl der Mantissenstellen zu groß) Multiplikation bzw. Division zweier Gleitpunktzahlen im Computer: • Multiplikation bzw. Division der Mantissen • Addition bzw. Subtraktion der Exponenten • Normalisierung des Ergebnisses (falls notwendig) • Rundung auf das vorgegebene interne Format (falls Anzahl der Mantissenstellen zu groß) Bezüglich dieser Gleitpunktarithmetik gelten aufgrund der Rundungsfehler manche der Rechengesetze, wie sie bei exakter Rechnung gelten, nicht mehr. Auch ist der Test zweier Gleitpunktzahlen im Computer auf Gleichheit nur mit Vorsicht zu verwenden, da die exakten Werte i. A. nicht bekannt sind. 52 Rundungsfehler und Maschinengenauigkeit Rundung einer normalisierten dualen Gleitpunktzahl x mit mehr als t Mantissenstellen nach dem Dualpunkt auf t Stellen nach dem Dualpunkt: Es sei x := 1.z1z2 · · · zt zt+1 · · · ∗ 2e Dann sei rd(x) := 1.z1z2 · · · zt ∗ 2e (1.z1z2 · · · zt zt+1 + 2−t−1) ∗ 2e falls zt+1 = 0 falls zt+1 = 1 Damit gilt für den relativen Fehler von rd(x), falls x 6= 0 ist: rd(x) − x x −t−1 = ≤2 1 ∗ 2−t 2 Werden anstelle des Rundens die Mantissenstellen nach zt einfach abgeschnitten (”chopping”) und heißt der dabei erhaltene Wert chp(x), so gilt für dessen relativen Fehler chp(x) x − x ≤ 2−t (x 6= 0) Diese Zahl 2−t heißt Maschinengenauigkeit und hat also beispielsweise für den Datentyp float den Wert 2−23 (die Maschinengenauigkeiten sind in float.h definiert und haben dort die Namen FLT EPSILON, DBL EPSILON und LDBL EPSILON, siehe auch limit float1.c und masch gen.c). Pseudocode zur Berechnung der Maschinengenauigkeit masch eps: masch_eps := 0.5; x := 1.0; while (masch_eps + x > x) masch_eps := masch_eps * 0.5; (fortgesetzte Halbierung) masch_eps := masch_eps * 2.0; (letzte Halbierung rueckgaengig) Ausgabe: masch_eps Es ist masch eps die kleinste positive Zweierpotenz mit negativem Exponenten, so dass die Gleitpunktzahl 1.0 + masch eps im Computer gerade noch als Zahl größer als 1.0 erkannt wird. Zahlen x, deren exakte Werte betragsmäßig zwischen 0 und der kleinsten (nichtnormalisierten) internen Gleitpunktzahl liegen, befinden sich im underflow–Bereich und werden auf den Wert 0 gerundet. Hier ergibt sich ein relativer Fehler von 1 bzw. von 100%, sämtliche in x enthaltenen Informationen gehen verloren! 53 Numbercruncher Top 10 der Supercomputer (November 2006) nach Linpack-Benchmark (s. www.netlib.org/linpack) Rang in Klammern: Platzierung im Juni 2006 (Quelle: Computerzeitung vom 13.11.2006; s. auch www.top500.org) Rang Hersteller Rechner Standort 1 (1) IBM 2 (9) Cray 3 (2) IBM 4 (3) IBM 5 (11) IBM 6 (6) Dell 7 (5) Bull 8 (4) SGI 9 (7) NEC/sun Blue Gene/L, PPC440, 0.7 GHz Red Storm, XT3, Opteron, 2 GHz Blue Gene, PPC440, 0.7 GHz Asci Purple, P–Series 575, 1.9 GHz Mare Nostrum, JS21 Cluster, PPC970, 2.3 GHz Thunderbird, Poweredge 1850, 3.6 GHz Tera–10, Novascale 5160, Itanium 2, 1.5 GHz Columbia, Altix, Itanium 2, 1.5 GHz Tsubame,Sunfire X4600 Opteron, 2.4/2.6 GHz Jaguar XT3, Opteron Dualcore, 2.6 GHz Lawrence Livermore National Lab, USA Sandia National Labs, Albuquerque, USA IBM Thomas J. Watson Research Center, USA Lawrence Livermore National Lab, USA Barcelona Supercomputer Center, Spanien Sandia National Labs, Albuquerque, USA CEA, Bruyeres–le-Chatel, Frankreich NASA Ames Research Center, Moffett Field, USA GSIC Center, Tokyo Institute of Technology, Japan Oak Ridge National Lab, USA 10 (13) Cray Leistung (Gigaflops) 280 600 101 400 91 290 75 760 62 630 53 000 52 840 51 870 47 380 43 480 Teraflops und Rundungsfehler Beispielsweise der Earth Simulator (Earth Simulator Center, Yokohama, Japan, 35 860 Gigaflops) löst ein lineares Gleichungssystem mit mehr als einer Million Unbekannten in etwas mehr als 5 Stunden. Dabei wird eine gigantische Zahlenflut erzeugt, denn ein Teraflops–Computer kann in jeder Sekunde soviele Zahlen erzeugen, wie auf einen Stapel von 100 Kilometern Höhe dünner Papierblätter passen, wenn auf jedes Blatt 1000 Zahlen geschrieben würden und 100 Blatt Papier einen Stapel von 1 cm Höhe ergeben. Der Earth Simulator kann also in jeder Sekunde so viele Zahlen erzeugen, wie auf einen Stapel von 3500 km Höhe passen. So drängt sich die Frage auf, ob das berechnete Ergebnis auch richtig ist, denn bei Durchführung jeder Gleitpunktoperation werden Rundungsfehler gemacht (s. auch die Programme double1.c bis double9.c). In Zukunft sollte ein Supercomputer–Ranking auch unter dem Gesichtspunkt durchgeführt werden, wieviele Stellen des berechneten Ergebnisses korrekt sind. (s. dazu Kulisch, U.: Löst das berechnete Ergebnis die Aufgabe? Computer-Zeitung vom 6. September 2004) 54 asymptotische Laufzeitabschätzung • gesucht ist eine obere Schranke für die Laufzeit T (n) eines Algorithmus, der n Eingabedaten hat (z.B. ein Array mit n Elementen; n kann aber z.B. auch für die Anzahl der Dualstellen eines einzigen Eingabedatums stehen) • die obere Schranke soll unabhängig sein vom konkreten Rechner, von der Programmiersprache und vom Compiler; es soll auf einen konstanten Faktor für die Ausführungszeit einer einzelnen Anweisung nicht ankommen; konkret soll es für jedes Programm eine positive konstante Zahl c geben, so dass die Ausführungszeiten jeder elementaren arithmetischen Operation, jeder booleschen Operation, jeder Vergleichsoperation, jeder einfachen Wertzuweisung variable := term und jedes Aufrufs einer Ein- oder Ausgabefunktion durch c nach oben beschränkt sind • ausschlaggebend für die Einordnung von T (n) soll der für immer größer werdendes n dominante Teil von T (n) sein Diese Vorgaben führen auf den Begriff der asymptotischen Laufzeitkomplexität, die mit Hilfe der O–Notation (gesprochen: groß–Oh bzw. big–Oh) angegeben wird: Ist f : N → N oder f : N → R+ und ist T (n) die Laufzeit eines Algorithmus, so bedeute T (n) ∈ O(f (n)) dass es eine natürliche Zahl n0 eine eine positive reelle Zahl c gibt, so dass für alle k ∈ N mit k ≥ n0 gilt: T (k) ≤ c ∗ f (k). formalisiert: T (n) ∈ O(f (n)) ↔ ∃n0 ∃c(n0 ∈ N ∧ c ∈ R ∧ c > 0 ∧ ∀k(k ∈ N ∧ k ≥ n0 → T (k) ≤ c ∗ f (k))) andere übliche Schreibweisen: statt ”T (n) ∈ O(f (n))” findet man auch ’T (n) = O(f (n))” bzw. ’T (n) ist ein O(f (n))”. Wenn für alle n, die gößer als ein n1 sind, stets f (n) ≤ g(n) ist, und wenn T (n) ∈ O(f (n)) gilt, so ist natürlich erst recht T (n) ∈ O(g(n)). Um die asymptotische Laufzeitkomplexität also in hoher Qualität anzugeben, ist eine Funktion f in O(f (n)) gefragt, die möglichst kleine Funktionswerte hat bzw. möglichst langsam wächst. Zusätzlich sollte der f beschreibende Term von einfacher Gestalt sein. 55 wichtige Eigenschaften der O–Notation Für Funktionen f, g, h : N → R+ und Konstanten a, a0 , · · · , ak gelten die folgenden Beziehungen: • ∃c(c > 0 ∧ ∀j(j ∈ N → f (j) ≤ c)) → f (n) ∈ O(1) • ak ∗ nk + ak−1 ∗ nk−1 + · · · + a0 ∈ O(nk ) • a ∗ f (n) ∈ O(f (n)) • f (n) ∈ O(g(n)) ∧ g(n) ∈ O(h(n)) → f (n) ∈ O(h(n)) • f (n) + g(n) ∈ O(max{f (n), g(n)}) • f (n) ∗ g(n) ∈ O(f (n) ∗ g(n)) Für Funktionen f, g : N → R+ bedeute f ≺g (”f wächst asymptotisch langsamer als g”), dass lim n→∞ f (n) =0 g(n) ist. Dann gilt für beliebige Konstanten ε, c mit 0 < ε < 1 < c und den Logarithmus log zu irgendeiner Basis b > 1: 1 ≺ log log n ≺ log n ≺ nε ≺ n ≺ n∗log n ≺ nc ≺ nlog n ≺ cn ≺ n! ≺ nn ≺ c(c Ist beispielsweise T (n) ∈ O(nc ) bzw. T (n) ∈ O(cn ), so spricht man von polynomieller bzw. exponentieller Laufzeitkomplexität. Das Wachstumsverhalten einiger ausgewählter Funktionen zeigt, dass Algorithmen mit exponentieller Laufzeitkomplexität schon für relativ kleine n eine nicht mehr praktikable Laufzeit haben: n ln(n) √ n n n*ln(n) n2 n3 2n n! nn 1 5 10 20 50 100 0 1.6· · · 2.3· · · 2.9· · · 3.9· · · 4.6· · · 1 2.2· · · 3.1· · · 4.4· · · 7.0· · · 10 1 5 10 20 50 100 0 8.0· · · 23.0· · · 59.9· · · 195.6· · · 460.5· · · 1 25 100 400 2500 10000 1 125 1000 8000 125000 1000000 2 32 1024 1048576 1.126e15 1.267e30 1 120 3628800 2.43· · ·e18 3.04· · ·e64 9.33· · ·e157 1 3125 1e10 1.04· · ·e26 8.88· · ·e84 1e200 56 n ) Beispiele für schwer handhabbare bzw. lösbare Probleme (intractable problems) 1. Problem des Handlungsreisenden (travelling salesman problem; auch: Rundreiseproblem) Ein Vertreter muss n Städte besuchen, deren Entfernungen untereinander bekannt sind. Er besucht jede nur einmal und kehrt am Schluss zum Ausgangsort zurück. In welcher Reihenfolge muss er die Städte besuchen, damit der gesamte von ihm zurückgelegte Weg minimal ist? 2. Erfüllbarkeit Boolescher Terme (SAT; satisfiability of Boolean expressions) Es sei B ein beliebiger Boolescher Term in den Variablen x1, · · · , xn. Ist B erfüllbar? 3. Rucksackproblem (knapsack problem) Es seien n Gegenstände mit unterschiedlichen Werten und Gewichten gegeben. Ein Rucksack soll damit derart gefüllt werden, dass ein zulässiges Gesamtgewicht nicht überschritten wird und gleichzeitig der Gesamtwert der Gegenstände im Rucksack möglichst groß ist. Wie ist der Rucksack zu füllen? 4. Zerlegungsproblem (partitioning problem) Gegeben sei ein n–Tupel (a1, · · · , an ) natürlicher Zahlen. Gibt es dann eine Zerlegung der Menge M := {1, · · · , n} in zwei Teilmengen M1 und M2 , so dass gilt P P = ? i∈M1 ai i∈M2 ai Für alle diese Probleme sind bis heute keine Lösungsalgorithmen mit geringerer als exponentieller Laufzeit bekannt. 57 Halteproblem Gesucht ist ein Algorithmus, der, angewandt auf ein beliebiges Programm P und eine beliebige zugelassene Eingabe für P , stets entscheidet, ob P bei dieser Eingabe terminiert oder nicht. Zugelassene Eingabe für P : Enthält P an Variablen beispielsweise genau x1, · · · , xn als Variablen für natürliche Zahlen, so sei genau jedes n-Tupel i1 , · · · , in natürlicher Zahlen eine zugelassene Eingabe für P (xj wird mit ij initialisiert). (Anstelle von ”Programm” hätte auch ”Turing–Maschine” oder ”partiell– rekursive zahlentheoretische Funktion” (s. u.) notiert werden können. Eine zugelassene Eingabe für die Turing–Maschine wäre eine beliebige anfängliche Bandbeschriftung, wobei nur endlich viele Zellen beschriftet sein dürfen.) Äquivalenzproblem für Programme Gesucht ist ein Algorithmus, der, angewandt auf ein beliebiges Paar (P1, P2 ) von Programmen P1 und P2 , stets entscheidet, ob P1 und P2 äquivalent sind oder nicht. Dabei heißen zwei Programme genau dann äquivalent, wenn beide Programme bei gleichen Eingaben sich stets gleich verhalten: Entweder beide terminieren und liefern die gleichen Resultate oder beide terminieren nicht. Sowohl das Halteproblem als auch das Äquivalenzproblem sind nicht lösbar. 58 POSTsches Korrespondenzproblem Emil Leon Post (1897 - 1954) • gegeben: ein beliebiges Alphabet A und eine beliebige endliche Folge ((v1, w1), · · · , (vk , wk )) von Wortpaaren (vi, wi) mit vi , wi ∈ A+ für alle i mit 1 ≤ i ≤ k • gesucht: eine Folge (i1 , i2, · · · , in ) von Indizes mit n ≥ 1, 1 ≤ i1 , · · · , in ≤ k, so dass gilt v i1 ◦ v i2 ◦ · · · ◦ v in = wi1 ◦ wi2 ◦ · · · ◦ win Eine solche Folge (i1 , i2, · · · , in ), falls sie existiert, heißt eine Lösung des Korrespondenzproblems ((v1, w1), · · · , (vk , wk )). Beispiel: A := {0, 1}, KP := ((1, 101), (10, 00), (011, 11)) Dann besitzt das Korrespondenzproblem KP beispielsweise die Lösung (1, 3, 2, 3). Zehntes HILBERTsches Problem David Hilbert (1862 - 1943) Gesucht ist ein Algorithmus, der, angewandt auf eine beliebige diophantische Gleichung, aussagt, ob diese lösbar ist oder nicht. Y. V. Matijasevic̆ zeigte 1970, dass es keinen solchen Algorithmus gibt. diophantische Gleichung: P (x1 , · · · , xn) = 0 wobei P (x1 , · · · , xn) ein Polynom mit ganzzahligen Koeffizienten in den Variablen x1, · · · , xn ist. Als Lösungen sind nur n–Tupel ganzer Zahlen zugelassen. Beispiel: Die diophantische Gleichung x31 + 2x1x2 − x23 + x2 − 4 = 0 ist lösbar, denn beispielsweise (1,1,0) ist eine Lösung. 59 Gödelisierung Kurt Gödel (1906 - 1978) Den Zeichen eines Alphabetes A := {a1 , · · · , an } sowie den nichtleeren Zeichenketten und den endlichen Folgen von Zeichenketten über diesem Alphabet werden effektiv und eineindeutig natürliche Zahlen, ihre Gödel– Nummern, zugeordnet. • G(a1 ) := 1, G(a2 ) := 3, · · · , G(an ) := 2 ∗ n − 1 • w := ai1 · · · aik ∈ A+ ; dann sei G(ai1 ) G(w) := p1 G(ai2 ) ∗ p2 G(aik ) ∗ · · · ∗ pk wobei pi die i–te Primzahl sei • W := (w(1), · · · , w(r) ) ∈ (A+)r ; dann sei G(w(1) ) G(W ) := p1 G(w(2) ) ∗ p2 ∗ · · · ∗ prG(w (r) ) Von jeder natürlichen Zahl ist effektiv entscheidbar, ob sie die Gödel– Nummer eines Zeichens, einer Zeichenkette oder einer Folge von Zeichenketten über A ist oder nicht. Falls eine natürliche Zahl eine Gödel–Nummer ist, so kann ihr Urbild bzgl. G effektiv bestimmt werden. 60 generelle Fragen, die zusammen mit einem Problemlösungsprozess auftreten Nach der Formulierung eines Problems stellen sich folgende Fragen bzw. müssen folgende weitere Probleme bearbeitet werden: • Ist das Problem überhaupt lösbar? • Wenn es lösbar ist, gibt es genau eine oder gibt es mehrere Lösungen? • Wenn es eine Lösung gibt, ist diese oder sind alle Lösungen dann algorithmisch berechenbar? (Es gibt auch reine Existenzsätze!) • Wenn es eine algorithmisch berechenbare Lösung gibt, wie groß ist dann der Mindestaufwand, eine oder auch alle Lösungen zu berechnen? • Wenn das Problem algorithmisch lösbar ist, so finde einen möglichst laufzeit– (und/oder speicherplatz–) optimalen Algorithmus zur Bestimmung einer oder einiger oder aller Lösungen! • Wenn möglich, so beweise die Korrektheit des Algorithmus oder zumindest von ausschlaggebenden Teilen davon! • Welche Programmiersprache ist geeignet zur Implementierung des Algorithmus? • Welche Auswirkungen haben die begrenzten Ressourcen, z. B. Darstellungen von Daten in festen Formaten (→ Rundungsfehler, under– und overflow) sowie Beschränktheit der Speicherkapazität und der Rechenzeit auf die Genauigkeit der Ergebnisse und die Praktikabilität des Algorithmus? 61 Aussagen Aussagen sind sprachliche Gebilde, für die es sinnvoll ist zu fragen, ob sie wahr oder falsch sind. Sie können in einer natürlichen oder künstlichen Sprache formuliert sein. Eine wahre Aussage hat den Wahrheitswert wahr (auch: W bzw. true bzw. T bzw. 1), eine falsche Aussage den Wahrheitswert f alsch (auch: F bzw. f alse bzw. 0). Beispiele: • ”Die Zahl 5 ist eine Primzahl.” (W ) • ”Der November hat 31 Tage.” (F ) √ • ” 2 ist eine rationale Zahl.” (F ) • ”Es gibt unendlich viele Primzahen.” (W ) • ”Es gibt unendlich viele Primzahlzwillinge.” (?) • ”Jede gerade natürliche Zahl, die größer oder gleich 4 ist, lässt sich als Summe zweier Primzahlen darstellen.” (?) (Goldbachsche Vermutung von 1742) • ”Es gibt unendlich viele pythagoreische Tripel (a, b, c).” (W ) • ”Für jede natürliche Zahl n ≥ 3 und beliebige natürliche Zahlen a, b, c ungleich Null ist stets an + bn 6= cn .” (W ) (Großer Satz von Fermat, Pierre de Fermat 1601–1655; der Satz konnte erst 1993 bewiesen werden, und zwar von Andrew Wiles) 62 klassische (zweiwertige) Aussagenlogik Die klassische Aussagenlogik gründet sich auf den beiden folgenden Prinzipien: • Prinzip vom ausgeschlossenen Dritten: Jede Aussage ist nichts als wahr oder falsch. • Prinzip vom ausgeschlossenen Widerspruch: Es gibt keine Aussage, die sowohl wahr als auch falsch ist. Verknüpfungen von Aussagen: Aussagen können negiert und mit Hilfe von ”und”, ”oder”, ”wenn · · · dann · · ·”, ”· · · genau dann, wenn · · ·”, ”entweder · · · oder · · ·”, ”weder · · · noch · · ·” und weiteren Verknüpfungen zu zusammengesetzten Aussagen verbunden werden. elementare bzw. atomare Aussagen: Das sind Aussagen, die nicht auf die eben genannte Art aus einfacheren Aussagen zusammengesetzt sind. (Beispiele dazu: s. vorhergehende Folie) • Prinzip der Extensionalität: Der Wahrheitswert einer zusammengesetzten Aussage hängt nur ab von den Wahrheitswerten der darin vorkommenden atomaren Aussagen und der Art ihrer Verknüpfung. Es spielt also keine Rolle, ob irgendwelche inhaltlichen Zusammenhänge zwischen den Teilaussagen bestehen oder nicht. 63 Formalisierung zusammengesetzter Aussagen Es seien p bzw. q die beiden folgenden Aussagen: p: 2 ist ein Teiler von 3. q: 13 ist eine Primzahl. Dann sind ¬p, p∧q, p∨q, p → q bzw. p ↔ q Formalisierungen der folgenden Aussagen: • ¬p: Es ist nicht so, dass 2 ein Teiler von 3 ist. (Auch: 2 ist nicht Teiler von 3.) (W ) • p ∧ q: 2 ist ein Teiler von 3, und 13 ist eine Primzahl. (F ) • p ∨ q: 2 ist ein Teiler von 3, oder 13 ist eine Primzahl. (W ) • p → q: Wenn 2 ein Teiler von 3 ist, so ist 13 eine Primzahl. (W ) • p ↔ q: 2 ist genau dann ein Teiler von 3, wenn 13 eine Primzahl ist. (F ) Sei ferner r: 6 ist eine vollkommene Zahl. Dann entsprechen sich die folgenden Zeichenketten und verbal formulierten Aussagen: • p → (¬q ∧ ¬r): Wenn 2 ein Teiler von 3 ist, so ist weder 13 eine Primzahl noch 6 eine vollkommene Zahl. (W ) • ¬p ∧ ¬q ∧ ¬r: Es ist weder 2 ein Teiler von 3 noch ist 13 eine Primzahl noch ist 6 eine vollkommene Zahl. (F ) 64 BOOLEsche Terme (aussagenlogische Ausdrücke) (George Boole, 1815 - 1864) Es seien p, q, r, p1, p2, · · · Variablen, die nur die Werte true bzw. f alse (oder: 1 bzw. 0) annehmen können. Mit Hilfe dieser Aussagen–Variablen und der Wahrheitswerte können auf folgende Weise die booleschen Terme definiert werden: (a) Rekursionsanfang Die Variablen p, q, r, p1, p2, · · · sowie die Konstanten true und f alse seien boolesche Terme. (b) Rekursionsschritt Falls A und B boolesche Terme sind, so seien auch ¬A, (A ∧ B), (A ∨ B), (A −→ B) und (A ←→ B) boolesche Terme. (c) Minimalbedingung Nur aufgrund von (a) und (b) sollen boolesche Terme erhalten werden können. Damit können boolesche Terme als spezielle Zeichenketten über dem Alphabet A := {true, f alse, p, q, r, |, ¬, ∧, ∨, →, ↔, (, )} aufgefasst werden (ersetze ”p1” durch ”p|”, ”p2” durch ”p||”, usw.). Klammereinsparungsregeln: Ein äußeres Klammernpaar darf weggelassen werden. Weiterhin soll jedes der Symbole ”¬”, ”∧”,”∨”,”→” und ”↔” stärker binden als alle in dieser Reihenfolge rechts neben ihm stehenden. Bemerkung: Man kann die booleschen Terme auch zunächst ohne ”−→” und ohne ”←→” einführen und dann definieren (s. auch die Folie zu den semantischen Äquivalenzen): ”A −→ B” stehe für ”¬A ∨ B” ”A ←→ B” stehe für ”(A −→ B) ∧ (B −→ A)” bzw. für ”(¬A ∨ B) ∧ (¬B ∨ A)” 65 eine EBNF–Grammatik zur Erzeugung der Booleschen Terme Die rekursive Definition boolescher Terme kann auch auf folgende Weise mit Hilfe einer EBNF–Grammatik erfolgen: T := {false, true, p, q, r, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ¬, ∧, ∨, →, ↔, (, ) } N := {bool term , variable , konstante , ziffer} S := bool term <konstante> ::= false | true <variable> ::= p{<ziffer>} | q | r <ziffer> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 <bool term> ::= <konstante> | (<bool term> (<bool term> (<bool term> (<bool term> <variable> | ¬ <bool term> | ∧ <bool term>) | ∨ <bool term>) | → <bool term>) | ↔ <bool term>) Die booleschen Terme lassen sich natürlich auch leicht mit Hilfe eines Syntaxdiagrammes erzeugen. 66 Semantik boolescher Terme Es sei f: {p, q, r, p1, p2 , · · · } −→ {false, true}. (Die Funktion f heißt dann eine Belegung der Aussagenvariablen mit Wahrheitswerten.) Dann sei der Wahrheitswert Ww(C,f) eines Booleschen Termes C bei der Belegung f wie folgt definiert: • Rekursionsanfang (C ist eine Konstante oder Variable) Ww(true,f) := true, Ww(false,f) := false Ww(p,f) := f(p), Ww(q,f) := f(q), Ww(r,f) := f(r), Ww(p1,f) := f(p1), · · · • Rekursionsschritt (C ist ein zusammengesetzter Term) Ww(¬A,f) true , falls Ww(A,f)=false false sonst true , falls Ww(A,f)=Ww(B,f)=true false sonst false , falls Ww(A,f)=Ww(B,f)=false true sonst := Ww((A ∧ B),f) := Ww((A ∨ B),f) := Ww((A → B),f) := Ww((A ↔ B),f) := false , falls Ww(A,f)=true und Ww(B,f)=false true sonst true , falls Ww(A,f)=Ww(B,f) false sonst 67 semantische Äquivalenz und Folgerungsbegriff für boolesche Terme Es seien A und B boolesche Terme. • A und B heißen semantisch äquivalent (in Zeichen: A ≡ B oder A ⇔ B) genau dann, wenn Ww(A,f) = Ww(B,f) ist für jede Belegung f der Aussagenvariablen mit Wahrheitswerten • B folgt aus A (in Zeichen: A |= B oder A ⇒ B) genau dann, wenn gilt: für jede Belegung f, für die Ww(A,f) = true ist, ist auch Ww(B,f) = true Dass B aus A folgt, kann äquivalent zu obiger Definition auch auf jede der beiden folgenden Weisen definiert werden: • für jede Belegung f, für die Ww(B,f) = false ist, ist auch Ww(A,f) = false • es gibt keine Belegung f mit Ww(A,f) = true und Ww(B,f) = false Beispiele: A ∨ ¬A ≡ true, A ∧ ¬A ≡ f alse A ∨ A ≡ A, A ∨ true ≡ true, A ∨ f alse ≡ A A ∧ A ≡ A, A ∧ true ≡ A, A ∧ f alse ≡ f alse A → B ≡ ¬A ∨ B, A → B ≡ ¬B → ¬A A ↔ B ≡ (¬A ∨ B) ∧ (A ∨ ¬B) A ⊕ B ≡ (A ∨ B) ∧ ¬(A ∧ B) (exklusives oder bzw. xor) A ∨ (A ∧ B) ≡ A, A ∧ (A ∨ B) ≡ A A ∨ (Ā ∧ B) ≡ A ∨ B, A ∧ (Ā ∨ B) ≡ A ∧ B A ∧ (A → B) ⇒ B Man kann auch durch jede der beiden folgenden Redeweisen ausdrücken, dass B aus A folgt: • A ist hinreichend für B • B ist notwendig für A 68 Ersetzbarkeitstheorem Es seien A, B, C drei boolesche Terme mit B ≡ C. Dann gilt: Kommt an irgendeiner Stelle in A der Term B als Teilzeichenkette vor und wird dieses Vorkommen von B durch den Term C ersetzt, so ist die dabei aus A entstehende Zeichenkette A′ wieder ein boolescher Term, und außerdem ist A ≡ A′ . Verallgemeinerung des Folgerungsbegriffs auf mehrere Prämissen A1 , · · · , An • B folgt aus A1, · · · , An (in Zeichen: A1, · · · , An |= B oder A1 , · · · , An ⇒ B) genau dann, wenn gilt: für jede Belegung f, für die Ww(A1,f) = · · · = Ww(An,f) = true ist, ist auch Ww(B,f) = true Weitere grundlegende Begriffe für boolesche Terme • A heißt eine Tautologie genau dann, wenn Ww(A,f) = true ist für jede Belegung f • A heißt eine Kontradiktion genau dann, wenn Ww(A,f) = false ist für jede Belegung f • A heißt erfüllbar genau dann, wenn Ww(A,f) = true ist für wenigstens eine Belegung f Es gilt: Genau dann, wenn A ≡ B ist, ist A ↔ B eine Tautologie; genau dann, wenn A1, · · · , An ⇒ B ist, ist A1 ∧ · · · ∧ An → B eine Tautologie; genau dann, wenn A1 , · · · , An ⇒ B ist, ist A1 ∧ · · · ∧ An ∧ ¬B eine Kontradiktion 69 Gesetze einer BOOLEschen Algebra (B, 0, 1, ¯, ∧, ∨) (z.B. B = {true, false}, 0=false, 1=true,¯= ¬) Es ist 0, 1 ∈ B mit 0 6= 1, und für alle x, y, z ∈ B gilt: ¯: B −→ B, ∧, ∨ : B × B −→ B, 1. x ∧ y ≡ y ∧ x , x ∨ y ≡ y ∨ x (Kommutativgesetze) 2. x ∧ (y ∧ z) ≡ (x ∧ y) ∧ z (Assoziativgesetze) , x ∨ (y ∨ z) ≡ (x ∨ y) ∨ z 3. x ∧ (x ∨ y) ≡ x , x ∨ (x ∧ y) ≡ x (Absorptions– bzw. Verschmelzungsgesetze) 4. x ∧ (y ∨ z) ≡ (x ∧ y) ∨ (x ∧ z) x ∨ (y ∧ z) ≡ (x ∨ y) ∧ (x ∨ z) (Distributivgesetze) 5. x ∧ 0 ≡ 0 , x ∧ 1 ≡ x (Existenz von Null– und Einselement (neutrale Elemente)) 6. x ∧ x̄ ≡ 0 , x ∨ x̄ ≡ 1 (Existenz des Komplements) In einer Booleschen Algebra gilt weiterhin für alle x, y ∈ B: • x∨0≡x , x∨1≡1 • x ∧ y ≡ x̄ ∨ ȳ , x ∨ y ≡ x̄ ∧ ȳ (De MORGANsche Gesetze) • x∧x≡x , x∨x≡x (Idempotenz) ¯≡x • x̄ (Doppelkomplement– bzw. Doppelnegationsgesetz) • 0̄ ≡ 1 , 1̄ ≡ 0 (Komplementarität der neutralen Elemente) • gilt T1 ≡ T2 für zwei Terme einer Booleschen Algebra und ersetzt man in T1 und in T2 simultan alle Vorkommen von ”∨” durch ”∧”, von ”∧” durch ”∨”, von ”0” durch ”1” und von ”1” durch ”0”, so erhält man wieder eine Äquivalenz. (Dualitätsprinzip der Booleschen Algebra) 70 Verifikation eines Programmes zur Bestimmung von q := n div m und von r := n mod m für nat. Zahlen n, m mit m 6= 0 Zugrunde liegt der Satz von der Division mit Rest: Zu zwei beliebig vorgegebenen natürlichen Zahlen n, m mit m 6= 0 gibt es genau zwei natürliche Zahlen q und r, für die gilt: n = m ∗ q + r und 0 ≤ r < m Bezeichnung für diese Zahlen: q = n div m (ganzer Teil des Quotienten bei der Division von n durch m); r = n mod m (Rest bei der Division von n durch m) Pseudocode zur Bestimmung von q und r: Eingabe: m, n ∈ N mit m 6= 0 /* Vorbedingung: n, m ∈ N ∧ 0 < m */ r = n; q = 0; /* Schleifeninvariante: 0 ≤ r ∧ 0 < m ∧ n = m ∗ q + r */ while (r >= m) { r = r − m; q = q + 1; } /* Nachbedingung: 0 ≤ r ∧ 0 < m ∧ r < m ∧ n = m ∗ q + r */ Ausgabe: q, r 71 Schleifeninvariante (loop invariant) logischer Ausdruck, der unmittelbar vor Eintritt in die Schleife wahr ist und dessen Wahrweitswert sich bei einem Schleifendurchlauf nicht ändert (falls die Schleifenbedingung erfüllt war); dass dieser Ausdruck immer dann wahr ist, ist induktiv zu beweisen, wobei der Parameter, nach dem der Induktions–Beweis durchgeführt wird, unterschiedliche Bedeutungen haben kann: • er kann angeben, das wievielte Mal der Test der Schleifenbedingung erreicht wurde • er kann die Laufvariable einer for–Schleife sein • er kann den Wert eines arithmetischen Terms, der von den Werten der Variablen des Programms abhängt und bei jedem Schleifendurchlauf um 1 wächst, haben Falls dann die Schleife terminiert, so gelten unmittelbar nach Verlassen der Schleife sowohl die Schleifeninvariante als auch die Negation der Schleifenbedingung, woraus sich durch semantisch äquivalentes Umformen oder durch Folgern Eigenschaften des betrachteten Algorithmus beweisen lassen. 72 Struktur indirekter Beweise Es soll indirekt gezeigt werden, dass B aus A1, · · · , An folgt. Dazu kann jede der drei folgenden semantischen Äquivalenzen benutzt werden: 1. A1 ∧ · · · ∧ An → B ≡ A1 ∧ · · · ∧ An ∧ ¬B → ¬Ai 2. A1 ∧ · · · ∧ An → B ≡ A1 ∧ · · · ∧ An ∧ ¬B → B 3. A1 ∧ · · · ∧ An → B ≡ A1 ∧ · · · ∧ An ∧ ¬B → F (1 ≤ i ≤ n) Es kann also die Negation ¬B von B mit zu den Prämissen hinzugenommen werden, und wenn es dann gelingt, zu zeigen, dass einer der folgenden Ausdrücke 1. ¬Ai (1 ≤ i ≤ n) 2. B 3. F bzw. C ∧ ¬C für einen Ausdruck C aus diesen um ¬B erweiterten Prämissen folgt, so hat man gezeigt, dass B aus A1, · · · , An folgt. Im ersten Fall hätte man einen Widerspruch zu einer Voraussetzung Ai , im zweiten Fall einen Widerspruch zur Annahme B und im dritten Fall einen logischen Widerspruch erhalten. Spezialfälle: 1. A1 → B ≡ A1 ∧ ¬B → ¬A1 A1 → B ≡ ¬B → ¬A1 (n = 1) Man hat demnach indirekt gezeigt, dass B aus A1 folgt, wenn man gezeigt hat, dass ¬A1 aus A1 und ¬B folgt oder dass ¬A1 aus ¬B folgt. 2. T → B ≡ ¬B → B bzw. B ≡ ¬B → B (n = 1 und A1 = T ) Man hat also indirekt gezeigt, dass B zutrifft, wenn man gezeigt hat, dass B aus ¬B folgt. 3. T → B ≡ ¬B → F bzw. B ≡ ¬B → F (n = 1 und A1 = T ) Man hat also indirekt gezeigt, dass B zutrifft, wenn man gezeigt hat, dass aus ¬B ein logischer Widerspruch folgt. Eine weitere Möglichkeit, indirekt zu zeigen, dass B zutrifft, erhält man daraus, dass A ∧ (¬B → ¬A) → B eine Tautologie ist. Man hat demnach gezeigt, dass B zutrifft, wenn man gezeigt hat, dass A zutrifft und dass ¬A aus ¬B folgt. 73 prädikatenlogische Terme zu den aussagenlogischen Symbolen kommen die folgenden hinzu: • (Individuen–)Konstanten: • (Individuen–)Variablen: • Prädikatensymbole: • Funktionssymbole: a1 , a2, · · · x1 , x2 , · · · Pik mit i, k = 1, 2, · · · ϕki mit i, k = 1, 2, · · · i: Unterscheidungsindex; k: Stelligkeit Dann können auf folgende Weise die prädikatenlogischen Terme definiert werden: (a) Rekursionsanfang Jede Konstante und jede Variable sei ein Term. (b) Rekursionsschritt Falls ϕ ein k–stelliges Funktionssymbol ist und t1 , · · · , tk prädikatenlogische Terme sind, so sei auch ϕ(t1, · · · , tk ) ein prädikatenlogischer Term (c) Minimalbedingung Nur aufgrund von (a) und (b) sollen prädikatenlogische Terme erhalten werden können. (Manchmal werden in der Literatur nullstellige Funktionssymbole anstelle der Konstanten verwendet.) 74 prädikatenlogische Ausdrücke Mit Hilfe der prädikatenlogischen Terme können auf folgende Weise die prädikatenlogischen Ausdrücke definiert werden: (a) Rekursionsanfang Falls P ein k–stelliges Prädikatensymbol ist und t1 , · · · , tk prädikatenlogische Terme sind, so sei P (t1 , · · · , tk ) ein prädikatenlogischer Ausdruck. (Diese prädikatenlogischen Ausdrücke heißen auch atomare prädikatenlogische Ausdrücke.) (b) Rekursionsschritt Falls A und B prädikatenlogische Ausdrücke sind, so seien auch ¬A, (A ∧ B), (A ∨ B), (A −→ B) und (A ←→ B) prädikatenlogische Ausdrücke; falls x eine Variable ist und A ein prädikatenlogischer Ausdruck, so seien auch ∀xA und ∃xA prädikatenlogische Ausdrücke. (c) Minimalbedingung Nur aufgrund von (a) und (b) sollen prädikatenlogische Ausdrücke erhalten werden können. Jedes Vorkommen einer Variablen in einem prädikatenlogischen Ausdruck ist entweder ein freies oder ein gebundenes: Ein Vorkommen von x in A heißt genau dann gebundenes Vorkommen, wenn dieses x in einem Teilausdruck von A der Gestalt ∀xB oder ∃xB vorkommt; sonst heiße ein Vorkommen von x freies Vorkommen Ein prädikatenlogischer Ausdruck ohne freie Vorkommen von Variablen heißt auch geschlossener Ausdruck bzw. Aussage. 75 Semantik der Prädikatenlogik 1. Termwertbestimmung Um den Termen und Ausdrücken eine Bedeutung zuordnen zu können, benötigt man zunächst eine nichtleere Menge IB (den Individuenbereich) sowie eine Funktion F mit Db(F ) := {ai |i ≥ 1} ∪ {Pik |i, k ≥ 1} ∪ {ϕki |i, k ≥ 1}, so dass gilt: • F (ai ) ist ein Element von IB (d.h. F (ai ) ∈ IB) • F (Pik ) ist eine k–stellige Relation in IB (d.h. F (Pik ) ⊆ IB k ) • F (ϕki ) ist eine k–stellige Funktion von IB in IB (d.h. F (ϕki ) : IB k → IB) (Kommt unter den zweistelligen Prädikatensymbolen das Gleichheitszeichen vor, so ist es stets durch die identische Relation in IB zu interpretieren.) Durch eine solche Interpretation (IB, F ) wird zusammen mit einer Belegung f der Individuen–Variablen mit Individuen (d.h., f : {xi|i ≥ 1} → IB) jedem Term T ein Wert (Individuum) W (T, F, f ) zugeordnet: nämlich • W (ai, F, f ) := F (ai ) für jede Konstante ai • W (xi, F, f ) := f (xi) für jede Variable xi • W (ϕ(t1, · · · , tk ), F, f ) := F (ϕ)(W (t1, F, f ), · · · , W (tk , F, f )) für jedes k–stellige Funktionssymbol ϕ und Terme t1 , · · · , tk (natürlich reicht es für einen vorgegebenen Term aus, nur die Interpretation bzw. Belegung der wirklich in ihm vorkommenden Symbole zu kennen, um ihm einen Wert zuordnen zu können). 76 2. Interpretation der Ausdrücke Jetzt kann mittels (IB, F ) und f jedem prädikatenlogischen Ausdruck A ein Wahrheitswert zugeordnet werden (abhängig von (IB, F ) und von f ): 1. falls A = P (t1 , · · · , tk ) ist für ein k–stelliges Prädikatensymbol P und Terme t1 , · · · , tk ,so sei true, falls ((W (t1, F, f ), · · · , W (tk , F, f )) ∈ F (P ) W w(A, F, f ) := f alse, sonst 2. A = ¬B: true, falls W w(B, F, f ) = f alse f alse, sonst true, falls W w(B, F, f ) = true und W w(C, F, f ) = true f alse, sonst f alse, falls W w(B, F, f ) = f alse und W w(C, F, f ) = f alse true, sonst f alse, falls W w(B, F, f ) = true und W w(C, F, f ) = f alse true, sonst true, falls W w(B, F, f ) = W w(C, F, f ) f alse, sonst true, falls für alle i ∈ IB gilt: W w(B[x/i], F, f ) = true f alse, sonst true, falls es ein i ∈ IB gibt mit W w(B[x/i], F, f ) = true f alse, sonst W w(A, F, f ) := A = (B ∧ C): W w(A, F, f ) := A = (B ∨ C): W w(A, F, f ) := A = (B → C): W w(A, F, f ) := A = (B ↔ C): W w(A, F, f ) := 3. A = ∀xB: W w(A, F, f ) := A = ∃xB: W w(A, F, f ) := Dabei sei B[x/i] derjenige Ausdruck, den man aus B dadurch erhält, dass alle freien Vorkommen von ”x” in B simultan durch das Individuum i ∈ IB ersetzt werden. Kommt in B die Variable x nicht frei vor, so ist W w(∀xB, F, f ) = W w(∃xB, F, f ) = W w(B, F, f ). Insbesondere gilt für jeden Ausdruck A ohne freie Vorkommen von Variablen (d.h. für jede Aussage A): Der Wahrheitswert von A hängt nur von der Interpretation (IB, F ) ab, nicht aber von Belegungen f der Individuen–Variablen mit Individuen. 77 Modellbegriff, Erfüllbarkeit, Allgemeingültigkeit, Folgerungsbegriff, semantische Äquivalenz • Eine Interpretation I = (IB, F ) ist zusammen mit einer Belegung f genau dann ein Modell für A (bzw. A gilt bzgl. I, f ), wenn W w(A, F, f ) = true ist. • Es heißt A genau dann allgemeingültig, symbolisch |= A, falls A bzgl. jeder Interpretation und jeder zugehörigen Belegung gilt. • Es heißt A genau dann erfüllbar, wenn es ein Modell für A gibt. • Ein prädikatenlogischer Ausdruck B folgt genau dann aus einer Menge M von prädikatenlogischen Ausdrücken, symbolisch M |= B, wenn bei jeder Interpretation und jeder zugehörigen Belegung, bei denen alle Ausdrücke aus M true sind, auch B true ist (d.h., jedes Modell aller Ausdrücke aus M ist auch ein Modell für B); B folgt aus A, symbolisch A |= B, wenn bei jeder Interpretation und jeder zugehörigen Belegung, bei denen A true ist, auch B true ist (d.h., jedes Modell für A ist auch ein Modell für B). • Zwei prädikatenlogische Ausdrücke A und B heißen genau dann semantisch äquivalent, symbolisch A ≡ B, wenn jedes Modell für A auch ein Modell für B ist und umgekehrt. Beziehungen zu entsprechenden aussagenlogischen Begriffen: Falls A eine aussagenlogische Tautologie ist und man für jede in A vorkommende Aussagenvariable einen prädikatenlogischen Ausdruck einsetzt (für gleiche Variablen natürlich gleiche Ausdrücke), so erhält man einen allgemeingültigen prädikatenlogischen Ausdruck. (Auf diese Weise lassen sich jedoch nicht alle allgemeingültigen prädikatenlogischen Ausdrücke konstruieren.) Analoges gilt bezüglich des Folgerungsbegriffs und bezüglich des Begriffs der semantischen Äquivalenz. 78 ein paar wichtige Eigenschaften der semantischen Begriffe Für prädikatenlogische Ausdrücke A, B, C und Mengen M solcher Ausdrücke gilt: • Negationsregeln ¬∀x A ≡ ∃x ¬A ¬∃x A ≡ ∀x ¬A • Vertauschungsregeln: ∀x∀y A ≡ ∀y∀x A ∃x∃y A ≡ ∃y∃x A • Ausklammerungsregeln: (∀x A) ∧ (∀x B) ≡ ∀x(A ∧ B) (∃x A) ∨ (∃x B) ≡ ∃x(A ∨ B) • (∀x A) ∨ (∀x B) |= ∀x(A ∨ B) (aber nicht umgekehrt) • ∃x(A ∧ B) |= (∃x A) ∧ (∃x B) (aber nicht umgekehrt) • ∃x∀y A |= ∀y∃x A (aber nicht umgekehrt) • falls A |= B gilt und A abgeschlossen ist, so ist (A → B) allgemeingültig • es ist A genau dann allgemeingültig, wenn ¬A nicht erfüllbar ist • falls A |= B und B |= C gilt, so ist A |= C • falls A allgemeingültig ist, so ist stets M |= A • falls M |= A und M |= A → B gilt, so gilt M |= B • falls M nur allgemeingültige Ausdrücke enthält und M |= A gilt, so ist A allgemeingültig • mögen in A genau die Variablen x1, · · · , xn frei vorkommen; dann gilt: A ist genau dann allgemeingültig, wenn ∀x1 · · · ∀xn A allgemeingültig ist; A ist genau dann erfüllbar, wenn ∃x1 · · · ∃xn A erfüllbar ist 79 programmiertechnische Umsetzung Pseudocodes für die programmiertechnische Realisierung zweier prädikatenlogischer Ausdrücke, wenn dabei ein endlicher Individuenbereich M vorgegeben ist: • ∀x(x ∈ M → P (x)) Pseudocode: flag := true; forall x ∈ M if (¬P (x)) { flag := false; break; } return flag; • ∃x(x ∈ M ∧ P (x)) Pseudocode: flag := false; forall x ∈ M if (P (x)) { flag := true; break; } return flag; Je nach der Art der Abspeicherung der Elemente von M sind die entsprechenden Schleifenkonstrukte zur Simulation von forall x ∈ M heranzuziehen. 80