390 likes | 559 Views
Theoretische Informatik I. Prof.-Dr. Peter Brezany Institut für Softwarewissenschaft Universität Wien, Liechtensteinstraße 22 1090 Wien Tel. : 01/4277 38825 E-mail : brezany@par.univie.ac.at Sprechstunde: Dienstag, 11.30-12.30. Einleitung Kontextfreie Sprachen und Grammatiken
E N D
Theoretische Informatik I Prof.-Dr. Peter Brezany Institut für Softwarewissenschaft Universität Wien, Liechtensteinstraße 22 1090 Wien Tel. : 01/4277 38825 E-mail : brezany@par.univie.ac.at Sprechstunde: Dienstag, 11.30-12.30
Einleitung Kontextfreie Sprachen und Grammatiken Reguläre Sprachen und endliche Automaten Die Chomsky Hierarchie: Sprachen, Grammatiken, Automaten Semantik und Verifikation Berechenbarkeit und Entscheidbarkeit Turingmaschinen Prädikatenlogik Inhalt
Hopcroft, Ullman: Formal Languages and Their Relation to Automata; Addison-Wesley Gries: The Science of Programming; Springer, 1991 [Kapitel 5] Brookshear: Theory of Computation -- Formal Languages, Automata, and Complexity; Benjamin/Cummings, 1989 Harel: Algorithmics. The Spirit of Computing. Addison-Wesley, 1987 Literatur
Sind alle Probleme algorithmisch lösbar (d.h., durch ein endliches Rechenverfahren beschreibbar) oder gibt es Probleme, die algorithmisch unlösbar sind? Wenn ein Problem algorithmisch lösbar ist, wie groß ist dann der Aufwand zur Berechnung der Lösung? Wie läßt sich die Syntax (Form) einer Programmiersprache präzise beschreiben? Wie läßt sich die Semantik (Bedeutung) einer Programmiersprache beschreiben? Wie läßt sich die Korrektheit eines Programms nachweisen? Welche Funktionen lassen sich in Sprachen wie Algol, Fortran, Pascal, C, C++, ADA, Java etc. ausdrücken? Ist irgendeine dieser Sprachen „mächtiger“ als eine andere? Kapitel 1: EinleitungAufgaben der Theoretischen Informatik
Kapitel 2: Kontextfreie Grammatiken und Sprachen Definition: Ein Alphabet ist eine nichtleere Menge von Symbolen (Zeichen). ƀ Beispiele: 0, 1 Binärzeichen 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Dezimalziffern a, b, c, ..., z Kleinbuchstaben a, ..., z, 0, ..., 9 Alphanumerische Zeichen a, ..., 9, , ..., , ... Java Unicode (eine Zechentabelle, die 65536 Einträge umfassen kann; jedem Zeichen ist also eine Zahl zwischen 0 und 65535 zugeordnet
Definition: Sei ein Alphabet. Die Menge der Zeichenketten (``Strings'', ``Worte'') über läßt sich rekursiv durch folgende Regel spezifizieren: 1. ist eine Zeichenkette über . heißt die leere Zeichenkette (Leerwort). 2. Ist x eine Zeichenkette über dem Alphabet und a, dann ist auch xa eine Zeichenkette über . 3. Jede Zeichenkette über wird ausschließlich durch Anwendung der Regeln 1 und 2 gebildet. ƀ
Beispiele für Zeichenketten • Bemerkung: Nicht alle dieser Zeichenketten müssen eine sinnvolle Semantik (Bedeutung) haben: siehe die beiden untersten Beispiele. • Zeichenketten über dem Binäralphabet {0, 1}: • , 0, 1, 00, 01, 10, 11, 000, 001, ... • Zeichenketten über dem Alphabet der Kleinbuchstaben: • haus, baum, uni, inu, muab, ... • Zeichenketten über dem unären Alphabet {I}: , I, II, III, IIII, ... • Zeichenketten über dem Alphabet {a,...,z, 0, ... 9, :, =,+,*, (, ), ... } • a:=b*(c+*(d-e)*3.141592), abc+)))(x • Zeichenketten über dem Alphabet der römischen Ziffern {M, D, C, L, • X, V, I}: • MCMXCV, MM, IIICCCMMM
Zeichenketten: Notation • Sei ein beliebiges Alphabet. • * ist die Menge aller Worte in . • Für ein beliebiges Zeichen a definiert a0 := und an := a...a • (a n-fach wiederholt) für n > 1. • Für ein beliebiges Wort x * wird die Länge von x durch |x| • dargestellt. • Es gilt: • |x| = 0, falls x = n, falls x = a1a2... an, n > 0
Konkatenation von Zeichenketten • Definition: Sei ein Alphabet und seien x, y Zeichenketten über , • wobei x = a1a2... am, y = b1b2... bn, m, n 0, ai,bi . • Die Konkatenation (Verkettung) von x und y ist die Zeichenkette • xy = a1a2... am b1b2... bn. ƀ • Spezialfall: Für jede Zeichenkette x gilt: x = x = x • Definition: Sei x * mit x = a1a2... am und m > 0. • Jedes Wort x´ = a1... ak (0 k m) ist ein Präfix von x. • Jedes Wort x´´ mit x = x´x´´ ist ein Suffix von x. ƀ • Ist x´ x bzw. x´´ x, so sprechen wir von einem echten Präfix bzw. Suffix von x.
Praktisches Beispiel: Zeichenketten in Java Z.B. Zeichenkette (Literal): “Die Sonne“ Verkettungsoperator: + Beispiel: “Die Sonne“ + “scheint.“
Für die Konkatenation von Zeichenketten gilt das Assoziativgesetzt: x,y,z *: (xy)z = x(yz) Definition: Sei x, y, z *. Dann ist y ein Teilwort (Substring) von xyz. Falls y , spricht man von einem echten Teilwort. ƀ
Zeichenketten : Zusätzliche Beispiele Beispiel 1 Gegeben: = {0, 1}. (a) Berechnen Sie 0, 1, 2, 3, 2 3, 3i=0 i. (b) Sei W = {w|w 2 4}. Berechnen Sie SUMwW |w|. (c) Erklären Sie n und *. Beispiel 2 Sei w = abba. (a) Geben Sie die Menge aller Teilwörter T von w, deren Länge höchstens 2 beträgt (also T = {t|TW(t,w) |t| 2}). (b) Welche dieser Teilwörter sind Präfixe, welche Suffixe von w? (c) Berechnen Sie: |{(x, y, z)|xyz = w |x| 2 |y| 1}| ( | und | bezeichnen die Zahl von gefundenen (x, y, z) )
Sprache Definition: Sei ein Alphabet. Eine Sprache über ist eine Teilmenge L *. ƀ Zum Beispiel sind bei geeigneter Wahl des Alphabets , die Sprachen C, Pascal, Fortran, Java, Deutsch und Chinesisch Sprachen. Definition: Eine Programmiersprache ist ein Paar (L, f ), wobei L * die Syntax und f die Semantik beschreibt. ƀ Die Syntax (Form) einer Programmiersprache wird in der Regel durch eine kontextfreie Grammatik beschrieben. Die Semantik einer Programmiersprache ordnet den Elementen (Programmen) eine Bedeutung zu. Dies kann auf viele verschiedene Arten durchgeführt werden (zum Beispiel axiomatische Semantik, wp-Semantik, denotationelle Semantik).
Kontextfrei Grammatiken • Definition: Eine kontextfreie Grammatik (KFG) ist ein Quadrupel • G = ( N, , P, S ) • wobei • N: Menge der Nichtterminalsymbole, endlich • : Menge der Terminalsymbole, endlich • P N x ( N )*: Menge der Regeln, endlich (x - Kreuzproduktoperation) • S N: Startsymbol ( und : Vereinigung und Durchschnitt von 2 Mengen) • ( Teilmenge) • Wir verlangen N = und führen zusätzlich ein: • := N : Gesamtalphabet ƀ
KFG: Notationelle Konventionen • A, B, C, S, ... bezeichnen Nichtterminalsymbole ( N) • a, b, c, ... bezeichnen Terminalsymbole ( ) • x, y, z, ... bezeichnen Terminalworte ( *) • , , , ... bezeichnen Worte über dem Gesamtalphabet ( *) • Regeln sind geordnete Paare der Form (A, ) P. Sie werden aus • Gründen der einfacheren Lesbarkeit meistens als A geschrieben. • (A,1), (A,2), ..., (A,n), wird zusammengefaßt zu A 1|2|...|n. • Jede Regel aus P erhält eine eineindeutige Nummer zwischen 1 und • p = |P|. Der Pfeil ('') bedeutet in diesem Zusammenhang „wird • abgeleitet zu“ und ist nicht mit dem Implikationspfeil zu verwechseln. • In Backus-Naur-Form (BNF) wird jedes Nichtterminalsymbol in spitze • Klammern eingeschlossen und statt '' das Symbol ‘::=' verwendet. • Beispiel BNF: <program> ::= begin <block> end
Kontextfrei Grammatiken: Beispiele Beispiel G = {N, , P, S} mit: N = {S}, = {0,1} und P = {S 1 0, S 2 1, S 3 0S, S 4 1S} Ableitung S 4 1S 4 11S 3 110S 4 1101S 3 11010S 2 110101 110101 ist ein Satz der von G erzeugten Sprache. Aus G lassen sich alle Binärworte (beliebiger Länge) erzeugen, also die Sprache {0,1}* – {}. Man braucht nur die Regeln 3 und 4 und als Abschluß die Regel 1 oder 2 in geeigneter Reihenfolge anzuwenden.
Beispiel G = {N, , P, S} mit : N = {S, A}, = {I} und P = {S 1 IA, A 2 IA, A 3 } Ableitung S 1 IA 2 IIA 2 IIIA 3 III G erzeugt die Menge aller Wörter I...I (n mal) mit n > 0. Die gleiche Sprache könnte auch von der Grammatik G = {N, , P, S} mit : N = {S}, = {I} und P = {S I, S IS} oder P = {S I, S SI} erzeugt werden.
Beispiel G = {N, , P, S} mit N = {S, Z}, = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} und P = {Z 0 0, Z 1 1, ..., Z 9 9, S 10 Z, S 11 SZ} Aus G lassen sich alle vorzeichenlosen, ganzen Zahlen beliebiger Länge erzeugen, z.B. 1995: S 11 SZ 5 S5 11 SZ5 9 S95 11 SZ95 9 S995 10 Z995 1 1995 Beispiel G = {N, , P, S} mit N = {S, B, Z}, = {a, b ,..., z, 0, 1,..., 9} und P = {B 1 a, B 2 b, ..., B 26 z, Z 27 0, Z 28 1, ..., Z 36 9 S 37 B, S 38 SB, S 39 SZ} Aus G lassen sich alle Bezeichner (Identifier) beliebiger Länge erzeugen, z.B. a, a0b1c2: S 37 B 1 a S 39 SZ 29 S2 38 SB2 3 Sc2 39 SZc2 28 S1c2... 37 B0b1c2 1 a0b1c2
Ableitungen • Definition: Sei G = {N, , P, S} • 1. Seien , *. • genau dann, wenn (gdw) 1, 2, 3 *, A N, (A, 2) P : • = 1A3 und ß = 123. • Man sagt, daß sich ß in einem Ableitungsschritt aus ableiten läßt • bzw. aus ß durch Anwendung eines Reduktionsschritts hervorgeht. • 2. Eine Folge (i)ni=0 mit 0 i < n : i i+1 heißt Ableitung der • Länge n von 0 nach n (n 0). ƀ • definiert eine Relation in *. Daraus lassen sich auf die übliche Weise die n-fache Anwendung sowie die reflexive und transitive Hülle bilden: Zeichen Schritte Zeichen Schritte 1 (n) n 0 (+) n > 0 (*) 0
Kontrollwort einer Ableitung Definition: Sei G eine Grammatik und (i)ni=0 eine Ableitung in G. Weiters sei Ai Pi P die Regel mit der Nummer pi, deren Anwendung den Übergang i i+1 bewirkt. Dann heißt = p0...pn das Kontrollwort der Ableitung und man schreibt 0 () n. ƀ Beispiel Wir beziehen uns auf die vorhin definierte Grammatik zur Erzeugung von Bezeichnern. S () a1c2, mit = 39 29 38 3 39 28 37 1
Erzeugte Sprache Definition: Sei G = {N, , P, S} eine kontextfrei Grammatik. 1. Ein Wort * mit S (*) heißt Satzform von G. Eine Satzform mit * heißt Satz von G. 2. Die von G erzeugte Sprache ist die Menge aller Sätze von G: L(G) := {w|w * S (*) w}. 3. L(G) ist eine kontextfreie Sprache oder Chomsky-Typ-2 Sprache. ƀ Kellerautomaten sind Akzeptoren für kontextfreie Sprachen. Definition: Seien G1 und G2 Grammatiken. G1 und G2 heißen äquivalent genau dann, wenn L(G1) = L(G2). ƀ Bemerkung:Zu jeder Grammatik gibt es unendlich viele äquivalente Grammatiken.
Ableitungsbäume • Definition: Sei G = {N, , P, S} eine kontextfrei Grammatik (KFG). Ein • Ableitungsbaum (parse tree) für G ist ein markierter, geordneter Baum • B = (W, E, v0), für den gilt: • Jeder Knoten v W ist mit einem Symbol aus N {} markiert. • Die Wurzel v0 ist mit S markiert. • Jeder innere Knoten ist mit einer Variablen aus N markiert. • Jedes Blatt ist mit einem Symbol aus {} markiert. • Ist v W ein innerer Knoten mit Söhnen v1,...,vk in dieser Anordnung, • ist A die Markierung von v und Ai die Markierung von vi, so ist • A A1...Ak P. • Ein mit markiertes Blatt hat keinen Bruder (denn das entspräche einer • Ableitung wie A ).
Das Wort w, das mit einer Ableitung S (*)G w erzeugt worden ist, kann man lesen, indem man alle Blätter des zugehörigen Ableitungsbaumes von links nach rechts durchgeht. Das funktioniert natürlich nur, weil Ableitungsbäume angeordnet sind. Eine Regel A ab ist ja durchhaus etwas anderes als A ba. Neben der Ordnung unter den Söhnen eines Knotens, müssen wir aber auch eine Ordnung unter den Blättern (die nur entfernt verwandt sein müssen) definieren. Wir definieren für Blätter b1, b2 W: b1 < b2 b1 und b2 sind Brüder, und b1 liegt „links“ von b2, oder v, v1, v2 W, v v1, v v2, v1 < v2 und v2 is Vorfahre von bi für i {1,2}. Ein weiterer Begriff zu Ableitungsbäumen: Sei {b1,..., bk} die Menge aller Blätter in B mit b1 <...< bk, und sei xi die Markierung von bi, so heißt das Wort x1,...,xk die Front von B.
Satz: Sei G = {N, , P, S} eine KFG. Dann gilt für jedes Wort w * (S ()G w) Es gibt einen Ableitungsbaum in G mit Front w.
Die Grammatik G0 • G0 = {N0, 0, P0, E} • N0 = {E, T, F} • 0 = {+, , (, ), a} • P0 = {E 1 E+T, E 2 T, T 3 T F, T 4 F, F 5 (E), F 6 a • Aus G0 lassen sich arithmetische Ausdrücke mit dem Operanden „a“ und • den Operatoren „+“ und „ “ erzeugen. Die Grammatik ist so formuliert, • dass „“ eine höhere Priorität als „+“ besitzt, d.h. seine Operanden • stärker bindet: a + a a wird (wie üblich) als äquivalent zu • a + (a a) und nicht zu (a + a) a interpretiert. Operanden und • Teilausdrücke der Grammatik können beliebig geklammert sein.
Beispiel: Zwei Ableitungen des Satzes a (a + a) E 2 T 3 T F4 F F6 a F 5 a (E) 1 a (E + T) 2 a (T + T) 4 a (F + T) 6 a (a + T)4 a + (a + F)6 a (a + a) Dies ist eine Linksableitung: bei jedem Schritt wird das am weitesten links stehende Nichtterminalsymbol ersetzt. E 2 T 3 T F5 T (E)1 T (E + T) 4 T (E + F) 6 T (E + a) 2 T (F + a) 6 T (a + a) 4 F (a + a)6 a (a + a) Dies ist eine Rechtsableitung: bei jedem Schritt wird das am weitesten rechts stehende Nichtterminalsymbol ersetzt. Das Kontrollwort einer Links (Rechts)ableitung heißt Links (Rechts)kontrolwort (LKW bzw. RKW). Analog: Links (Rechts)satzform.
Ableitungsbaum für E () a (a + a) E T * T F F ( E ) a E + T F T F a a
Beispiel: G = {N, , P, S} mit N = {S}, = {a, b}, P = {S 1 aSb, S 2 ab} erzeugt die Sprache L(G) = {anbn | n 1} Zum Beispiel: S 2 ab S 1 aSb 2 aabb S 1 aSb 1 aaSbb 2 aaabbb . . . S (n-1) an-1Sbn-1 2 an-1abbn-1 = anbn Regel 1 S S a b a S b a S b
Beispiel: G: S aSa | bSb | a | b | erzeugt die Sprache der Polindrome. (z.B. otto, pop, madam, einnegermitgazellezagtimregennie) Erklärung: Words and the numbers equally read both from left to right, and from right to left, are named polindroms. For example, wort POP and number 1331 -- are polindromes.
Mehrdeutigkeit einer Grammatik • Definition: • Eine KFG heißt eindeutig, wenn für jeden Satz w L(G) und beliebige • zwei Ableitungen von w aus S gilt: die mit den Ableitungen verbundenen • Ableitungsbäume sind identisch. • Eine KFG heißt mehrdeutig, wenn sie nicht eindeutig ist. • Bemerkungen: • Ist G mehrdeutig, dann gibt es immer ein w L(G) und zwei Ableitungen • von w, die unterschiedliche Ableitungsbäume erzeugen. • In der Praxis von Programmiersprachen werden mehrdeutige • Grammatiken nicht benutzt, da sie zu Problemen bei der • semantischen Definition und Analyse führen. • Eine kontextfrei Sprache L heißt inhärent mehrdeutig gdw. alleKFG für L mehrdeutig sind.
Beispiel (Mehrdeutige Grammatik) G1 : E E + T | E E | (E) | a G1 is äquivalent G0, d.h. L(G1) = L(G0). Betrachte a + a a E Entspricht: (a+a)a E E * E Entspricht: a+(aa) E E + E + E a E E a * a a E E In G0 : nächste Folie
In G0 : E E + E T * T F T a F F a a E E + T () a + T a + T F () a + a a
Linksableitungen und Rechtsableitungen • Definition: Sei G = {N, , P, S} und gelte mit (1) = 1A3, • (2) = 123, und A 2 P. • heißt ein Linksableitungsschritt, in Zeichen L genau dann, • wenn 1 *. • heißt ein Rechtsableitungsschritt, in Zeichen R genau dann, • wenn 3 *. • Eine Ableitung heißt Linksableitung, wenn jeder Schritt ein • Linksableitungsschritt ist. • Eine Ableitung heißt Rechtsableitung, wenn jeder Schritt ein • Rechtsableitungsschritt ist. ƀ • Bemerkung: Jeder Ableitungsbaum definiert genau eine Linksableitung • und genau eine Rechtsableitung. • Satz: In einer eindeutigen Grammatik G gibt es zu jedem Satz w L(G) eindeutig eine Linksableitung und eine Rechtsableitung.
Bemerkung: • Ein Wort 0 * und ein LKW = p0...pn bestimmen eindeutig eine • Linksableitung (i)ni=0 so, dass für alle i (0 i n) • i = xiAii, i+1 = xiii, xi *, • Ai i P angewendete Regel mit der Nummer pi. • 2. Eine Linksableitung (i)ni=0 bestimmt eindeutig ein LKW . • Analoges gilt für Rechtsableitungen.
KFG : Zusätzliche Beispiele Beispiel 0: Gegeben sei die KFG G = ({S, X}, {a, b}, P, S) mit der Regelmenge P = {S aaSbb | X | , X Xb | }. (a) Finden Sie Ableitungen für Wörter aabb, aabbbbb und aaaabbbbb (b) und zeichnen die Ableitungsbäume. (c) Beschreiben Sie die von G erzeugte Sprache formal. Beispiel 1: Gegeben sei die KFG G = ({S, X}, {a, b}, P, S) mit der Regelmenge P = {S aSb | XX | , X Xb | b}. (a) Finden Sie Ableitungen für Wörter aabb, aabbbbb und a4b8 (b) und zeichnen die Ableitungsbäume. (c) Beschreiben Sie die von G erzeugte Sprache formal. Beispiel 2: Sei L = {anbm | n 2m 2} die von einer Grammatik G erzeugte Sprache. (a) Welche Eigenschaft haben die erzeugten Wörter? (b) Geben Sie eine KFG G an, die L erzeugt. (c) Finden Sie ein Wort w für das gilt: w L(G) |w| = 10 und zei- gen Sie an Hand einer Ableitung die Richtigkeit Ihrer Behauptung. (d) Finden Sie ein Wort w´ L(G) |w´| = 10 und erklären Sie, warum w´nicht der Element der Sprache ist.
KFG : Zusätzliche Beispiele (2) Beispiel 4: Gegeben sei die KF Sprache L = {anbm | n 4, m n-1} (a) Geben Sie eine KFG G an, sodaß L = L(G). (b) Konstruieren Sie die Ableitungsbäme für alle Wörter {w L | 7 |w| 9}. Beispiel 5: Gegeben sei die KF Sprache L = {a2nbman | n 0, m 1} (a) Geben Sie eine KFG G an, sodaß L = L(G). (b) Konstruieren Sie die Ableitungsbäume für alle Wörter {w L | |w| 7}. Beispiel 6: Gegeben sei die KF Sprache L = {anc2m+1(ab)n | m, n 0} über dem Alphabet {a, b, c}. (a) Konstruieren Sie eine kontextfreie Grammatik G, welche L erzeugt. (b) Zeichnen Sie die Ableitungsbäume für die Wörter c, acab und aacccabab.
KFG : Zusätzliche Beispiele (3) Beispiel 7: Gegeben sei die KF Sprache L = {ama3n=am+3n | m, n 1} über dem Alphabet {a, , =}. (a) Konstruieren Sie eine kontextfreie Grammatik G, welche L erzeugt. (b) Zeichnen Sie die Ableitungsbäume für die Wörter aaaa=aaaa, aaaaaaaaa=aaaaaaaaa und aaaaaaa=aaaaaaa. Beispiel 8: Gegeben sei die KF Sprache L = { un+1vwn | n 0 } (a) Geben Sie eine KFG G an, sodaß L = L(G). (b) Konstruieren Sie die Ableitungsbäume für uw, u4vw3 .