(a) T und N sind endliche Mengen mit T ∩ N

Werbung
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
Herunterladen