So. Ja. Letzte Vorlesung im Automatenteil. Ich mache das
von gestern nochmal zu Ende. Das, oh,
ganz schön laut. So. Ich mache das von gestern
nochmal zu Ende. Wir hatten ja gestern P eingeführt,
NP, NP vollständig, NP schwierig.
Und primär machen wir heute nochmal einen so einen Reduktionsbeweis,
dass wir irgendwie zeigen,
dass tatsächlich ein Problem bei NPV
ständig ist
Und da sind wir eigentlich auch schon fertig. Dann habe ich
noch so einen zwölften Foliensatz, wo nochmal ganz viele Buzzwords,
was wir so alles in der Vorlesung hatten, draufstehen.
Und dann ist Feierabend. Mal gucken, ob wir die
ganzen anderthalb Stunden brauchen. Einstieg. P war die Klasse,
der in Polynialzeit berechenbaren Funktionen. NP war die Klasse,
der nicht die terministischen Polynialzeit berechenbaren Funktionen oder eben die Klasse
der Probleme, die man im Polynialzeit verifizieren kann.
Also wo man dann so einen Verifikationsalgorithmus hat,
der irgendwie eine Probleminstanz kriegt und ein Zertifikat und dann kann er eben überprüfen,
ob die Probleminstanz eine Jahrinstanz ist oder eine Nein-Instanz anhand dieses Zertifikats
Genau, und dann wollte man für Probleme,
die vermutlich nicht in P. sind, irgendwie zeigen können,
dass die tatsächlich nicht in P sind,
dass man irgendwie sagen kann, so gegeben,
dieses Problem gibt es kein K,
sodass man das Problem irgendwie mit einem Algorithmus in U von N hoch K lösen kann.
Da möchte man irgendwie hin. Stellt man fest,
das kriegt man nicht so gut hin. Dann entwickelt man
diese Theorie der NP-Vollständigkeit, dass man dann zumindest sagen kann,
dieses Problem kann ich sehr wahrscheinlich nicht in P lösen.
Das ist NP vollständig, wenn das in P wäre,
dann wären alle Probleme aus NP.
NP. Hilfsmittel, was man dazu brauchte, war diese
Reduktion. Eine Reduktion ist so eine berechenbare Funktion von,
Übermenge der Einsprache, in die Übermenge der anderen Sprache.
Hier sind beide Sprachen, L1 und L2, irgendwie Timemang von 0-1 Sternen.
Das heißt, die Funktion geht von 0-1 Stern nach 0-1 Stern. Und die Idee ist jetzt,
dass in L1 sind ja quasi so, ja und nein,
eins so die Jahrinstanzen eines Problems und die Nein-Instanzen sind eben in Nicht-L1 und das,
was die Reduktion jetzt machen soll, ist,
wenn ich eine Jahrinstanz aus L1 habe,
dann soll ich das auch auf eine Jahrinstanz aus L2 abbilden und wenn ich eine Nein-Instanz habe,
will ich das auch auf eine 9-Instanz abbilden.
Und nein, Instanzen sind eben einerseits irgendwie Instanzen,
die die Eigenschaften nicht erfüllen,
also gegeben Graf und die Frage hatte eine Klicke aus zehn Knoten.
Wenn der keinen hat, ist das
eine Nein-Instanz
Genauso ist aber eine 9-Instanz auch etwas,
was syntaktisch überhaupt keinen Sinn macht für das Problem.
Also wenn ich ihm irgendwie gar keinen Grafen gebe,
sondern irgendwie eine Folge von Zahlen oder so,
ist das auch eine 9-Instanz, da kann man gar nichts machen.
Nur solche Sintax-Überprüfungen ignoriert man meistens und guckt sich eben nur an,
irgendwie Grafen, die eine Clique haben,
dieser größeren Grafen, die keine Clique haben dieser Größe,
weil das andere kann man üblicherweise schnell vorneweg prüfen.
Also da macht ihr in Linearzeit,
lest ihr einmal über die Eingabe rüber und dann wisst ihr schon,
ob das irgendwie eine überhaupt erlaubte Probleminstanz ist und falls nicht,
bildet ihr das auf eine konstante 9-Instanz
auf der anderen Seite ab
So, genau. Und dann haben wir irgendwie das
dafür geschrieben mit der Idee, dass eben das Problem L2
mindestens so schwierig ist wie L1. Deswegen diese kleine Gleichgeschichte.
So, und dann hatten wir das da nochmal als Bild.
Ja, Anstanzen auf Jahrenstanzen, 9-Instanzen auf 9-Instanzen.
Das heißt, wenn man so eine Reduktion angeben will,
dann muss man erstmal beschreiben, was die Reduktion tut.
Wie transformiert sie das eine Problem in ein anderes?
Und dann muss man eben irgendwie beweisen,
wenn das auf der einen Seite in Jahrenstanz ist,
ist es auch auf der anderen Milliardenstanz.
Und wenn es auf der einen Seite eine 9-Instanz ist,
ist es auch auf der anderen Seite
eine 9-Instanz
Oder äquivalent ihr Instanzier, ja, Instanz da und ja,
Instanzier, dann auch hier Instanz da. Kann man auch machen. So,
genau, dann hatten wir den wichtigen Satz, dass eben,
wenn ich so eine Polynymnialzeitreduktion habe und ich kann zeigen,
dass L2 in P drin ist,
dass dann eben auch L1 in P drin ist.
Und das war nachher die Begründung,
warum diese NP Vollständigkeitsdefinition Sinn macht,
weil wenn hier ein beliebiges NP-Problem steht für L1 und für L2 ein NP Vollständiges,
dann ist natürlich nachher die Aussage,
wenn L2 jetzt in P ist,
dann ist plötzlich jedes Problem aus NP
eben auch in P und damit sind die Komplexitätsklassen dann gleich
So. Genau. Ah, ist höchstens so schwierig wie B.
Das war dann da die Idee. Dann
die Definition für NP vollständig. Da wurde eben gesagt,
das Problem, das jetzt NP vollständig sein soll,
das muss erstens in NP überhaupt liegen.
Und zweitens muss sich jedes Problem aus NP in Polynialzeit auf
dieses Problem L reduzieren können.
Gibt nur das zweite, nennt man das NP schwierig,
und die NPV-Stände bilden eben
diese Komplexitätsklasse NPC
Genau, da steht es nochmal,
wenden LNP vollständig ist und es ist auch ein P,
dann folgt sofort NP gleich P, das ist unwahrscheinlich,
deswegen nimmt man üblicherweise einen Nachweis dafür,
dass ein Problem NP vollständig ist dafür,
dass es höchstwahrscheinlich nicht in P sein kann.
Transitivität der Transitivität der Reduktion,
wenn ich ein Problem L1 auf dem Problem L2 reduzieren kann
und das Problem L2 auf dem Problem L3,
dann kann ich auch L1 im Pulli im Jahrezeit
auf L3 reduzieren
Genau,
und das ist das Theorien,
das wir uns gleich zunutze machen wollen,
wenn wir schon ein NP vollständiges Problem L-Strich haben und wir können das auf L reduzieren,
dann wissen wir auch,
dass LNP schwierig ist,
weil wir dann eben mit dieser Transitivität von eben jedes Problem aus NP nehmen können,
das auf L-Strich reduzieren können und dann eben die Polinialzeitreduktion von L-Strich nach L machen können und dann haben wir eben jedes Problem aus NP auf L reduziert und dann sind wir fertig.
Dann hätte man auch gezeigt, dass LNP schwierig ist,
damit man jetzt nämlich nicht immer diesen Schritt machen muss,
alle Probleme aus NP
auf L
zu reduzieren
Genau, und dann war das letztendlich das Verfahren, was man jetzt anwenden muss.
Also wenn ich für ein Problem zeigen will,
dass das NPV ständig ist, üblicherweise kriege ich irgendwie ein Problem.
Ich probiere zuerst eine lange Zeit, irgendwie einen Algorithmus zu entwickeln,
der effizient ist, also irgendwie einer, der einen P abläuft.
Ich komme nicht voran und irgendwann überlege ich mir dann,
okay, vielleicht probiere ich mal zu zeigen, dass das nicht geht.
Sprich, ich probiere zu zeigen,
dass das Problem NP schwierig oder eben sogar NPV ständig ist.
Und dazu muss ich erst mal zeigen, dass es in NP ist,
dass es meistens relativ einfach und danach muss ich eben eins der NPV-vollständigen Probleme auswählen,
die ich so kenne und dann eben eine Reduktion angeben.
Und für die Reduktion muss ich eben erstens zeigen,
dass es diese Eigenschaft der Reduktion hat,
also die Geschichte, wenn X in L-Strich ist,
dann ist F von X auch in L und andersrum.
Und zweitens muss ich dann noch zeigen,
dass es auch in Polynumialzeit berechnet werden kann
So. Dann kamen die Fragen von gestern.
So. Und jetzt kommt das erste irgendwie vollständige Problem gleich.
Der Fragen bis dahin nochmal. Fragen zu PNP und so
weiter. Problem im Jahrzeit, ja. Zu zeigen,
dass der Algorithmus
ein Pullinialzeit abläuft
Also in den Fällen geht es meistens relativ einfach,
weil nicht viel passiert,
weil man so Sachen macht, wie irgendwie,
wenn man jetzt ein Grafenproblem hat und man transformiert das in ein anderes Grafenproblem,
da macht man oft so Sachen,
wie irgendwie sich alle Knoten und alle kannten einmal anzugucken und irgendwas zu tun,
dann weiß man schon,
dass das irgendwie ein O von V mal E oder O von V plus E liegt oder so,
weil man sich ja nur die Knoten und die Kanten angeguckt hat.
Und ansonsten müsstest du dir halt deinen Algorithmus angucken,
also gibt es jetzt kein direktes Verfahren für,
müsste dir den Algorithmus irgendwie angucken und dir halt überlegen,
was da passiert und wie oft bestimmte Operationen ausgeführt werden.
Noch mehr Fragen
Dann gucken wir uns mal dieses Erfüllbarkeitsproblem von der Aussagenlogik an.
Ich habe Bullsche Variablen, A, B,
C, D oder X-1, X-2, X-3,
die kann ich irgendwie mit Werten 0 oder 1 belegen,
also False and True.
Dann habe ich die Negation, die macht halt aus False 2 und aus True
Falls die Disjunktion, irgendwie X-1 oder X-2 ist genau dann eins,
wenn eben mindestens eine der beiden Variablen 1 ist.
Und ich habe die Konjunktion, ist eins,
wenn beide eins sind
Wenn man jetzt so eine Formel hat,
dann ist eben eine Belegung irgendwie eine Funktion,
die jeder Variablen wird 0 oder 1 zuweist und dann kann man eben anhand dieser Verknüpfung hier ausrechnen,
was der Wahrheitsgehalt der ganzen Formel ist.
Beispiel, oben die Formel und jetzt kann man halt,
die hat nur zwei Variablen,
X1 und X2 und da hat sie irgendwie vier mögliche Belegungen,
X1 X2, beides zu 0 auswerten, X1 zu 0,
X2 zu 1, X1 zu 1 X2 zu 0 oder beides zu eins.
Gibt es also vier Belegungen, wenn er das verallgemeinert,
dann kommt ihr dahin,
dass wenn ihr K viele Variablen habt,
dann könnt ihr denen halt alle Belegungen zuweisen zwischen allen
die Null und allen die 1. Das wären wieder zwei
hoch K-Fiele
Da merkt er auch schon wieder,
da steckt wieder so ein Exponential-Ding irgendwie drin,
wenn ihr irgendwie eine Formel habt mit K vielen verschiedenen Variablen,
müsstet ihr, um zu testen, ob sie erfüllbar ist,
also ob es irgendeine Belegung gibt, die sie warm macht.
Im schlimmsten Fall alle zwei hochkarfilen Belegungen durchgehen.
Das wäre so ein Brutforst-Ding dann. Und hier jetzt,
wenn man eben 0 und 1 nimmt, dann kann man
jetzt irgendwie X1 und X2 durch 0 und 1 ersetzen.
Und dann weiß ich,
also hier habe ich es jetzt so gemacht,
dass ich zuerst diese Negationen ausgewertet habe,
also Negation von 0 wird zu 1,
Negation von 1 wird zu 0,
dann kommt man irgendwie dahin
Und jetzt guckt man sich hier das Oder an,
0 oder 1 ist 1 und hier ist auch 0 oder 1, 1.
Dann kommt man dahin und dann das geklammerte 1 und 1
führt auch wieder zu einer 1 und nochmal 1 und 1 führt zu 1.
Also ist die ganze Formel mit der Belegung da oben,
wird die zu wahr ausgewertet. Ihr werdet das ab der
nächsten Woche im Logikteil noch viel genauer machen,
dass man das nämlich eigentlich so nicht schreiben darf und so.
Für uns ist das mal so, dass man weiß,
okay, so intuitives Verständnis, wie man Formeln jetzt auswertet und so.
Das genügt dann hier erstmal, dass man weiß,
es gibt halt diese zwei hochkafilen Belegungen, wenn man K-Variablen hat.
Und dass man sich hier nur um Negation,
Dissunktion und Konjunktion
kümmern muss
So. Und dann ist das Erfüllbarkeitsproblem der Aussagenlogik, gegeben so eine Formel oder eben eine Kodierung dieser Formel,
gibt es eine erfüllende Belegung, ja oder nein?
Und jetzt könnte man sich ja vielleicht überlegen,
um schnellen Algorithmus zu entwickeln,
vielleicht guckt man sich erst mal die Disjunkte an und sagt dann,
bei jedem des Jugend muss ich ja mindestens eins warm machen,
dann wählt man eins aus, dann achtet man darauf,
dass alle Konjunkte immer wahr sind oder so und vielleicht würde das dann reichen,
einmal über die Formel rüber zu lesen oder sowas.
Tut es leider nicht. Wir kennen tatsächlich wenig Besseres,
als eben diese alle zwei Hochk-fielen Belegungen durchzugehen.
Gibt ein paar bessere Sachen, aber das wird nicht weniger
als exponentiell
Historisch das erste NP-vollständige Problem, wenn man das zeigen will,
man zeigen will, dass satt NP vollständig ist,
dann muss man erst mal zeigen, dass es in NP ist.
Das ist mit der Idee eben relativ einfach.
Ihr ratet eben so eine Belegung. Ihr habt endviele Variablen,
das heißt, ihr ratet N mal 0 oder 1,
dann habt ihr eine Belegung und ihr testet ihr,
ob das die Formel warm macht oder nicht.
Alternativ, wenn ihr mit dieser Zertifikatsidee daran wollt,
das Zertifikat wäre eben eine erfüllende Belegung.
Und ein Algorithmus zu schreiben, der überprüft, ob eine
gegebene Belegung die Formel wahrmacht oder nicht, ist einfach.
Der macht genau das Gleiche wie eben in dem Beispiel,
ersetzt alle Variablen durch 0 oder 1 und dann wertet er
aus.
Das dauert nicht lange
Problem ist, um zu zeigen, dass das jetzt tatsächlich NPV ständig ist,
muss man alle Probleme aus NP, auf dieses Erfüllbarkeitsproblem reduzieren.
Kann man sich schon vorstellen, dass es irgendwie kompliziert,
weil man irgendwie alle NP-Probleme anfassen muss dafür.
Beschrieben führt zu weit ideemündlich. Wenn ihr es nachlesen wollt,
könnt ihr es im Hauptcraft Unman nachlesen.
Idee geht so, dass man quasi das Einzige,
was man über alle Probleme, die ein NP sind, weiß.
Das Einzige, was man darüber weiß, das benutzt man.
Das ist das Einzige, was man weiß,
halt die Definition, die Klasse ist so definiert,
dass man sagt, es gibt eine nicht-diterministische Touring-Maschine,
die die Sprache in Polymialzeit akzeptiert
Und dann sagt man sich halt, sei ganz allgemein A,
sondern nicht die terministische Touring-Maschine, dann hat die ja
irgendwie eine Überführungsfunktion und ein Eingabealphabet und all solche Geschichten.
Und jetzt kodiert man sich in die Formeln,
alle möglichen Schritte, die die Touring-Maschine machen kann, rein.
Dann kriegt man eine ellenlange Formel und baut da auch noch so Sachen ein,
wie all die Konfigurationen, die dabei entstehen können,
wenn sie arbeitet und so weiter.
Und wenn es eine erfüllende Belegung gibt,
dann ist diese Belegung quasi genau ein Weg,
eine Rechnung, die die nicht terministische Touring-Maschine machen kann.
Naja, wenn es eine erfüllende Belegung gibt, kann sie diese Rechnung machen.
Das ist dann eine Erfolgsrechnung und dann weiß man sie akzeptiert.
Und wenn man die Formel nicht wahrmachen kann,
dann gibt es eben keine Erfolgsrechnung.
Das ist ein ordentliches Rumgefrickel, weil man eben irgendwie
diese alle Rechnungen in die Formeln reinkodieren muss
Das ist ziemlich aufwendig. Wie gesagt, wenn es euch interessiert,
könnt ihr es mal nachlesen und so fünf, sechs Seiten.
Ja, genau. Wenn man das hat, dann wird es
danach einfacher, weil jetzt hat man ein NP vollständiges Problem.
Jetzt kann man das nehmen und das auf ein Problem,
von dem man wissen will, ob es NPV-Sting ist, reduzieren.
Das genügt dann. Dann weiß man, das neue Problem ist
auch NP-vollständig. Und je mehr NP-vollständige Probleme man hat,
desto mehr Auswahl hat man nachher,
wenn man eben ein weiteres Problem als NPV ständig nachweisen will,
weil man dann einfach nur eins von diesen NPV-Ständigen nimmt und das auf sein neues Problem reduziert.
Da steht es auch nochmal
Genau. So, dann noch zwei Probleme,
auch aus der Logik,
die werde ich jetzt auch noch nicht zeigen,
warum die MPV stehen sind,
da wollen wir das auch jetzt gegeben voraussetzen,
die beiden Probleme sorgen im Prinzip nur dafür,
dass die aussagen logische Formel
mehr Struktur hat
Hilft gleich beim Reduzieren. Was man dazu braucht,
sind noch zwei, drei Begriffe, den Begriff eines Literals,
ein Literal ist entweder so eine variable X3 oder eben die negierte Variante.
Also Literal ist einfach entweder direkt die Variable oder die Variable mit einer Anlegation davor.
Und dann sagt man, eine Klausel ist eine Oder-Verknüpfung von Literalen.
Und dann ganz zum Schluss sagt man eine Formel,
das sind KNF, also ein konjunktiver Normalform,
wenn die so aussieht wie hier unten.
Das heißt, ihr habt hier ganz viele Literale,
die durch Oder verknüpft sind
Und dann kommt ein Und und dann kommen wieder ganz viele
Literale, die durch Oda verknüpft sind. Das heißt,
ihr sagt so Sachen wie A oder Nicht-B oder C,
Klammern, und nicht A oder D oder E,
in Klammern und X oder F oder Y, solche Geschichten halt.
Das ist manchmal ganz praktisch zu modellieren, steht hier unten noch,
weil man dann so Sachen sagen kann, ich möchte eben,
dass irgendwie die Tür auf ist oder die Fenster offen sind und ich möchte das,
bla bla bla.
Sowas kann man damit dann modellieren. Und da sieht man schon,
das gibt mehr Struktur als bei so einer normalen aussagenlogischen Formel,
weil man quasi auf oberster Ebene nur den Undoperator hat Und
unter dem Und-Operator sind ganz viele Klauseln.
Die sind halt alle unverknüpft. Und bei den Klauseln
habe ich ganz viele Literale, die oder verknüpft sind.
Und literal, da hängt jetzt maximal die Negation.
Ich habe also nicht sowas wie beispielsweise vor so einer Klausel
noch eine Negation oder irgendwie sowas.
Das habe ich alles nicht. Deswegen sind die irgendwie ganz elegant.
Und man kann tatsächlich jede aussagelogische Formel auch in so
eine Formel umwandeln, sodass die die gleiche Aussage machen.
Damit kann man sich jetzt wieder solche Probleme definieren,
nämlich gegeben eine Formel prüfen,
ist das eine erfüllbare aussagelogische Formel in dieser konjunktiven Umalform.
Kann man auch zeigen, dass das MPV ständig ist,
reduziert man satt auf dieses Problem,
hat man
das gezeigt
Und das dritte, das, was wir jetzt auch
gleich benutzen wollen, das, was meistens benutzt wird,
drei CNF oder in der Literatur auch drei satt.
Da geht man davon aus, dass man eine Formel kriegt,
die ein KNF ist und jede Klausel hat genau drei Literale.
Das heißt, ich habe sowas wie A oder B oder C
und nicht A oder B oder D und dann immer drei Literale.
Bei der NP vollständig könnt ihr auch wieder im Hauptlift Ullman
nachlesen, wenn ihr sehen wollt, wie das funktioniert.
Das, was üblicherweise oder das,
was sehr häufig in der Literatur auftritt, ist,
dass man von diesem Problem ausgeht,
also von dem drei CNF-Problem hier
Findet man auch oft unter den Namen Dreisatt und von dem eine Reduktion angibt.
Also das ist so der Klassiker, dass man mit dem arbeitet.
Und das wollen wir jetzt noch einmal zum Abschluss machen.
Wir wollen dieses Klicken-Problem als NP vollständig nachweisen,
indem wir eine Reduktion angeben von diesem 3CNF aufklicke.
Da steht nochmal, was klicke ist, gegeben als Probleminstanzen,
Graf G und eine Zahl K. Und wir wollen jetzt wissen,
also das ist eine Jahrinstanz, genau,
dann, wenn der Graf G K K Knoten enthält,
die alle paarweise miteinander verbunden sind.
Also eine K-Klicke
So, und da wollen wir jetzt eine Transformation angeben,
die uns, wir kriegen eine aussagenlogische Formel in 3CNF,
die müssen wir irgendwie so in einen Graphen umwandeln und so eine Zahl K,
also eine Probleminstanz von Clique,
so das gilt die Formel, ist genau dann erfüllbar,
wenn der konstruierte Graph eine K-Klicke hat.
Das ist das Ziel. Sechs Folie noch, dann habt ihr
es geschafft. Klick ist NP vollständig. Zuerst zeigen,
dass das NNP ist, ist relativ einfach,
man nimmt als Zertifikat die K-Knoten und überprüft,
ob das tatsächlich eine Clique ist
Oder alternativ, nicht deterministisch. Ihr ratet K-Knoten und überprüft, ob das eine Klicke ist.
Da ladet dann, genau, das zeigt Klick in NP.
Das hatten wir gestern auch schon ein, zwei Mal.
Solche Sachen sind immer relativ einfach, weil man meistens,
wenn man jetzt irgendwie die Problemstellung hier schon hat,
im Grunde genommen, man will prüfen,
ob G eine Klicke mit K-Knoten enthält.
Und dann sagt man als Zertifikat immer, ja,
dann gib mir doch die Knoten, von der du meinst,
von denen du meinst,
dass die eine Klicke bilden und dann überprüfe ich das.
Geht bei
fast allen NP-Vorching-Problemen so
So, schwieriger Teil, drei CNF wirklich auf Clique reduzieren.
Da macht man jetzt üblicherweise solche sogenannten Gadget-Konstruktionen,
dass man sich irgendwie anguckt, was habe ich denn so in der Formel?
Ich habe da halt irgendwie so Klauseln und Negationen und solche Geschichten.
Und hier werden wir gleich für jede Klausel uns so
einen bestimmten Teilgrafen konstruieren mit bestimmten Eigenschaften.
Und dann werden wir diese Teilgrafen auf eine bestimmte Art und Weise miteinander verbinden,
sodass nachher rauskommt, oh, der Grafis hat wirklich dann eine Clique,
wenn die Formel erfüllbar ist.
Haben so eine Instanz von 13F, K viele Klauseln,
C1 bis CK. Und jede Klausel hat jetzt
irgendwie drei Literale, L1L2L3. Und das R oben,
das steht eben für die so und so vierte Klausel.
So, zu jeder Klausel hier nehmen wir jetzt so ein Triebel von Knoten.
Und es erst mal zu jeder Klausel einfach nur drei Knoten genommen.
Und dann, jetzt müssen wir uns noch darüber Gedanken machen,
wie wir die Knoten verbinden. Das machen wir jetzt so,
dass wir zwei Knoten genau dann miteinander verbinden,
wenn erst mal es ungleich Tee ist,
sprich, wenn das keine Knoten sind,
die zu der gleichen Clique gehören
Und wenn die Zugehörigen Literale nicht zueinander komplementär sind, das heißt,
der eine Knoten darf nicht X sein und der andere nicht X,
dann würde ich die nicht verbinden.
Wenn es beides X ist, ist es okay, dann verbinde ich es.
Oder wenn der eine X sagt und der andere Y,
ist auch okay, verbinde ich X und nicht Y,
ist auch okay, verbinde ich auch.
X und nicht X verbinde ich nicht. Und eben die
drei Knoten, die jeweils aus einer Klausel hervorgegangen sind,
die verbinde ich auch nicht. Und dann noch,
damit das ja wirklich eine Instanz von Clique ist,
brauche ich nicht nur den Grafen, sondern auch diesen Wert K.
Und der Wert K in der Instanz von Clique
entspricht eben gerade dem K hier,
die die Anzahl der Klauseln sind
Beispiel, wenn ihr die Formel habt,
jetzt macht ihr für die Klausel hier vorne,
für die erste, also für das Nicht-XY und Z,
macht ihr euch drei Knoten.
Und die werden nicht miteinander verbunden. So,
die baumeln da jetzt erstmal irgendwo rum. Dann macht ihr
euch für die zweite Klausel, auch drei Knoten.
Meistens macht ihr irgendwo anders hin. Und jetzt habt ihr
das erste Mal die Möglichkeit, Kanten zu machen.
Und zwar verbindet ihr den Knoten, der hierfür nicht X steht,
den verbindet ihr hier mit dem Knoten, der für Nicht-Y steht,
mit dem Knoten, der für nicht Z steht.
Aber ihr verbindet ihn nicht mit dem Knoten,
der hier für X steht,
weil nicht X und X zueinander
komplementäre Literale sind
Ergebnis, sieht dann so aus. Ihr habt irgendwie hier das Nicht-XYZ,
die erste Klausel, das ist das hier links.
Die mittlere Klausel, das ist das hier in der Mitte
und die rechte Klausel, das sind die drei Knoten hier rechts.
Und wenn ihr euch dann die Kanten anseht,
wollen wir da mal so ein Beispiel,
hier das Y nehmt, auf der linken Seite,
dass es nicht mit den beiden Knoten über sich und unter sich verbunden,
weil die aus der gleichen Klausel hervorgegangen sind,
da wollte ich keine Kanten haben.
Und es ist aber mit allen anderen Knoten verbunden,
die nicht zu Y komplementär sind,
also die nicht die Form nicht Y haben.
Ihr könnt hier sehen, es gibt eine Kante zu dem X,
es gibt eine Kante zu dem Z,
zu dem Nicht-Z,
aber es gibt keine Kante zu dem Nicht-Y hier
Und die Idee ist jetzt, wenn der Graf eine Klau,
eine K-Klicke hat, dann muss er ja erstens,
eine K-Klicke müssen ja K-Knoten sein, die alle miteinander verbunden sind.
Dann muss er erstens aus jedem dieser Triebel von Knoten genau einen Knoten auswählen.
Er kann aus einem Triebel nicht zwei Knoten auswählen,
weil die ja nicht miteinander verbunden sind.
Ihr seht ja hier irgendwie nicht X und Y sind nicht miteinander verbunden.
Also wenn ich K-Knoten habe, die eine Klicke bilden,
muss ich aus jeder Klausel eine auswählen.
Da die alle miteinander verbunden sind,
kann in dieser Klicke aber auch kein Pärchen von komplementieren Literalen
Also da kann nicht an irgendeiner Stelle ein X
ausgewählt sein und an irgendeiner anderen Stelle nicht X,
weil die ja gerade nicht miteinander verbunden sind.
Und das bedeutet, ihr könnt aus dieser Clique eine Belegung ablesen,
wenn ich hier irgendwie Z gewählt habe, dann mache ich Z wahr,
wenn ich nicht Y gewählt habe, mache ich Y falsch.
Da habe ich eine Belegung nachher, die, die gar nicht auftreten,
also in dem Beispiel hier tritt das X ja gar nicht auf in der Clique,
da ist egal, wie ich das belege.
Und dann habt ihr eine erfüllende Belegung,
könnt ihr auch schnell überprüfen hier,
wenn ihr Z wahr macht und Y falsch,
dann macht ihr jede Klausel var.
Die erste Klausel wird mit Z wahr gemacht,
die zweite Klausel wird mit Nicht-Y wahrgemacht und die dritte Klausel
wird wieder mit Z wahrgemacht.
Sind alle Klauseln wahrgemacht worden,
da die unverknüpft sind,
ist die ganze Formel wahrgemacht
Das ist die Idee, warum das funktioniert.
Wenn die Formel eben nicht erfüllbar ist,
dann kann es auch keine so eine Klicke geben,
weil die Klicke eben gerade ja sagen würde,
dass die Formel erfüllbar ist.
Und dann funktioniert das. Da noch, warum das ein Polymnialzeit
möglich ist. Man liest einmal über die Formel rüber,
alle Auftretenden, Variablen werden irgendwie ihren Knoten umgewandelt.
Und danach geht man nochmal über die Knoten rüber und guckt
irgendwie pärchenweise, ob die zueinander komplementär sind oder nicht.
Und wenn man das ein bisschen umständlich macht,
dann bleibt das irgendwie ein O von V-Quadrat oder eben
ein O von Länge der Formel zum Quadrat.
Was beides okay ist
Also da ist man auch, weil du vorhin gefragt hattest,
da ist man auch ein bisschen nicht unbedingt schluderig,
aber unexakt, weil es einem eben nur schnell interessiert,
ist das in Polynonialzeit.
Und hier kann man sich eben schnell überlegen, naja,
ich führe für jede Variable einen Knoten ein.
Das dauert nicht länger, als ich Variablen habe.
Also ist das irgendwie ein O von Vieh oder ein O von V,
je nachdem, wie man es gerade betrachtet.
Und dann gehe ich ja maximal alle Pärchen von Knoten
durch und gucke immer, sind die zueinander komplementär.
Und ich habe halt nur V-Quadrat, viele Pärchen von Knoten,
also bleibe ich ein O von V-Quadrat.
Wichtige ist halt nur, dass man nicht aus diesem Polynonialzeit rausrutscht,
also dass das nicht irgendwie O von zwei Hochv wird oder irgendwie sowas,
dann ist es schlecht
Genau, also wissen wir, Reduktion haben wir und wir
wissen, die Reduktion läuft im Pulli im Jahrzeit.
Jetzt müssen wir noch zeigen, dass die Reduktion tatsächlich korrekt ist.
Also gegebener Graf, genau dann eine Clique enthält, wenn die Formel erfüllbar ist.
Wenn die Formel erfüllbar ist, gibt es eine Belegung,
die jede Klausel, die in jeder Klausel mindestens ein Literal wahrmacht.
Warum? Die Klauseln sind ja alle unverknüpft. Das heißt,
ich muss in jeder Klausel mindestens ein Literal wahrmachen. Genau,
und wenn man jetzt genau dieses wahre Literal nimmt und die
zugehörigen Knoten, dann hat man genau eine K-Klicke.
Warum hat man die, erstens sind es K-Knoten,
weil man ja K-Klauseln hat und Jeweils zwei Knoten können nicht
zueinander komplementär sein, weil es dann keine erfüllende Belegung wäre.
Ich kann nicht gleichzeitig x und nicht x wahr machen,
kann ich x zu 1 und zu 0 auswerten.
Genau. Und dann hat man, sind die
nicht durchkannt miteinander verbunden und dann hat man eine K-Klicke.
Das ist die eine Richtung, das ist die Richtung,
wenn die Formel erfüllbar ist, dann habe ich eine K-Klicke im Grafen.
Jetzt muss man andersrum noch zeigen, wenn ich eine K-Klicke habe,
dann ist die Formel auch erfüllbar. Gibt es andersrum eine K-Klicke,
dann muss, das, was ich ihm erzählt habe,
muss jeder Knut neben aus einer, aus einem dieser Triebel sein,
weil die Knoten in den Einzeltriebel nicht miteinander verbunden sind.
Und dann kann ich genau die Knoten,
die ich da eben in dieser K-Klicke habe,
zu eins auswerten und habe dann eine erfüllende Belegung der Formel.
Das ist einer der eher schwierigen NP-Vollständigkeitsbeweise,
weil man halt so eine Gadget, sogenannte Gadget-Konstruktion machen muss.
Manchmal reicht es auch schon irgendwie nur in gewissen Eingabeparameter zu ändern oder
irgendwie bei dem Grafen genau kannten und nicht kannten auszutauschen.
Also alle Knoten, die fuhren nicht miteinander verbunden weiter,
jetzt miteinander zu verbinden und die, die verbunden waren,
eben da die Kante wegzunehmen. Solche Konstruktionen helfen auch manchmal schon.
Und hier musste man ja wirklich irgendwie eine Gadget-Konstruktion machen,
was auch damit zusammenhängt, dass man quasi von einer Problemdomäne,
nämlich so aus der Logik, in eine andere gegangen ist,
in die Grafentheorie.
Und das ist immer komplizierter,
als wenn man in einer Problemdomäne bleibt und irgendwie ein Grafenproblem,
in ein Grafenproblem umwandelt
Ja. Naja,
und dann gibt es noch so ganz viele andere Probleme,
die ja auch alle NPV-ständig sind, bedauerlicherweise,
obwohl man die vielleicht gerne schnell lösen möchte.
Teil so ein Problem, Mengen, Partitionsproblem,
die hatten wir beide schon. Dann liebst du dieses Knotenüberdeckungsproblem,
da kriegt er irgendwie so einen ungerichteten Grafen und eine Zahl K.
Und dann wollt ihr wissen, kann man K-Knoten auswählen,
sodass für jede Kante mindestens eine ihrer Endpunkte bei diesen K-K-Knoten dabei ist.
Da solltet ihr in der Übungsaufgabe zeigen,
dass das
auch NPV-vollständig ist
Mhm. Dann gibt's doch dieses Independence-Set-Problem,
das ist im Grunde genommen das Gegenteil vom Clique-Problem, ein Independence-Set ist eben,
das sind K-Knoten, die alle paarweise nicht miteinander verbunden sind.
Bei Clique waren sie miteinander verbunden, hier sollen sie gerade nicht miteinander verbunden sein,
also quasi K-Knoten, die nichts miteinander zu tun haben.
Da sollt ihr in den Präsenzaufgaben zeigen,
dass das NP vollständig ist und da so zum Angucken,
gibt noch ganz viele weitere NP vollständige Probleme, Färbungsprobleme,
Hamilton-Kreis-Problem, Färbungsproblem hängt zum Beispiel sehr eng damit zusammen mit Stundenplan, Planung,
in Schulen oder sowas oder auch mit, wie man Register effizient zuweist.
Das sind alles Probleme, die man quasi als Färbungsproblem ausdrücken
kann und dann kann man sich abstrakt über das Färbungsproblem Gedanken machen.
Das gibt es alles und da gibt es auch viel,
viel, viel mehr. Was wichtig ist, so als Take-home-Message,
wenn ihr lange Zeit versucht, einen Algorithmus zu entwickeln,
effizienten Algorithmus und ihr kommt nicht voran,
Euch fallen immer nur so Sachen ein, wie irgendwie Brut-Force-Attacke oder den ganzen Suchraum durchzugehen oder so.
Dann kann man anfangen zu vermuten,
vielleicht ist das Problem NPV ständig und dann könnt ihr mal versuchen,
irgendwie das entweder nachzuweisen oder das irgendwie einem Kollegen zu geben,
dass der sich damit beschäftigen soll.
Aber das ist so die Idee bei dieser NPV-Stelligkeit,
dass es euch dabei hilft, dass ihr nicht ununterbrochen versucht,
ein Problem zu lösen, was vielleicht gar nicht geht.
Also wenn ihr die ganze Zeit versucht,
irgendwie ein Problem effizient zu lösen und das geht gar nicht,
dann verschwendet ihr irgendwie eure Zeit, also könnt ihr auch irgendwann damit aufhören.
Und wenn ihr dann sicher sein wollt,
dass das wirklich nicht klappt, hilft eben so ein NPV-Vollständigkeitsbeweis.
Dafür ist das da.
Ich habe vergessen, was auf der letzten Folie kommt.
Ah ja. Was macht man denn jetzt noch,
wenn man das trotzdem lösen will? Also all die
genannten Probleme eben, auch wenn die irgendwie abstrakt aussehen.
Das ist meistens der Kern in irgendwelchen tatsächlich in der Praxis auftretenden Probleme.
Das heißt, wenn man jetzt weiß, dass die NP vollständig sind,
kann man da im Allgemeinen nicht einfach aufhören.
Man weiß halt nur, das geht nicht, ich brauche es aber trotzdem.
Und die Möglichkeiten, die man da so hat,
ist, man kann sich mal überlegen,
brauche ich das Problem wirklich so in dieser Allgemeinheit?
Vielleicht wollt ihr gar keine Klicke auf beliebigen Grafen bestimmen,
sondern klicken nur auf ganz bestimmten Grafen.
Wenn die Grafenbäume sind, das ist zum Beispiel tierisch einfach
zu gucken, ob der eine Klicke hat oder nicht
Oder allgemein ganz viele Grafenprobleme, wenn die Grafenbäume sind,
sind die immer einfach zu lösen. Also liegt bei euch
vielleicht nur ein Spezialfall vor und nicht das Problem in seiner Allgemeinheit.
Da kann man sich mit so Geschichten beschäftigen wie Approximationsalgorithmen und
randomisierten Algorithmen. Da versucht man immer, irgendwas aufzuweichen,
von dem man vorher verlangt hat, dass man das haben muss.
Bei Proximationsalgorithmen versucht man aufzuweichen, ich interessiere mich gar nicht mehr
für das Optimum, ich möchte nur ungefähr das Optimum.
Bei randomisierten Algorithmen weicht man auf, naja,
manchmal klappt es halt nicht, ist mir auch egal.
Da sagt man nur irgendwie in 95 Prozent aller Fälle
liefert mein Algorithmus ein schönes Ergebnis
Oder eben Heuristiken, dass man, das ist so ähnlich wie bei Proximationsalgorithmen,
dass man eben irgendwie mit Raten versucht zum richtigen Ziel zu kommen.
Bei den Dingern ist das Problem seit ungefähr 30 Jahren oder so,
dass die toll funktionieren, bei ganz vielen Eingabeinstanzen und wir keine Ahnung haben,
warum und wir das auch irgendwie nicht gut messen können.
Also es ist immer so ein Rumgespiele so und dann testet man
auf ganz vielen Instanzen und dann stellt man irgendwann fest,
so, ey, mein Algorithmus ist ja richtig toll,
schnell, aber man weiß leider gar nicht so genau,
warum und man weiß nicht genau,
auf welchen Instanzen der gut funktioniert und auf welchen Instanzen der nicht so gut funktioniert.
Das ist so das Problem bei Heuristiken. Gibt es auch ganz viele Techniken,
die man da machen kann Und bei diesem Satisfiability-Problem zum Beispiel,
also dieses Erfüllbarkeitsproblem für Aussagenlogik,
da gibt es mittlerweile unglaublich schnelle Satzsäuber, sagt man immer,
so irgendwie Programme, die eine außerarchologische Formel auf Wahrheit überprüfen,
die mit Heuristiken arbeiten.
Die kommen mit unglaublich großen Formeln zurecht, also viel größeren Formeln,
als man jetzt bei einer Laufzeit von 2 hochk erwarten würde.
Und man weiß aber gar nicht so genau,
bei welchen Instanzen die jetzt nicht funktionieren.
Man weiß halt, die können das Problem nicht allgemein in
P lösen. Aber auf ganz vielen Instanzen sind sie eben
tierisch schnell
Genau, mit sowas könnt ihr euch, ein bisschen wird das,
glaube ich, angetatscht in der AD-Vorlesung im dritten Semester.
Und wenn ihr da so richtig einsteigen wollt,
hier so bei Proximations- und Rannomisierungsalgorithmen,
dann ist das das Algorithmikmodul im Hauptstudium.
So, Fragen. Dann, letzter Foliensatz,
der ist auch nur ganz klein
Einmal zum Revue passieren lassen, was wir in den letzten sechs Wochen gemacht haben.
Wir haben uns mit unterschiedlichen Sprachfamilien beschäftigt. Dieser Sprachfamilie der
regulären Sprachen, Sprachfamilie der kontextfreien Sprachen, Sprachfamilie der Entscheidbanksprachen,
Sprachfamilie der aufzählbaren Sprachen. Und wir haben sogar festgestellt,
dass irgendwie hier diese Kette von echten Inklusionen gilt.
Wir haben ja das gemacht, irgendwie regulär,
das waren so diese Geschichten mit den endlichen Automaten und dann sowas wie A, Sterl-B-Stern und sowas.
Dann haben wir irgendwann festgestellt, so A, hoch,
NB, hoch, N geht gar nicht,
Stichwort Pumping-Lämmer,
auch in Bio-N ist aber kontextfrei
Kontextfrei war das mit dem PDA und mit den kontextfreien Grammatiken.
Dann haben wir da festgestellt, auch in B-O-N-C hoch
N ist nicht mehr kontextfrei. Pumpinglam für kontextfreie Sprachen benutzt.
Da kann man aber zeigen, dass das entscheidbar ist.
Auch in B-O-N-C hoch N. Im schlimmsten Fall,
wenn ich zeige, dass es entscheidbar ist,
nehme ich mir so einen Zähler mit,
dann zähle ich einmal die As und dann gucke ich,
ob das genau so viele B sind und genauso viele Cs.
Und dann sage ich, ja, wenn das so ist und nein,
wenn das nicht so ist, dann ist das entscheidbar.
Da ist man dann schon bei den Touring-Maschinen und dann konnten wir hier eben zeigen,
das Halteproblem ist nicht mal mehr entscheidbar,
aber das ist immerhin noch aufzählbar, aufzählbar.
Auch Touring-Maschinen, aber dass die Touring-Maschine nicht bei jeder Instanz
anhalten muss, sondern eben nur bei den Jahrinstanzen.
Das ist so der ganz hochfliegende Abstraktionslevel für das,
was wir gemacht haben, uns irgendwie diese vier Sprachfamilien angeguckt.
Jetzt kommt für jede dieser Sprachfamilien eine Folie mit Modellen,
die wir dafür hatten. Begriffe, die wir da so
hatten und Verfahren, die wir da so kennengelernt haben.
Also ein wildes Zusammengewürfel von Buzzwords jetzt.
Das ist ja einmal Revue passieren lassen könnt,
was ihr alles gelernt habt in den letzten sechs Wochen.
Reguläre Sprachen hatten wir DFAs, das war das allererste Modell.
Die endlichen Automaten, endliche deterministische Automaten,
dann haben wir die nicht deterministischen,
endlichen Automaten kennengelernt
In so einem kleinen Exkurs haben wir gesagt,
es gibt die mit- und ohne Lamnderkanten.
Lamnderkanten waren so Geschichten von einem Zustand zum anderen,
ohne Buchstaben zu lesen, halt mit einer Lamderkante.
Sich mir nicht so genau darauf eingegangen, aber so ein kleiner Exkurs.
Dann haben wir die regulären oder rationalen Ausdrücke kennengelernt und auch einmal kurz anskizziert,
dass das irgendwie Äquivalent zu den DFAs ist.
Da müssen wir anskizziert bei der Geschichte von NFA zu DFA,
haben wir es ja wirklich gemacht, Stichwort Potensautomat.
Und bei den rationalen Ausdrücken haben wir es nur anskizziert.
Die dienen für uns also nur dazu,
irgendwie schnell Sprachen aufschreiben zu können, dass man dem schnell sogar schreiben kann,
wie A plus verknüpft mit C oder so,
dass man da nicht immer schreiben muss.
Die Mängel, die A enthält und dann plus und dann
Punkt und die Menge, die C enthält oder so,
sondern dass man einfach sagen kann A plus.c
Und zu guter Letzt die rechtslinearen Grammatiken,
spezielle kontextfreie Grammatiken, das waren die Dinger,
wo irgendwie auf der linken Seite ein Non-Terminal steht und auf
der rechten Seite eine Kette von Terminalzeichen gefolgt, von genau einem Non-Terminal.
Rechtslinear, weil eben auf der rechten Seite immer nur ein Non-Terminal auftritt.
Deswegen linear und rechtslinear, weil es ganz rechts steht.
Konnte man auch zeigen, dass das e-kühlen zu DFAs ist. Begriffe,
die wir da so hatten, Zustände, Eingabesymbol,
Alphabet über Führungsfunktion, Staat und Endzustände, das war alles das,
was man im Kontext von dem DFAs schon hatte,
um das zu definieren.
Dann hatten wir diese zwei Begriffe vollständig und initial zusammenhängend.
Vollständig war der DFA, wenn ich in jedem Zustand
jedes Eingabesymbol lesen kann
Initial zusammenhängt, wenn ich jeden Zustand vom Staatszustand aus tatsächlich erreichen kann.
Also wenn ich nicht so ein Stück unnützes Zeug irgendwie habe in meiner Skizze. Genau,
dann Konfiguration, Rechnung, akzeptierte Sprache, deterministisch,
nicht dieterministisch und wir hatten so Abschlusseigenschaften, dass man irgendwie sagen kann,
wir geben zwei reguläre Mengen, die Vereinigung ist wieder regulär.
Oder die Produktbildung, die Komplimentbildung, Komplexprodukt, all solche Geschichten.
Techniken, die wir hatten, Gegeben Automat und eine Sprache
akzeptierte die wirklich, irgendwie beweisen, wie man das macht.
Habe ich euch ja zu Genüge mit gequält,
dass man da zwei Richtungen zeigen soll und so.
Dann haben wir so Techniken kennengelernt, um Automaten zu konstruieren.
Das war einmal, sich zu überlegen, was man sich
eigentlich merken will und das irgendwie in die Zustände zu kodieren.
Stichwort irgendwie, wenn man sich merken will,
dass das vorletzte gelesene Symbol eine Null ist,
dann kann man da irgendwie sich im Zustand merken,
dass das tatsächlich der Fall ist oder dass man schon mal eine Eins gelesen hat oder irgendwie sowas.
Oder diese Geschichten mit gerade ungerade. Ich habe gerade
viele Nullen gelesen oder ungerade viele Nullen. Und immer,
wenn ich meine, ich habe gerade viele Nullen gelesen,
jetzt kommt eine Null, dann weiß ich, naja,
jetzt habe ich ungerade viele Nullen gelesen,
jetzt kommt wieder eine, weil ich habe gerade viele gelesen.
Und die andere Technik war so eine On-the-Fly-Methode,
einfach Staatszustand anzufangen und sich immer zu überlegen,
wenn ich was lese,
ist das jetzt gut oder schlecht und in welchem Zustand
will ich dann kommen
Potenziautomatenkonstruktion, NFA, zu DFA,
verschiedene Konstruktionen um Abschlusseigenschaften zu zeigen, beispielsweise der Komplimentautomat,
dass man weiß, wenn ich eine reguläre Sprache habe,
dann gibt es einen Automaten dafür,
wenn ich jetzt genau das Kompliment dieser Sprache akzeptieren will,
dann nehme ich mir diesen Automaten für die ursprüngliche Sprache und tausche einfach Zustände und Endzustände aus.
Also alles, was Endzustand war, ist jetzt keiner mehr,
alles, was kein Endzustand war, ist jetzt einer,
nämlich ein Automaten, der genau das Kompliment akzeptiert.
Und wenn der Automat vollständig ist, also ich muss mit
dem vollständigen DFA anfangen. Und zuletzt Pumpinglämmer der regulären Sprachen,
dass man das eben benutzen kann,
dass man für eine gegebene reguläre Sprache mit diesem Pumpinglämmer zeigen
kann,
dass das nicht gilt
Kontextfreisprachen. Nicht die terministischen Kellerautomaten haben wir kennengelernt.
Betonung in dem Fall auf nicht eterministisch.
Die deterministischen haben uns gar nicht angeguckt. Wir haben uns
nur die nicht-eterministischen Kellerautomaten angeguckt und damit zwei Akzeptanzbedingungen.
Wir haben üblicherweise die mit leerem Keller benutzt.
Es gibt auch noch die Akzeptanz mit einem Zustand.
Beides ist äquivalent, habe ich einmal in der Vorlesung erwähnt,
haben wir aber nicht gezeichnet, haben wir uns erwähnt.
Und eben großes Thema, kontextfreie Grammatiken mit den kontextfreien Grammatiken,
kann ich eben auch die Sprachfamilie der kontextfreien Sprachen
irgendwie erfassen
Da die Begriffe beim PDA erstmal so wie beim DFA,
also wieder so eine Endzustände, Rechnung und so weiter,
kommt noch irgendwie der Begriff des Kellerbodensymbols dazu.
Und bei Grammatiken eben non-terminale, terminale Produktion und Staatssymbol,
Ableitung, generierte Sprache. Und wenn man möchte,
hier noch die Lamda-Produktion, dass man weiß,
eine Produktion der Art von A geht zu Lamda,
ist eben
eine Lamda-Produktion
Genau. So, da hatten wir noch ein paar mehr Techniken,
was insbesondere daran liegt, dass wir sowohl Grammatiken als auch Automaten
haben und man jetzt eben sowohl für eine Grammatik zeigen muss,
dass sie eine Sprache generiert, als auch für den Automaten,
dass seine Sprache akzeptiert.
Und wir haben so Techniken zum Konstruieren kennengelernt. Beim Automaten waren das so Geschichten,
dass man sich irgendwie, dass man den Keller benutzen kann,
um Dinge zu zählen und wieder runterzuzählen oder auch,
dass man den Keller benutzen kann,
um auf dem Keller genau das Umgekehrte von dem zu haben,
was man auf dem Band gelesen hat.
Für diese Geschichten,
W und W,
Reverse und sowas
Und dass man da so die Techniken und beim Konstruieren von Grammatiken,
da haben wir im Grunde genommen die Techniken kennengelernt,
entweder quasi in das Wort hineinzuwachsen mit seinem Non-Terminal,
also aus dem Staatssymbol S mache ich ASB,
daraus mache ich zwei As, S2Bs und so weiter,
dann wachse ich so nach innen.
Oder eben, dass man so linear wächst,
dass man irgendwie von S nach AS geht und dann kann
man da eben so eine Kette von As erzeugen.
Chomsky-Normalform haben wir kennengelernt mit dem wichtigen Zwischenschritt des Reduzierens,
dass man irgendwie guckt, welche Non-Terminale sind produktiv,
welche sind erreichbar.
Abschlusseigenschaften wieder und dann eben Pumping gleich mal für kontextfrei sprachen.
Das haben wir da alles gemacht
Touring-Maschine für die aufzählbaren Sprachen. Reterministisch, nicht deterministisch,
dann haben wir so Fälle geguckt, einseitiges, unendliches Band,
beidseitig, unendliches Band, mehrere Bänder und so weiter.
Da kann man auch ganz viel mehr machen. Im Grunde genommen,
deswegen steht es da unter nochmal Church-Touring-These, alle Modelle,
die diese intuitiv berechenbaren Funktionen erfassen, sind irgendwie Äquivalent zu der Touring-Maschine.
Also wäre ein gutes Modell auch irgendwie eine höhere Programmiersprache.
Da auch wieder die Begriffe im Grunde genommen so ähnlich wie bei
den DFAs und PDAs auch. Hier war das so,
dass diese Schrittrelation irgendwie umständlich zu definieren war,
aber eben, wenn man sie benutzen will,
ist das
relativ einfach
Und dann tritt hier eben dieser Begriff entscheidbar auf,
dass man hier mit aufzählbar und entscheidbar zwei unterschiedliche Arten und Weisen hat,
wie man die Turing-Maschine interpretiert,
wenn sie eine Sprache einfach nur akzeptiert,
dann bin ich irgendwie in der Sprachfamilie der aufzählbaren Sprachen.
Wenn ich bei jeder Eingabe anhalte, bin ich in der Sprachfamilie
der entscheidbaren Sprachen. Was haben wir da so kennengelernt?
Sprachen akzeptieren, Sprachen entscheiden, Funktionen berechnen.
Für all diese Sachen irgendwie Turing-Maschinen konstruieren oder eben mit dem,
was wir jetzt aus der Komplexitätstheorie da kennengelernt haben,
wenn es jetzt nur darum geht,
dass irgendwas in P ist,
kann man das auch mit einer höheren Programmiersprache machen
Und dann eben dieser Schritt hier, beweisen,
dass ein Problem wirklich unentscheidbar ist, gegeben ein Problem.
Die Frage ist, ist unentscheidbar, ist das Verfahren anzunehmen,
dass die Sprache unentscheidbar wäre und dann den Algorithmus dafür zu benutzen,
den angenommenen Algorithmus dafür zu benutzen, um für ein anderes Problem,
von dem man schon weiß, dass es unentscheidbar ist,
zu zeigen, dass es auch entscheidbar ist.
Das war da so das Ding. Letzte Komplexität, entscheidbare Probleme werden
bezüglich der Komplexität unterteilt. Das ist jetzt all das,
was wir gestern und heute gemacht haben und auch letzten Dienstag,
glaube ich, noch genau, Zeitschrank und Platzschranken eingeführt,
dann die wichtigen Komplexitätsklassen,
P-N-P-P-Space und NP-Space,
also wobei für uns jetzt vor allem die vorderen beiden
hier wichtig sind
Landau und U-Notation, um darüber irgendwie ein bisschen schneller reden zu können,
dass irgendwas im Polonialzeit ist, O von N. Hochkar,
statt zu sagen, es ist irgendwie in dreimal in Hoch
drei plus viermal N oder so, und sagt mir einfach,
ja, das sind Hof- und N hoch drei.
Und dann eben Reduktion NP vollständig und endlich schwierig.
Und da haben wir eigentlich nur ein Verfahren kennengelernt,
nämlich wie man von einem Problem zeigt, dass das NP vollständig ist.
So, was haben wir übersprungen? Ausgelassen, deterministische Kellerautomaten.
Kann man sich nochmal angucken, wenn man das möchte.
Da gibt es tatsächlich einen Unterschied zwischen,
ob ich mit Leam Keller akzeptiere oder mit Endzustand,
die, die mit Leam Endzustand, die,
die mit Leam Keller akzeptieren,
die hängen ziemlich quer zu all unseren anderen Komplexitätsklassen
Weil die mit Leam Keller, die akzeptieren irgendwie nur präfixfreie Sprachen,
also Sprachen, wo kein Wort Präfix eines anderen Wortes ist.
Und dann könnt ihr nicht mal mehr sowas wie A-Sterne akzeptieren,
weil irgendwie A und Präfix von zwei As ist,
das könnt ihr nicht akzeptieren.
Aber ihr kriegt zum Beispiel damit so was hin wie A,
auch ein Bio-Rennen. Also ihr kriegt nicht alle regulären Sprachen hin,
aber ihr kriegt irgendwie Sprachen hin, die nicht regulär sind und so.
Weswegen, die sind so ein bisschen,
hängen so quer zu regulär und kontextfrei. Ja,
und dann gibt es hier noch die linear beschränkten Automaten.
Das sind Touring-Maschinen, die nicht mehr Platz benutzen dürfen,
als am Anfang durch das Eingabewort Zellen belegt sind.
Also wenn ihr ein Eingabewort der Länge Zehen gebt,
dann dürft ihr halt
zehn Zellen benutzen
Lineare. Und die sind Äquivalent zu den sogenannten Kontext sensitiven Grammatiken.
Steckt schon irgendwie wieder in Kontext sensitiv anders als bei Kontext frei,
während die Non-Terminale jetzt so ersetzt, je nachdem,
in welchem Kontext sie gerade stehen.
Und da kann man halt zeigen, diese beiden Sachen,
also die LBAs und die kontextsensitiven Grammatiken, die sind zueinander äquivalent.
Und deswegen steht hier auch nochmal so Typ 1-Grammatik.
Die kommen halt nach den kontextfreien Sprachen in unserer Hierarchie und
vor den Entscheidbaren. Also üblicherweise hätte man die regulären,
die kontextfreien, die kontextsensitiven, dann die Entscheidbaren.
Und da hat man halt Typ 3 Grammatiken bei den regulären Typ 2
bei den kontextfreien Typ 1 bei den Kontextsensitiven und Typ 0
Grammatiken sind völlig allgemeine Grammatiken.
Das sind die aufzählbaren Sprachen
Wenn ihr das mal irgendwo liest, die, das ist die,
von wem war die, von Church, die Churchil-Klassifizierung nach diesen Grammatiken.
Nee, Church. Ich glaube, es war nicht Church,
es war jemand, der mir nicht, Chomski,
ne, genau, die Chomski-Archie, Dankeschön,
die von Chomski kam, die, genau, Chomski,
der sich mit Grammatiken beschäftigt hat.
Genau, wenn ihr das mal lest,
so Typ 3, Typ 2, Typ 1,
Typ 0, wie ein Primärtyp 3 und Typ 2 gemacht.
So, was kriegt ihr noch
Ich schreibe noch so einen sechsten Lesestoff, das wird so eine Zusammenfassung von dem,
was wir gemacht haben. Wir gucken so Mitte Mai,
Ende Mai oder so, dann mache ich noch eine Probeklausur,
also für den Automatenteil, die, weiß ich nicht,
vielleicht schaffe ich die schon vorher,
aber ich habe jetzt mal so Ende Juni hingeschrieben,
um den Druck auf mich selbst zu reduzieren.
Der Hintergrund ist, dass ich die parallel zur eigentlichen Klausur entwerfen will,
damit sich das auch irgendwie so ein bisschen deckt und ich
nicht irgendwie in der Probeklausur tausend Sachen frage,
die in der Klausur gar nicht drankommen.
Deswegen so Ende Juni
müsste auch reichen
Dann in der letzten Vorlesungswoche hatte ich mit Christopher abgesprochen.
Gibt es wahrscheinlich nochmal eine Vorlesung zur Automatentheorie,
wo ich im Grunde genommen diesen Foliensatz nehme und all die
ganzen Begriffe noch mit den eigentlichen Definitionen und so weiter anreicher,
dass man nochmal wirklich alles nochmal sehen kann.
Und dann machen wir vor der Klausur noch ein Repetitorium.
Genau. Fragen. Fragen fragen, fragen, fragen wir.
Fragen fragen, fragen wir. Ich weiß noch nicht genau,
ob der Logik-Teil auch mit Lecture-to-go aufgenommen wird.
Das muss ich nochmal mit Christopher besprechen.
Falls nicht, sage ich nochmal Bescheid
Mhm. Genau. Dann, nähern wir uns dem Ende?
Doch, noch eine Frage? Ja, genau. Also die Klausur ist so,
die ist zweigeteilt, die hat einen Logikteil und einen Automatenteil.
50, 50, so. Und Probeklausur,
ich weiß nicht, ob er auch eine machen will,
ich mache einen für meinen Teil im Repetitorium,
wird halt alles auf jeden Fall besprochen.
Ich kann nur nicht versprechen, dass ich eine Probeklausur für seinen Teil mache,
weil ich ja seinen Teil auch gar nicht unbedingt vorher sehe.
Ich kann die halt fragen, irgendwie geben,
die so ähnlich sind wie was,
was wir so in den letzten Jahren gefragt haben,
aber halt nicht so oft seinst dann zugeschnitten.
Von daher gibt es auf jeden Fall
eine Probeklausur zu meinem Teil und zu sein müssen wir
mal gucken
Genau, und weil ihr das bestimmt auch gleich wieder fragt,
üblicherweise in der Klausur 50 Prozent der Punkte,
aber nicht mehr aufgesplittet nach Teil.
Also wir hatten das früher mal, dass man irgendwie in jedem Teil
50 Prozent haben muss oder sowas, machen wir üblicherweise nicht mehr.
Also man könnte jetzt auch irgendwie in einem Teil ganz viele
Punkte haben und in anderen ganz wenig oder so.
Ist aber eigentlich eher unüblich, weil beide Teile sind meistens so,
dass wenn ihr von beiden Teilen die Grundlagen gut könnt,
dann habt ihr in beiden Teilen schon irgendwie 20,
30 Punkte oder so.
Also wenn es jetzt in beiden Teilen 50 Punkte gibt,
dann hast du schon einen Großteil. Deswegen lohnt es sich
meistens irgendwie in beiden Teilen erstmal die ganzen Grundlagen zu lernen,
weil die halt auch schnell gelernt sind und dann ist man
auf jeden Fall durch und dann kann man sich um die
schweren Sachen so danach kümmern
Noch mehr Fragen. Dann, ne, weißt du,
Fragen, keine Fragen, keine Fragen. Dann kommt jetzt
meine Zehn. Dann, also ich habe nichts mehr.
Habt ihr auch was? Den? Neun? Ach,
sieben. Acht? Gehen wir wieder zurück? Ein Automatenteil
für Dummies. Ich würde ja sagen, mein Lesestoff,
aber ich weiß nicht genau, ob das qualifiziert.
Keins, also ich finde halt dieses von Hauptkraft Ulmen ziemlich gut.
Ich finde das auch nicht zu schwierig, das ist halt ziemlich dick.
Aber da würde ich einfach mal reingucken. Das gibt es
ja auf Englisch und Deutsch, schau da mal rein.
Und sonst einfach mal in die Bib gehen und dir alle möglichen Automatentheoriebücher angucken,
die du so findest und welche dir gefallen.
Doch, es gibt noch eins, theoretische Informatik heißt das,
glaube ich, auch von Hoffmann.
H-O-F-M-A-N-N oder Doppel-F bin ich mir gar nicht so ganz sicher.
Das ist auch cool gemacht so. Und der geht auch nicht so,
also Hauptkraft Ulmen geht ja sehr tief und beweist alles und
der Hoffmann geht nicht ganz so tief so.
Der überspringt dann auch mal Sachen. So, noch eine
Frage. Bin ich jetzt mit acht? Acht, sieben
. Fünf. Ihr wartet alle darauf, ob das in
eine andere Zahl kommt. Zwei? Eins? Dann,
mir hat es Spaß gemacht. Ich hoffe,
ihr habt auch was gelernt und hattet auch Spaß hoffentlich.
Und dann bis in sechs Wochen oder so,
ne?
Feierabend,
Schluss für heute