Aber mein Klicker funktioniert irgendwie nicht. Ich habe einen Laserpointer,
das hilft dem Video jetzt nicht so,
aber ich habe irgendwie, ich kann nicht klicken.
Na gut, dann muss ich heute irgendwie in
der Nähe vor meinem Laptop stehen und da immer umklicken.
Ja, legen wir mal los. Aufzählbarkeit und Unentscheidbarkeit.
Gestern haben wir die beiden Begriffe eingeführt, aufzählbar entscheidbar.
Da geht es schon los. Aufzählbar entscheidbar, haben gesagt,
entscheidbar ist eine Sprache, wenn es eine Touring-Maschine gibt,
wie die Sprache akzeptiert und die bei jeder Eingabe anhält.
Aufzählbar ist sie, wenn eine Touring-Maschine existiert, die die Sprache akzeptiert.
Die muss dann eben nicht zwingend bei jeder Eingabe anhalten.
Und insbesondere Bei den Nein-Instanzen, also bei Worten,
die nicht in M sind, da tut sie es dann eben nicht zwingend.
Bei Worten, die in M sind, da wird sie immer anhalten.
Also kann man ja immer so machen, dass sie,
soweit es im Endzustand ist, dann halt anhält.
Aber bei Worten, die nicht in M sind,
da arbeitet sie dann halt,
kommt halt nicht in Endzustand und dann kann es eben passieren,
dass sie irgendwie nicht anhält, sondern immer weiterarbeitet.
Und man merkt das halt nicht. Und man weiß dann
immer nicht, wenn man dem jetzt irgendein Wort vorlegt,
kommt die nochmal in Endzustand und hält dann an oder eben nicht.
Das kann man halt nicht feststellen
Genau, und dann nennt man eben diese Sprachfamilie der aufziehbaren Sprachen,
die nennt man ihm RE und die der entscheidbaren Sprachen,
nennt man eben Reck.
Das waren so die beiden grundlegenden Definitionen,
die wir gestern hatten. Habt ihr da Fragen zu?
Soll ich da irgendwie beim Nachbereiten, das Unklarwesen?
Dann haben wir uns
die ganzen entscheidbaren Sprachen so angeguckt
Wobei, anderthalb davon ja noch auf den Übungszetteln dann kommen,
also dieses hier mit DFA,
dass die Sprache vom DFA leer ist,
das soll ja in Präsenzaufgaben machen und das hier,
da brauchte man ja irgendwie,
dass man kontextfreie Grammatiken entscheiden kann und das soll man ja auf den Übungsaufgaben machen.
Genau, dann haben wir uns Abschlusseigenschaften, die haben wir
so ein bisschen andiskutiert, deswegen heute nochmal zum Warmwerden.
Was war denn die Idee,
warum sind da die entscheidbaren Sprachen gegenüber Durchschnitt,
Vereinigung und Kompliment abgeschlossen,
was macht man da da
Wenn ich zeigen will, wenn ich eine entscheidbare Sprache habe,
ist auch das Kompliment entscheidbar, wenn ich zeigen will,
wenn ich zwei entscheidbare Sprachen habe,
ist auch die Vereinigung entscheidbar und ist auch der Durchschnitt entscheidbar,
wie mache ich das?
Hat mir gestern kurz woran diskutiert. Ich habe neulich mal
wieder mit meinem ehemaligen Kollegen und Mentor geredet, der meinte,
wenn du eine Frage in den Raum stellst und keiner meldet sich,
warte einfach
Okay, sollte man vielleicht alles formulieren. Wenn du eine
Frage in den Raum stellst von dir und der Meinung bist,
dass die Leute sie beantworten können sollten, warte.
Der war richtig cool, der hatte das drauf,
der konnte ernsthaft fünf Minuten in der Vorlesung warten und einfach nichts gemacht.
Bis dann irgendwann die Studenten dachten, okay, vielleicht muss ich
mich doch melden, es geht wohl sonst nicht weiter.
Ich habe ja Ansprüche, ich will ja,
ich will das ja besser machen als mein Mentor,
also ich habe mir vorgenommen, ich mache jetzt erst weiter,
wenn sie sich mindestens zehn Leute melden.
Kaffee holen gehen. Er kommt, Leute,
das ist echt, eine Sprache ist entscheidbar,
wenn es eine Turing-Maschine gibt, die ja oder nein liefert.
Also wenn es eine Java-Funktion gibt,
die einen Bullschen Wert zurückliefert, True oder False,
wie kriege ich das hin,
eine Methode zu implementieren,
die das Gegenteil zurückliefert
Okay, wir machen das ernsthaft. Mal gucken,
bis sich Leute melden. Eins. Zwei, drei,
vier, fünf, sechs, sieben.
Hauke zähle ich auch nochmal mit, macht acht.
Ja, der hat sich schon gemeldet, das ist okay.
Wir sind erst bei acht, das reicht noch nicht.
Und ihr habt aufgehört, euch zu melden, das zählt nicht.
Ihr kommt oben bleiben mit der Hand. Ihr könnt euch
nachher bei den anderen zweien, die sich noch nicht gemeldet hat,
beschweren, dass das so lange dauert.
Neun? Ja, oder ist das eine Meldung?
Ist das eine halbe Meldung? Okay, was macht man
Genau. Genau, fertig, ne? Kompliment,
Ergebnis invertieren, Vereinigung im Durchschnitt, hintereinander ausführen, fertig.
Aufzählbare Sprachen sind gegenüber Durchschnitt und Vereinigung abgeschlossen, wie die Durchschnitt?
Warten wir mal, bis sich fünf Leute melden.
Wie die Durchschnitt bei Aufzählbaren sprachen
Was passiert da, wenn ich die hintereinander ausführe?
Also wenn ich die gleiche Idee erstmal benutze,
wenn ich die hintereinander ausführe, was passiert? Fast,
das war jetzt... Genau, fast, das war jetzt
die Idee mit, ich kann die nicht hintereinander ausführen lassen,
sondern ich lasse die schrittweise ausführen.
Jein, damit klappt es auf jeden Fall,
aber brauche ich das tatsächlich schon beim Durchschnitt
Genau, wenn die erste nicht akzeptiert,
also wenn die jetzt irgendwie lange, lange,
lange rechnet und nie zum Ergebnis kommt,
dann heißt das ja wohl scheinbar,
dass das Wort dann nicht in der Sprache drin ist,
sondern es ist ja egal, dass du die zweite nicht startest.
Genau, und bei der Vereinigung macht man das aber genauso.
Bei der Vereinigung ist halt das Problem, es reicht ja,
wenn einer akzeptiert, also wäre es doof,
wenn ich die erste irgendwie in ihrer Handlungsschleife immer weiterlaufen lasse und die zweite in die starte,
weil vielleicht sagt die, ja, ja.
Und dann muss ich genau dieses Ding machen,
was du erzählt hast, ich lasse die erste einen Schritt machen,
die zweite einen Schritt, die erste,
den zweiten Schritt, die zweite,
den zweiten Schritt und immer so abwechselnd.
Genau,
so mache ich das
Und nicht gegenüber Komplimentbildung, da hatten wir uns ja gestern angeguckt,
wenn ich eine Sprache habe,
die aufzählbar ist und ihr Kompliment ist auch aufzählbar,
dann kann ich mit genau der gleichen Idee halt eine basteln,
die beide Sprachen entscheidet.
Also eine basteln, die Elt entscheidet und eine andere bastelt, die er quer entscheidet.
Also wenn eine Sprache und ihr Kompliment aufzählbar ist,
heißt das, die Sprache ist eigentlich sogar entscheidbar.
Und da wir dann noch wissen mit dem Heideproblem da,
dass entscheidbar und aufzählbar eben nicht die gleiche Sprachfamilie sind,
können die dann nicht gegenüber Kompliment abgeschlossen sein.
Ja, das dazu und jetzt Das haben wir dann gestern
noch gemacht. Akzeptanz Querstrich-Halteproblem, also eine Touring-Maschine,
bauen die bei Vorlage einer Touring-Maschine M und eines Wortes W,
entscheidet oder aufzählt, ob MW akzeptiert.
Und aufzählen geht halt leicht, dann brauche ich nur eine Touring-Maschine bauen,
die solche Toopel akzeptiert, wenn denn MW akzeptiert.
Und das mache ich halt einfach, indem ich sage,
naja gut, dann simuliere ich M,
also ich starte quasi M auf W und wenn M irgendwann akzeptiert,
dann akzeptiere ich auch.
Und falls das irgendwie ewig lange dauert,
dann simuliere ich halt ewig lange weiter.
Aber dann akzeptiere ich halt diese Sprache,
das ist okay
Fürs Entscheiden war das Problem, da reicht es nicht,
das zu simulieren, eben genau wegen dieser Begründung.
Wenn ich das immer weiter simuliere, ich weiß nie,
bleibt die nochmal stehen und sagt, ja oder will die eigentlich nein sagen.
Das ist das Problem erst mal bei so einem naiven Ansatz für den Schaltbarkeit.
Und dann kann man ja sogar tatsächlich zeigen, dass die nicht entscheidbar ist.
Die weiß ja gestern ja zum Schluss in den letzten zehn Minuten gemacht.
Machen wir die nochmal? Also was war die Idee?
Man nimmt an, man hätte eine Touring-Maschine, die diese Sprache entscheidet.
Dann weiß ich, ich habe so eine Touring-Maschine H,
wenn ich der MW vorlege,
dann hält die immer an und sagt, korrekterweise ja oder nein.
Ja, sagt sie, wenn MW akzeptiert, nein,
sagt sie, wenn MW nicht akzeptiert.
Das wäre eine Touring-Maschine, die dieses Problem entscheidet.
Ich nehme an,
die existiert
Unten steht nochmal, wenn Haare liefert, halt auf MW1 zurück,
wenn MW akzeptiert und Haar liefert eben null zurück,
wenn MW eben nicht akzeptiert.
Man kann an der Stelle nicht sagen, dass MW ablehnen würde,
man weiß halt nur, es akzeptiert es nicht.
So, die haben wir dann, oben steht nochmal,
was wir haben, also von den Problemen ganz oben hier,
davon wollen wir zeigen, dass es nicht entscheidbar ist.
Und hier das Haar, das nehmen wir an,
dass das existiert. So, und jetzt ist die Idee,
dann konstruieren wir so eine neue Touring-Maschine,
die benutzt Haar halt als Subroutine.
Also wir schreiben uns eine neue Java-Funktion,
die irgendwie eine andere Java-Funktion als Subroutine benutzt
Und die, diese Funktion,
die baue ich mir so, äh, diese tour,
immer schöne Idee, die baue ich mir so,
die kriegt als Eingabe auch eine Touring-Maschine, M.
Die kriegt also nur eine Touring-Maschine, hier das Haar,
das kriegt ja noch eine Touring-Maschine und ein Wort und D
soll jetzt nur eine Touring-Maschine als Eingabe kriegen.
Und dann ruft sie Haar halt auf,
ne, dann ruft sie Haar auf mit dieser Eingabe.
Also die nimmt quasi ihre eigene Eingabe,
die Touring-Maschine M und ruft dann ein Haar von MM auf.
Kommt da irgendwas raus, Truder,
Volz und das Ergebnis dreht den noch um und sagt,
okay, das ist mein Rückgabe wert.
Angenommen, es gibt so eine Funktion Haar mit zwei Eingabeparametern,
dann kann ich einfach meinen eigenen Eingabeparameter verdoppeln,
dem zweimal geben und das Ergebnis umdrehen.
Das kann ich ja machen
Und dann ist eben D von M1,
wenn M die Eingabe M nicht akzeptiert,
weil wenn M die Eingabe M nicht akzeptiert,
dann liefert H von MM ja eins zurück, null zurück,
Entschuldigung, wenn M die Eingabe M nicht akzeptiert,
liefert H von M0 zurück.
Da, wenn MM ungleich eins ist, dann liefert H von MM.
Null, ich drehe das Ergebnis um, als bin ich hier bei eins.
Und wenn M die Eingabe aber akzeptiert, wenn M1 ist,
dann ist H von MM1, ich drehe das Ergebnis um,
also muss ich hier eine Null haben.
Dann bin ich
da angekommen
So, bis dato ist alles okay. Ich nehme an,
es gibt Haare und dann kann ich mir diese Funktion,
die so schreiben. Und jetzt,
die ist jetzt irgendwie eine Funktion oder eben diese Tooling-Maschine,
alles, was ich jetzt mache, ist,
jetzt rufe ich die auf die auf.
Hab dich, wenn ich D auf D aufrufe,
dann müsste das genau dann eins zurückliefern.
Jetzt setzt man hier einfach überall, wo M steht,
setzt man D ein. Dann steht hier D von DS1,
wenn D von D nicht eins ist und D von D
ist null, wenn D von D 1 ist.
Klappt nicht.
Funktioniert nicht
Fragen dazu. Nee. Ja, deswegen stehen hier auch
überall diese eckigen Klammern. Die Eingabe hier ist irgendwie eine
Kodierung von der Touring-Maschine und dann starte ich hier damit,
dass ich diese Kodierung der Touring-Maschine da vorlege und wieder dann das Toopel habe,
M und Codierung davon und das wieder kodiere und so.
Also das ist schon okay, so von der Idee her,
wenn man jetzt einfach sagen würde, okay,
ich nehme ein komplettes Alphabet,
also das,
was wir Menschen
auch so haben
Und du schreibst dir jetzt, ne, M gleich,
runde Klammer auf, geschweifte Klammern auf,
jetzt kommen die ganzen Zustände, geschweifte Klammer zu,
jetzt kommt ein Komma, jetzt kommt wieder eine Geschweifeklammer,
die ganzen Symbolen im Eingabealphabet und so weiter.
Du schreibst das einfach, schreibst das einfach linear auf, ne?
So, das ist ein Text-String. Und wenn du jetzt eine Funktion hast,
die zwei Text-Strings kriegt und eben den einen als Turing-Maschine interpretiert und
den anderen als Wort, dann sagt, ja okay,
ich habe hier zwei Text-Strings.
Den einen kann ich jetzt Turing-Maschine interpretieren, den anderen als Wort.
Also, das ist zumindest, das ist an der
Stelle sauber
Und von der Idee her, so mit,
mit Java-Methoden oder so halt genau die gleiche Idee,
dann treibe ich mir halt Funktionen,
die ja irgendwie zwei Strings als Argumente kriegen oder eben ein String und
dann wird der eine String eben als Funktionsname interpretiert und der andere als irgendein Wort.
Und dieses irgendein Wort kann ja auch der Funktionsname sein,
macht ja nichts.
Sonst noch. Okay
Und dann hat man, genau,
das hat man diesen Widerspruch und dann weiß man eben,
okay, das Problem ist nicht entscheidbar und das nimmt man
nachher als Ausgangspunkt dafür für weitere Probleme zu zeigen,
dass die nicht entscheidbar sind.
Da kommen wir dann heute noch zu,
erstmal wissen wir jetzt das alles, also reck,
echte Teilfamilie von CF, echte Teilfamilie von entscheidbar,
echte Teilfamilie von aufzählbar. Steht darunter Beispiele für Sprachen,
die in den einzelnen Mengen sind und eben nicht darunter,
also geht mal durch eine Sprache, die ein Reck ist,
ist zum Beispiel ganz einfach.
Sprache, die
ein Reck ist
Ja, du, der jetzt nach links geguckt hat und
jetzt abrutscht und immer weiter abrutscht und sich weigert, mich anzugucken.
Obwohl er weiß, dass ich ihn genommen habe.
Eine Sprache, die ein Reck ist, kommt schon.
Irgendwas, eine Sprache, die ein Reck ist.
Ah. Oder A, Stern oder was auch immer.
Eine Sprache, die kontextfrei ist, aber nicht Reck.
Sehr gut, Ehre gerettet. Eine Sprache,
die entscheidbar ist,
aber nicht kontextfrei
Genau, auch ein Biochn-C-O-N, eine Sprache,
die aufzählbar ist und nicht entscheidbar. Oder eben gehabt,
ne? Heideproblem. Also dieses, oder Akzeptanzproblem, ne?
Entscheidbar nicht aufzählbar. Alle Mengen einmal durchgegangen, an Sprachfamilien
. Gut. Was wir jetzt also wissen hier,
es gibt sogar welche, die nicht in Scheiter sind.
Was wir jetzt noch machen wollen? Ups. Nein,
was wir jetzt noch machen wollen,
wenn man sich diese Kette hier anguckt, da,
ne, wir wissen jetzt, was in Reck ist,
etwas, was in CF ist, aber nicht in Reck,
etwas, was in Recursive ist, aber nicht in CF,
etwas, was in RE ist,
aber nicht in Reck.
Jetzt kann man sich noch einmal fragen,
gibt es auch was, was nicht mal in RE ist?
Also eine Sprache, für die ich keine Touring-Maschine angeben kann,
die die akzeptiert
Das wäre ja quasi noch schlimmer, als nicht entscheidbar zu sein,
weil entscheidbar weiß ich ja wenigstens,
ich komme da noch mit Simulation ran. Kann ich so,
noch mit Intuition, dann weiß ich, naja,
wenn ich das simuliere und wenn nach drei Stunden kein Ergebnis da ist,
dann ist da wohl irgendwo ein Fehler drin oder so,
dann kann ich wenigstens noch mit solchen Sachen irgendwie arbeiten.
Aber wenn das nicht mal mehr in der EE ist,
dann kann ich nicht mehr mit einer Turing-Maschine bauen,
die irgendwie die Sprache überhaupt akzeptiert.
Also dann komme ich mal mit Simulation weiter.
Das gucken wir jetzt jetzt gleich nochmal an.
Und danach Techniken zum Nachweis der Unentscheidbarkeit. Also von
einem Problem wissen wir jetzt, dass es unentscheidbar ist.
Es gibt bedauerlicherweise sehr, sehr viele Probleme,
die nicht entscheidbar sind und da gucken wir uns gerne mal an,
wie man das angeht und irgendwie zwei Beispiele
Okay, als erstes die Sprache, die nicht in RE ist,
die wird jetzt natürlich irgendwie so ein bisschen,
das wird nicht so richtig so ein Problem sein,
wo man sagen wird, hui, das tritt in Anwendungen auf,
weil Probleme, die in Anwendungen auftreten,
ja üblicherweise irgendwie, meistens sind sie sogar entscheidbar,
oft sind sie zumindest aufzählbar, also so Sachen,
die dann, die so einer Sache nicht zugänglich sind,
die lassen sich meistens nicht so gut formulieren, so,
deswegen sieht das gleich ein bisschen wild aus.
Was man macht ist, also das Schöne,
warum wir uns das angucken,
ist die Beweistechnik
Was man macht, ist, man kann Wörter sortieren,
dass ich sage, ich nehme erstmal alle Wörter der Länge 1,
alle Wörter der Länge 2, alle Wörter der Länge 3,
alle Wörter der Länge 4 und die schreibe ich mir so hintereinander auf.
Und wenn ich dann noch irgendwie sage, ah,
ist kleiner als B oder null ist kleiner als eins,
dann kann ich die Wörter eben lexikalisch sortieren, so wie ich das auch im Telefonbuch mache.
Dann kommt halt A vor B, dann kommen die zwei Buchstabigen,
da kommt dann eben das A vor dem A, B,
dann kommt das B, A, dann kommt das B, B und so weiter.
Also einfach durchgezählt. Und wenn man das so aufschreibt,
dann kommen ja alle Wörter irgendwie einmal vor und dann kann man sowohl diese Codierung von den Touring-Maschinen,
wenn ich die wieder jetzt,
so wie ich das eben einmal kurz gesagt habe,
wenn ich eine Codierung von der Touring-Maschine,
wenn ich das mir irgendwie als Textwing vorstelle,
und dann stelle ich mir das von mir aus als Textwing vor,
der nur aus Nullen und Einsen besteht,
so wie das auch im Computern irgendwie intern gespeichert werden würde,
dann kann ich alle diese Codierung von Touring-Maschinen aufzählen.
Also ganz viele Wörter über Null und Eins sind dann keine
Codierung von der sinnvollen Touring-Maschine, aber das macht ja nichts.
Also da sind dann ganz viele dabei,
die okay sind und dann kann ich sagen, die erste,
die okay ist, das ist eben meine Touring-Maschine,
M1, die zweite Codierung, die tatsächlich eine Touring-Maschine ist,
das ist meine Touring-Maschine, M2 und immer so weiter.
Und bei Wörtern, da ist sowieso klar,
das sieht man ja da oben schon,
dass sich da vom Wort wie 1W2, W3,
W4 und so weiter sprechen kann.
Also da muss ich nicht mal
was rausschmeißen
Wenn man das ganz genau machen will, sind die Begriffe so Gödelisierung und sowas.
So als Exkurs. Aber grob klar, ich kann von der ersten,
der zweiten, der dritten, der vierten und so weiter Touring-Maschine reden.
Genauso wie ich auch sagen kann,
irgendwie,
ich gucke mir alle Textstrings an und einige Textstrings sind Java-Programme
und dann sortiere ich die halt irgendwie nach Anzahl der Buchstaben in diesem Textstring erstmal und danach sortiere ich die nochmal irgendwie lexikalisch nach den Buchstaben,
die da eben drin sind und dann habe ich irgendwie ganz viele Strings und einige davon sind Java-Programme und von dem kleinsten String,
der ein Java-Programm ist, sage ich eben,
das ist mein Java-Programm J1 und von dem nächsten,
das ist mein Java-Programm J2 und
immer so weiter
Und wenn ich das habe,
dann habe ich also eine Aufzählung von den, naja,
wo da eine Durchnummerierung der Wörter wie 1 wie 2,
W3, W4 und so weiter.
Und eine von den Turing-Maschinen, 1 M2, M3 und so weiter.
Und jetzt kann ich mir die folgende Sprache angucken.
LD, D für Diagonalisierung, sehen wir gleich,
warum man das so nennt. Da sage ich,
in LD sollen all die Wörter WI drin sein,
die nicht von der Turing-Maschine MI akzeptiert werden.
Also ich gucke mir das Wort W1 an und
die Turing-Maschine M1. Wenn W1 von M1 akzeptiert wird,
ist wie eins bei mir nicht drin.
Wenn es abgelehnt wird,
nehme ich es rein
Tue ich mir W2 an, wenn wir 2 von M2 akzeptiert wird,
nehme ich es nicht rein, wenn es abgelehnt wird,
nehme ich es rein und so weiter.
Hey Mann. Also die Sprache kann ich mir so definieren.
Über die Sinnhaftigkeit der Sprache kann man sich noch unterhalten,
aber die Sprache kann ich mir erstmal so definieren.
Und die Idee ist halt jetzt zu sagen, die ist nicht aufzählbar.
Und die Beweisidee, deswegen hier D ist so ein Diagonalisierungsbeweis,
man kann sich jetzt diese Wörter wie 1V2,
W3 und so weiter, die kann man sich in so einer Matrix,
die stehen jetzt in der Spalte und M1 M2 stehen oben in der Zeile.
Und dann kann man sich eben so eine Matrix machen,
wo man sagt, ich schreibe mir hier die Diagonale in der 1,
genau dann, wenn V1 von M1 akzeptiert wird.
Und ich schreibe mir da halt eine Null hin,
so wie bei W2M2, wenn das eben nicht akzeptiert wird.
Und diese Diagonale hier, wenn dann der Eins steht,
dann ist das Wort eben gerade nicht in LD.
Und wenn dann eine Null steht, dann ist das Wort in LD.
Dann habe ich dann diese Diagonale. Und die Idee beim Beweis ist jetzt,
dass man sagt, wenn diese Sprache aufzählbar wäre,
also wenn LD aufzählbar wäre,
Denn müsste es ja irgend so einen MJ geben,
dass diese Sprache eben gerade akzeptiert.
Also meine M1, M2, M4 und so weiter,
das ist ja eine Durchnummerierung aller Touring-Maschinen, die es gibt.
Wenn ich also sage, LD wäre aufzählbar,
dann muss irgendeiner davon diese Sprache eben akzeptieren.
Also muss es irgend so ein MJ geben,
sodass die von MJ akzeptierte Sprache eben gerade das LD ist.
Und dann kann man sich überlegen, naja,
wenn das jetzt aber so wäre, nehmen wir mal an,
das wäre M3, nehmen wir mal ein M3,
wäre gerade die Touring-Maschine, die LD akzeptiert,
dann habe ich gerade bei dem Wort W3 irgendwie ein Problem,
weil hier wird noch gesagt, W3 wird von M3 akzeptiert
Und hier wird gesagt, in LD ist es aber nicht drin.
Welchen Widerspruch? Also wenn M3 gerade die Tooling-Maschine ist,
die LD akzeptieren soll und ich sage,
das Wort W3 ist nicht drin und hier sage ich,
es ist drin, habe ich irgendwie ein Problem.
Ja, und bei null genau das Gleiche. Also wenn
meine richtige Tooling-Maschine M4 wäre oder die Tooling-Maschine für LD,
wenn das gerade M4 wäre, dann würde ich hier behaupten,
wie 4 ist da nicht drin oder das wüsste ich hier.
Und hier sage ich, aber es soll drin sein, Widerspruch.
Also angeblich genau der Stelle wird es dann knallen.
Das ist die Idee. Also man nummeriert alle Wörter durch,
man nummeriert alle Tooling-Maschinen, die es gibt durch
Und dann kann man eben sagen,
das pausendste Wort ist genau dann in der Sprache drin,
wenn es eben nicht von M1000 akzeptiert wird.
So definiert man sich einfach die Sprache. Und dann kann man
sagen, naja, wenn ich mir das so definiere,
dann klappt das eben nicht.
Dann kann ich keine Touring-Maschine haben, die genau diese Sprache akzeptiert.
Ausgeführt. Da steht nochmal die Idee. Wenn es so
eine Touring-Maschine gäbe, die LD akzeptiert,
dann müsste das ja so ein MJ in der Matrix sein.
Und dann kriege ich gerade einen Widerspruch mit diesem VJ.
Genauer. Angenommen, LD wäre aufzählbar. Dann gibt es
so eine Touring-Maschine aus der Aufzählung,
die eben gerade die Sprache akzeptiert.
Also hier L von MJ
gleich LD
Müsste es dann ja geben. Im 1 und 2,
im 3 und so, seine Durchnummerierung aller Touring-Maschinen,
wenn ich sage, LD ist aufzählbar, da muss irgendeiner davon leben,
gerade dafür zuständig sein, LD zu akzeptieren.
Also vielleicht sogar mehrere, aber einer auf jeden Fall.
Da muss also irgendwie so eine geben, MJ, die das tut.
Und wenn ich mir jetzt gerade das Wort WJ angucke,
dann muss ja entweder gelten, entweder ist es NLD drin oder nicht.
Mehr Möglichkeiten gibt es ja nicht für ein Wort.
Entweder in der Sprache drin sein oder nicht.
Und beide Fälle führen eben zum Widerspruch. Wenn ich sage,
angenommen ist es drin, angenommen es ist in LD drin,
das Wort, dann ist es nach der Definition der Sprache LD,
wenn WJ in LD drin ist,
dann ist WJ eben gerade nicht in L von MJ
Nach der Definition. Jetzt habe ich aber gerade hier ja gesagt,
so MJ ist die Touring-Maschine, die LD akzeptiert.
Also kann ich da, wo LMJ steht, auch LD hinschreiben,
das bedeutet, wie J ist nicht in LD.
Da bin ich also ausgegangen von WJ in LD
und bin da hingekommen zu WJ ist nicht in LD.
Das kann irgendwie nicht passen. Ich bin ein Widerspruch. Und andersrum genauso,
wenn ich sage, im Fall WJ ist nicht in der LD drin,
dann ist eben nach der Annahme,
dass LD das gleiche ist wie LMJ, dann kann ich da,
wo LD steht,
auch LMJ hinschreiben,
ist WJ also nicht in LMJ drin
Und dann bedeutet das aber, wenn WJ nicht in LMJ drin ist,
dann muss es gerade in LD drin sein.
Dann bin ich irgendwie, also wie gehört, in LD,
da bin ich also ausgegangen von WJ nicht in LD und
bin zu WJ in LD gekommen, ist auch ein Widerspruch.
Also beide Fälle, die sein können für uns im Widerspruch, kann also nicht sein.
Man muss die Annahme irgendwo falsch sein und die einzige Annahme,
die wir gemacht haben, ist hier oben,
LD wäre aufzählbar, dann ist die also nicht mal aufzählbar.
Das ist der Beweis. Und diese Diagonalisierungstechnik,
also sich irgendwie zu überlegen, dass ich zwei Dinge habe,
die ich irgendwie in der Matrix anordnen kann und jetzt gucke ich mir die Diagonale an,
sowas tritt man, tritt halt an eins, zwei,
drei,
vier Stellen immer mal wieder auf.
Deswegen ist die Beweisideee ganz,
ganz spannend
Ansonsten so aus implementorischer Sicht interessiert man sich wahrscheinlich für die Sprache jetzt nicht so,
aber um zu sehen,
dass es eben auch noch jenseits von RE Dinge gibt,
ist die ganz illustrativ, dass man sieht, oh,
es gibt sogar Sprachen, die nicht mal mehr von der Touring-Maschine akzeptiert werden können.
Okay, also Halteproblem nicht. Entscheidbar, aber noch aufzählbar,
LD nicht mal mehr aufzählbar. Und wenn man es ganz genau nehmen will,
die könnte man noch abzählen,
also man könnte noch so eine Bieraktion machen von den natürlichen Zahlen auf LD,
Und das ist bei so einer auch weiter,
dann ist man aufzählbar, dann abzählbar.
Und dann kommt man noch aus abzählbar raus,
wenn man zum Beispiel die reellen Zahlen nimmt.
Und dann hat man die ganze Kette.
Jo. Da haben wir
die ganze Hierarchie jetzt
Achso, das ist übrigens immer, das ist ein bisschen das Lupi,
das ist so hier auch NBON gemeint, ist die Menge,
die A hoch NB hoch enthält für jedes Ende aus den natürlichen Zahlen.
Aber so als Kurznotation, um sich einmal kurz bewusst zu machen,
ja, diese Sprache, so ist das okay,
aber es geht ja nicht um das Wort A,
hoch NB hoch N für ein spezielles N,
sondern es geht halt um die Menge,
die alle auch NB hochenden für beliebige natürliche Zahlen enthält.
Deswegen da an der Stelle mal kurz ein
bisschen kurze Notation gewählt. Aber um sich zu merken,
welche Sprachen da so drin sind und nicht mehr da drunter liegen,
ist das ganz hilfreich
Fragen, ja. Ja, habe ich ja definiert.
Da sind all die Worte drin,
die eben all die Worte wie 1 wie 2 wie 3,
die eben dann nicht von den Touring-Maschinen, M1,
M2 und 3 akzeptiert werden.
Das ist schon total okay. Das ist ja,
eine Sprache ist ja nur eine Teilmenge von Sigmar Stern.
Das ist sie. Gibt nur kein Automatenmodell,
das die Sprache akzeptiert.
Naja, wenn du, nehmen wir an,
M1 ist die Touring-Maschine, die gerade A, Stern akzeptiert.
So, naja, nehmen wir ein lieber B-Stern.
Nehmen wir eine Mainz, ist die Tourmaschine, die B-Stern akzeptiert.
Und dein erstes Wort, wie eins ist das Wort A. Naja,
A wird nicht von der Touring-Maschine akzeptiert,
die eben in B-Stern, die B-Stern akzeptiert.
Also wäre das Wort da drin. Es kommt halt sehr davon,
es hängt halt sehr davon ab, wie du jetzt durchnummerierst.
Also wo du sagst, was deine erste, zweite,
dritte, vierte Touring-Maschine ist und was dein erstes,
zweite, dritte, viertes Wort ist.
Davon hängt es halt sehr ab. Aber im Endeffekt,
wenn du dich da festgelegt hast, wie deine Nummerierung ist,
dann kommt da halt eine Sprache raus.
Und die Sprache ist halt nicht aufzählbar
Was sonst noch? Und am besten legt man sich noch
auf ein Alphabet fest, dass man irgendwie sagt,
ich will nur mit Nullen und Einsen arbeiten oder so,
also jede Kodierung der Tourmaschine ist irgendwas aus Nullen und Einsen und so,
dann wird das halt eindeutig.
Aber braucht man nicht mal zwingend, also der Beweis zeigt,
dass das egal, wie du das festlegst,
das ist immer nicht aufzügbar.
Noch Fragen. Okay
Dann das zweite Ziel für heute, noch für weitere Probleme zeigen, dass die unentscheidbar sind.
Also bisher haben wir ja gesehen, eins ist unentscheidbar,
haben wir mit so einem Widerspruchsbeweis gemacht, der irgendwie so ein Paradoxon hergeleitet,
gesehen, okay, das kann dann irgendwie nicht sein.
Und das macht mir jetzt nicht jedes Mal von Neuem so,
also versucht nicht jedes Mal wieder so einen Widerspruch zu erzeugen,
also einen Widerspruch versucht man schon zu erzeugen,
aber halt nicht so ein Paradoxon,
sondern man geht jetzt immer aus von einer Sprache,
von der man schon weiß, dass die unentscheidbar ist.
Also folgendes will man machen. Wenn ich jetzt
eine neue Sprache habe und ich vermute irgendwie,
die könnte unentscheidbar sein und ich will das zeigen,
dann gehe ich wie folgt vor.
Ich nehme an,
die wäre entscheidbar
Angenommen, L wäre entscheidbar. Dann ist M irgendwie eine
Touring-Maschine, die L entscheidet. So ähnlich wie Pumpinglämmer angenommen,
die Sprache wäre regulär, dann gilt das Pumpinglämmer.
Hier sage ich, angenommen, die Sprache wäre entscheidbar,
dann muss es ja irgendwie eine Touring-Maschine geben, die die Sprache entscheidet.
Und damit versuche ich dann halt einen Widerspruch zu erzeugen.
Ich benutze jetzt diese Touring-Maschine M, mache mit der irgendwie Konstruktion,
also rufe die irgendwie auf, rufe die vielleicht mehrfach auf,
drehe das Ergebnis um oder auch nicht,
so alles mögliche und kann machen, was ich will.
Wichtig ist, dass die einzelnen Schritte dann okay sind.
Also die eine Annahme habe ich und alles,
was dann kommt, das müssen irgendwie Umformungen sein,
die funktionieren
Und damit muss ich dann etwas basteln,
eine neue Touri-Maschine, die plötzlich ein Problem entscheidet,
von dem ich schon weiß, dass es unentscheidbar ist.
Also bisher haben wir nur eins, wenn ich nachher mehrere
habe, dann kann ich mir irgendeins davon aussuchen.
Und dann habe ich halt einen Widerspruch, wenn ich ein Problem,
von dem ich schon weiß, dass es unentscheidbar ist,
plötzlich sage, hui, jetzt habe ich einen Algorithmus dafür,
unter der Annahme, dass dieses neue Problem entscheidbar ist.
Dann habe ich einen Widerspruch, den kann die Annahme nicht stimmen,
also kann es diese angenommene Touring-Maschine, DEL entscheidet,
nicht geben.
Also kann L nicht
entscheidbar sein
Nennt man eine Reduktion, werden wir später auch nochmal sehen,
bei NP-Vollständigkeit den Begriff. Man sagt halt,
man hat das unentscheidbare Problem auf das neue Problem reduziert.
Warum das genaue Reduktion heißt, sehen wir nochmal bei NP-Vollständigkeit.
Aber jetzt erstmal hier so eine Verfahren,
ich kriege eine neue Sprache, ich will zeigen,
dass die unentscheidbar ist. Angenommen, die wäre entscheidbar,
dann gibt es eine Touring-Maschine, die die Sprache entscheidet.
Dann Bastel, Bastel, Bastel, Bastel, Bastel.
Oh, ich habe eine neue Touring-Maschine,
die entscheidet jetzt plötzlich dieses Problem, von dem ich schon weiß,
dass es unentscheidbar ist.
Das kann es nicht geben, Widerspruch
In der Doku zu einer Java-Funktion steht irgendwie drin, wenn du mich aufrufst,
liefere ich das und das zurück mit denen und den Eingabewerten.
Ihr Bastelbastel bastelt und ihr kommt irgendwann,
also ihr ruft die Methode nur auf, ihr guckt da nicht genau rein,
ihr Bastelbastel bastelt und dann denkt man merkte, hey,
das, was hier jetzt angeblich passieren sollte,
das kann gar nicht sein.
Ihr wisst ja auch, diese Library-Funktion da,
von der irgendjemand behauptet gerade, die würde sowas und sowas machen,
die kann es gar nicht geben.
Also da macht er intern dann irgendeinen Unsinn.
Beispiele dafür. Lass es das eigentliche Halteproblem gegeben,
eine Touring-Maschine und ein Wort wie, also als Eingabe,
so ein String,
bestehen doch Touring-Maschine und Wort weh
Frage jetzt, hält die Touring-Maschine auf dem Wort?
Nicht entscheidbar. Das ist die Aussage,
was wir bisher ja hatten, das Akzeptanzproblem.
Die sind halt sehr, sehr, sehr ähnlich.
Deswegen bietet sich das als Einstieg ganz gut an.
Nicht entscheidbar. Angenommen, das wäre entscheidbar. Dann gibt es eine Touring-Maschine,
der kann nicht M und W vorlegen und die entscheidet für mich,
hält an oder nicht.
Wenn ich sowas habe, also ich habe jetzt eine Touring-Maschine,
das Problem entscheidet, wie könnte ich jetzt
das Akzeptanzproblem entscheiden
Akzeptanzproblem gegeben, eine Touring-Maschine und ein Wort akzeptiert MW.
Es gibt ja nur die Fälle, sie hält an und akzeptiert,
sie hält an und lehnt ab, sie hält nicht an.
Wenn sie nicht anhält, dann akzeptiert sie auch nie.
Kann man sich zumindest so basteln, dass man sagt,
ich klotze aus allen Endzuständen alle Kanten weg,
dann weiß ich, wenn die im Endzustand geht und akzeptiert,
dann hält die auch an.
Wenn ihr jetzt entscheiden könnt, ob eine Touring-Maschine anhält,
wie könnte jetzt das Halteproblem,
wie könnte das Akzeptanzproblem lösen
Ja. Genau. Also ich starte einmal die Turing-Maschine für dieses Halteproblem und wenn die mir sagt,
das hält da gar nicht drauf an,
dann starte ich gar nicht erst die Simulation, dann weiß ich auch,
es akzeptiert nicht. Und wenn die mir sagt,
ja, ja, das hält auf dem Wort an,
dann sage ich, oh, das ist ja cool,
starte meine Simulation und mir wurde ja gerade zugesichert,
die hält irgendwann an, also starte ich die Simulation,
warte, bis die fertig ist und wenn da rauskommt,
ja, ich will akzeptieren,
dann sage ich, ja und wenn da rauskommt,
nee,
ich will nicht akzeptieren,
sage ich nein
Da habe ich plötzlich das Akzeptanzproblem entschieden. Ich weiß aber
, das ist unentscheidbar. Also kann man eine Annahme,
das Einzige, was ich hier gemacht habe,
was irgendwie unerlaubt wäre, ist ja, dass ich angenommen habe,
oh, das Ding ist entscheidbar, hier dieses Halteproblem.
Dann klappt das nicht. Also angenommen, halte Problem wäre entscheidbar,
sei Haar, so eine Touring-Maschine, die das entscheidet.
Dann bauen wir eine neue Touring-Maschine, die jetzt plötzlich dieses
Problem Akzeptanz, also TMAC, Unternutzung von Haar entscheidet.
Da wir aber schon wissen, dass das nicht entscheidbar ist,
muss halt die Annahme falsch sein und dann ist halt auch
Tee halt nicht entscheidbar.
Was macht die jetzt?
Also diese Touring-Maschine S
Es arbeitet, wie folgt. Ich rufe erst mal Haar auf mit dieser Eingabe
MW. Und dann bleibt Paya auf jeden Fall stehen.
Haar entscheidet ja dieses Problem und sagt mir dann, ja,
M hält auf weh oder nee, M hält nicht auf weh.
Lehnt Haar ab, lehnen wir ab. Weil wenn Haar
stehen bleibt, wenn Haar ablehnt, wenn Haar ablehnt,
dann heißt das ja, M hält nicht auf weh.
Wenn M nicht auf weh hält, kannst du auch nicht akzeptieren.
Akzeptiert Haar, dann wissen wir erst mal nur,
M hält auf weh. Wir wissen aber nicht,
ob es auch akzeptiert wird. Aber wenn wir wissen,
dass es hält, dann können wir es ja simulieren.
Dann können wir M mit W
einfach starten
Ja. Und wenn M akzeptiert, dann akzeptieren wir und sonst lehnen wir ab. Und dann haben wir das. Jetzt muss man sich noch so einmal kurz vielleicht ein bisschen Gedanken machen,
dass man sagt, naja, es könnte ja sein,
dass das eine Touring-Maschine ist, die auch bei einer Eingabe,
die sie akzeptiert, nicht anhält,
also wo sie aus dem Endzustand wieder rausgehen kann und weiter Dinge tut und so,
dann sagt man halt nach vorneweg,
naja gut, dann lese ich,
gucke ich mir einmal M an und ich weiß ja,
was die Endzustände ist, also wenn ich die mir angucke,
sehe ich,
was die Endzustände sind und dann haue ich da nochmal alle Kanten,
die aus den Endzuständen rausführen,
die nehme ich wieder weg.
Das ist ja okay
Als Umform und erst dann lege ich MW eben irgendwie vor, dann kann ich das machen. Und jetzt muss ich mir halt nochmal,
das ist ja eh mündlich so ein bisschen eingeflossen,
muss ich nochmal sorgfältig argumentieren,
hält meine Touring-Maschine S tatsächlich immer, ja, tut sie,
weil Haar eben immer hält und sowas und weil,
wenn Haar akzeptiert, weiß ich,
ich kann M auf W simulieren und das hält auch und so,
also es hält immer, erster wichtiger Punkt,
zweiter wichtiger Punkt ist es auch tatsächlich so,
dass sie in den richtigen Fällen Ja und Nein sagt,
tut sie auch,
haben wir eben auch mündlich einfließen lassen und dann weiß man eben,
ah, okay, hält immer, sagt richtig Ja oder Nein,
also entscheidet S dieses Problem TM Ack,
da wissen wir aber,
das ist nicht entscheidbar,
also kann die Annahme nicht stimmen
Nur nur das nochmal, kommt auch gleich nochmal in so einer
roten Folie zur Nachbereitung. Nicht nur das ist der Beweis,
sondern eben auch das, was noch mündlich einfließt,
dass man nochmal ein bisschen argumentiert, okay,
diese Turing-Maschine S, die hält tatsächlich immer, sagt richtig,
ja, sagt richtig nein.
Um das hier genau zur Nachbereitung einmal kurz
Nächstes Beispiel, komplexer, TM Print 0,
das ist die Sprache, die enthält all die Kodierung von Turing-Maschinen,
die auf dem leeren Band gestartet,
also eine Turing-Maschine auf dem leeren Band gestartet,
soll die irgendwann mal null ausgeben.
Das Problem ist quasi gegebene Java-Methode, gibt diese Java-Methode,
die hat keine Argumente,
gibt diese Java-Methode irgendwann mal null aus, ja oder nein?
Kann ich das? Kann ich einen Algorithmus schreiben,
dem ich Java-Methoden vorlegen kann und der mir dann entscheidet,
diese Java-Methode gibt mal null aus,
diese Java-Methode gibt nicht null aus
Auch das ist nicht entscheidbar, soll in den Präsenzaufgaben einmal gemacht werden.
Kann man sich auch überlegen, so angenommen,
es gibt eine Touring-Maschine, die dieses Problem entscheidet.
Wie kann ich jetzt was rumbasteln, sodass sie sich
eine Touring-Maschine habe, die plötzlich das Halteproblem entscheidet?
Also wie kann ich das ausnutzen? Eine Touring-Maschine,
die nur das entscheidet, um etwas zu bauen, was das Halteproblem entscheidet.
Und damit ihr noch einmal im größeren Beispiel grob sehen könnt,
wie das funktioniert, nehmen wir nochmal das Usless State-Problem.
Da sagen wir, wir haben eine Touring-Maschine und ein
nutzloser Zustand in der Touring-Maschine
Ist ein Zustand, der wird bei keinem Eingabewort betreten.
Das ist schwieriger, das zu entscheiden, als jetzt zum Beispiel bei DFAs.
Wenn ihr wollt, könnt ihr euch mal überlegen,
wie kann ich bei DFAs nutzlose Zustände rauskriegen?
Was hat da relativ einfach? Das sind quasi die,
die nicht in der initialen Zusammenhangskomponente sind.
Also bestimme ich irgendwie die initiale Zusammenhangskomponente, sprich alles,
was ich vom Staatszustand aus erreichen kann und die,
die ich gar nicht erreichen kann, naja,
die sind irgendwie nutzlos, weil da komme ich halt nicht hin.
Und das ist hier bei der Turing-Maschine,
ist das sehr viel komplexer, das Problem,
weil ich halt durch die ganzen Kanten und die Kopfbewegungen
so gar nicht so genau weiß,
komme ich da jetzt dann wirklich nicht hin oder so,
muss ich
ständig simulieren
Wir sehen auch gleich, dass das Problem eben auch unentscheidbar ist.
Also nutzloser Zustände der Naturing-Maschine, ein Zustand,
der bei keinem Eingabewort jemals betreten wird.
Und das Usless Date-Problem ist jetzt die Frage, gegebene Touring-Maschine,
äh Quatsch, Eingabe, Touring-Maschine A, Zustand,
Q ist Q, ein nutzloser Zustand von A. Ja oder nein?
Und auch da, aufzählbar ist es, ich nehme dieses Eingabe-Toupel A.Q,
jetzt nehme ich die einstelligen Eingabeworte und lege die A vor und gucke mal,
was da passiert.
Dann nehme ich die zweistelligen, die dreistelligen, die vierstelligen und
so weiter. Und wenn ich da irgendwann merke,
oh, da eine Zustand wird nie besucht,
dann kann ich das mal ausgeben.
Naja, oder eigentlich andersrum. Ich kann ausgeben,
welche Zustände nicht nutzlos sind.
Das kann ich machen
Das ist, glaube ich, nicht mal mehr aufzählbar hier.
Das ist unentscheidbar. Angenommen Usley State wäre entscheidbar,
AUS soll eine Toolmaschine sein, die das Problem entscheidet.
Wir wollen damit
das Halteproblem entscheiden
Musik Musik Die Props. Warte. Achso,
du willst jetzt aufs Akzeptanzproblem zurückführen, ne?
Ja. Da, da, da, da,
da, da, warte. Also du kriegst als Eingabe
eine Turing-Maschine und ein Wort
Ja, aber du willst wissen, ob dieses eine Wort akzeptiert wird und
du fragst jetzt gerade, ob alle Zustände nutzlos sind.
Also alle Endzustände. Und das matcht ja noch nicht.
Das matcht fast aber noch nicht richtig,
weil wenn die alle nutzlos sind,
dann akzeptierst du ganz bestimmt auch nicht weh,
aber es wäre durchaus möglich,
dass du nicht akzeptierst und trotzdem etlich von den Zuständen durchaus nicht nutzlos sind.
Genau, halb. Ist auch schon fast da.
Ich glaube, das könnte man sogar so fixen noch
Mal davon abgesehen, du bist dann bei TM-Akzeptanz und da TM Halt,
aber ist ja, also kann man ja noch rumwurksen.
Ihr könnt ja, die Idee ist quasi, ja,
baut man noch neben, ja, man baut quasi noch neben ein,
ne, die Idee ist, ich kann ja vorgelegt,
also ich kriege als Eingabe M&W, so für dieses Akzeptanzproblem,
ne, und ich soll ja entscheiden, akzeptiert MW,
ja oder nein.
Jetzt baue ich mir eine Touring-Maschine,
die macht folgendes,
die simuliert MFW
Sonst macht die erst mal nichts. Simuliert M auf weh. Und wenn MFW anhält,
also und das kann ich ja algorithmisch machen,
also ich kann algorithmisch eine Touring-Maschine bauen,
die M auf weh simuliert und sonst erst mal nichts tut.
Und wenn M auf weh anhält,
dann geht diese simulierende Touring-Maschine noch in so einen speziellen Zustand.
Z-Neu. Nur dann. Weil die simuliert, dumm,
die dumm, die dumm, wenn die irgendwann anhält,
sagt sie, ah cool, die hat angehalten,
ich gehe ins Set neu.
Wenn die nicht anhält, diese Touringmaschine,
die sie da simuliert,
Leute simuliert sich
das Ding eben
immer weiter
Insbesondere geht sie da nie in diesen Zustand Z neu. Das heißt,
wenn M auf W anhält, gehe ich in Z neu,
wenn M auf W nicht anhält, gehe ich nicht in Z neu.
Jetzt mache ich das noch so, weil das soll dir eine Touring-Maschine sein,
die soll also irgendwas mit ihrem Eingabeband ja auch machen.
Da sage ich, Eingabeband ignoriere ich komplett.
Mir ist eigentlich völlig egal, was auf dem Eingabeband steht.
Ich lösche das, ich simuliere M auf W,
wenn M auf W anhält, gehe ich in Set Noi,
wenn M nicht auf W anhält, gehe ich nicht in Set Noi.
Das führt dazu, dass sich, egal wie das Eingabewort aussieht,
ich mache ja eh immer das Gleiche, also egal wie das Eingabewort aussieht,
wenn M auf W anhält, SZ neu nicht.
Usless, wenn MFW nicht anhält, ist er nutzlos.
Problem ist, die Turing-Maschine, die simuliert das ja die ganze Zeit.
Also die entscheidet dieses Problem ja gar nicht. Das ist eine Turing-Maschine,
die kriegt, egal was als Eingabe,
und da ist hart reinkodiert, okay, ich simuliere MFW,
wenn er ihm stehen bleibt, gehe ich ins Set neu.
Und die Turing-Maschine, die ich jetzt gerade konstruiert habe,
also die man algorithmisch einfach konstruieren kann,
die führe ich jetzt nicht etwa aus,
sondern die lege ich
dieser Turing-Maschine
AUS vor
Und wenn A-U-S mir jetzt sagt, Z-Neues nutzlos, dann weiß ich,
oh, Z-Neues nutzlos. Das heißt, diese Turing-Maschine,
die ja nichts anderes tut, als M&W zu simulieren,
die akzeptiert, also, oh Gott, Moment,
die, wenn der nutzlos ist, dann akzeptiert MW nicht.
Also, den hält M nicht an auf weh.
Und dann kann ich das sagen. Dann habe ich das entschieden
. Hier wird es ein klein bisschen komplizierter zuerst gemacht.
Zu einer gegebenen Turing-Maschine M mit Zustandsmenge Z und Bandalphabet Gamma
konstruieren wir eine Turing-Maschine im Strich auf die folgende Art und Weise.
Wir bauen da einen neuen Zustand, Z neu ein
Im Strich, neuer Zustand, Z neu. Und jetzt mache ich das folgende,
für jeden Zustand,
in dem ich in M bin und für jedes Symbol,
für das es da keinen Übergang gibt,
dass wir nämlich gerade die Stellen, bei denen M anhält,
wenn ich in einem Zustand bin und ich kann mit dem Symbol da nichts anfangen,
dann halte ich an.
Und für genau diese Möglichkeiten baue ich mir noch einen neuen Übergang ein,
wo ich eigentlich nichts großartig tue,
aber ich gehe halt in diesen neuen Zustand Z neu.
Das führt dazu, dass am Strich genau das Gleiche tut wie M,
nur Wenn M bisher angehalten wäre,
dann kann ich noch diesen Übergang machen nach Z neu.
Führt also dazu, hält M, dann kann er im
Strich auf diesen Übergang machen, dort hält die dann.
M hält also genau dann in irgendeinem Zustand,
wenn M-Strich InZ neu hält. Da also noch mal,
da hast du jetzt quasi das ausgeführt,
wo ich eben einfach nur gesagt habe, naja gut,
ich kann ja eine Touring-Maschine bauen,
die das simuliert und die dann eben sich diesem neuen Zustand Z neu,
da geht sie halt nur rein,
wenn die andere Dinge tut
So, jetzt will ich eine Touring-Maschine bauen,
die mir entscheidet, ob M auf W anhält.
Zu MW kann ich so eine Touring-Maschine im Strichstrich konstruieren,
die löscht bei jeder Eingabe das Band,
konstruiert im Strich und startet wie auf einem Strich.
Dass die Touring-Maschine, die ich eben erzählt habe.
Ich kriege also, bei der Touring-Maschine,
die das Halteproblem entscheiden soll, die kriegt MW,
soll entscheiden, hält M auf W.
Was macht sie? Sie konstruiert am Strich
und dann konstruiert sie noch am Strichstrich
Und er im Strichstrich tut folgendes, Band komplett ignorieren,
wie auf M-Staaten, fertig. Und diese Turing-Maschine im Strichstrich,
die lege ich jetzt dieser Turing-Maschine vor, die das mit
dem nutzlosen Zustand entscheidet. Wenn M auf wie hält,
dann hält er im Strichstrich bei jeder Eingabe ins Z neu,
wenn er ihm nicht hält, dann besucht er am Strichstrich Z9 niemals.
Jetzt kann ich halt die Saturing-Maschine, die das mit dem
nutzlosen Zustand entscheidet, der kann ich halt M-Strichstrich-Z neu vorlegen.
Und wenn ihr halt Ja sagt, wenn ihr sagt,
Z neu ist nutzlos, Ja,
dann bedeutet das M hält nicht auf weh.
Und wenn die sagt, er ist nicht nutzlos,
dann weiß ich M hält auf weh.
Also bei Eingabe MW konstruiere ich diese True-Maschine am Strichstrich,
starte AUS auf genau diesem Tupel.
Und wenn AUS jetzt akzeptiert, dann ist Z-Neu halt nutzloser Zustand.
Und nach dem, was da eben stand,
hält dann M nicht auf weh und wir lehnen ab.
Und wenn AUS ablehnt, dann akzeptieren wir.
Entscheidet das Haltproblem. Wichtig dabei ist, diese ganzen Konstruktionen,
die funktionieren. Also ich kann aus M dieses M-Strich machen
Ich gucke mir M an, gucke mir an,
bei welchen Zuständen gibt es keine Kanten raus.
Dafür mache ich mir eine neue Kante nach Z neu.
Das ist eine Konstruktion, die ich machen kann.
Dann kann ich mir überlegen, okay, das ist mal in einem Strich,
kann ich auch so in einem Strich basteln.
Ja, im Strichstrich tut nichts anderes,
als seine Eingabe zu ignorieren und M auf,
im Strich auf W zu simulieren.
Kann ich auch machen. Das sind einfach Konstruktionssachen, die
gehen. Und dann kann ich einfach dieses Tupel im Strichzeit
neu nehmen und das AOS vorliegen. Und das Ergebnis,
in dem Fall muss ich es noch umdrehen.
Und dann habe ich plötzlich das Halteproblem entschieden
Und auch da wieder, ne, argumentieren, hält die so konstruierte Touring-Maschinen,
hält die immer. Gehen die einzelnen Konstruktionsschritte, ja,
die gehen alle mit endlicher Zeit, hält die jetzt immer,
ja, tut sie insbesondere, weil AOS eben immer terminiert.
Und dann gibt sie immer das richtige Ergebnis aus,
ja, mit dem Zwischenstand von eben tut sie das immer.
Besteht hier dann auch nochmal so konkret, wie wir das hier gemacht haben,
da, so, also das hier, ne,
so konkret mit hier die Zustandsübergänge richtig angeben und so,
so macht man das üblicherweise nicht,
sondern man hält das halt auf so einer Ebene wie das hier steht.
Es reicht, dass sich so eine True-Maschine am Strichstrich konstruiere,
die ihre Eingabe ignoriert und die stets M auf W simuliert.
Dann sagt man, am Strichstrich wechselt irgendwie in diesen neuen Zustand Set neu,
wenn M gerade anhält, auf dem Abstraktionslevel hält man das,
dass man das machen kann, indem man irgendwie kannten,
umdreht oder in dem Fall hinzufügt.
Das ist okay. Und auch da die letzten zweieinhalb Zeilen immer begründen,
dass ihr sagt, okay, diese neue Tool-Maschine hält wirklich immer,
weil, und die sagt an den richtigen Stellen,
ja, weil du, sie sagt an den richtigen Stellen,
nein, weil du,
dass man das immer nochmal aufschreibt,
was sie jetzt so mündlich so ein bisschen einfließt
Okay, so geht das. Und so ähnlich könnt ihr
euch überlegen, das mit diesem Print null zu machen.
Dass man sagt, okay, ich weiß,
ich habe jetzt eine Touring-Maschine, die null ausgibt.
Quatsch. Ich weiß, ich habe eine Touring-Maschine,
die dieses Problem entscheidet, vorgegeben eine Touring-Maschine,
gibt die mal null aus. Wenn die sagen,
okay, angenommen, ich habe so eine,
dann baue ich mir jetzt bei der Eingabe MW eine neue Touring-Maschine,
die ignoriert wie der ihr Eingabeband.
Dann sagt sie, okay, ich simuliere MFW,
wenn MFW anhält, gebe ich null aus, sonst nicht.
Dann gebe ich
nur genau dann null aus,
wenn MFW anhält
So, und dann kann ich diese Touring-Maschine,
die ich jetzt gerade konstruiert habe, die lege ich dann
meiner Touring-Maschine vor, die nach Annahme Print 0 entscheidet.
Wenn die ja sagt, weiß ich, oh,
hier wird null ausgegeben, was bedeutet, dass MFW hält?
Weil nur dann gebe ich ja null aus. Quasi die,
genau die gleiche Idee. Weiß man auch, hält immer,
hält immer, gibt an den richtigen Stellen, ja,
aus, gibt an der richtigen Stelle nein aus, kann also nicht entscheidbar sein.
Das sollt ihr nochmal in den, in den Präsenzaufgaben so ausformulieren.
Aber dass so die Kernidee immer wieder zu sagen, okay,
wenn ich eine dafür habe, dann kann ich mir ja eine,
eine bauen die MFW simuliert und genau null ausgibt,
wenn das wenn die anhält.
Genau, das haben wir jetzt gemacht. Entscheidbar aufzählbar,
dann diese Kette von den Sprachfamilien uns angeguckt, Halteprobleme gesehen,
weitere nicht entscheidbare Probleme kennengelernt und eben jetzt mit dieser Reduktion so eine Technik,
wie man eben für neue Probleme zeigt,
dass die nicht entscheidbar sind.
Das ist schon ziemlich knifflig, weil man irgendwie mit diesen,
man muss halt immer Widersprüche erzeugen, das ist schwierig.
Man muss irgendwie ein Gefühl dafür entwickeln,
mit welchen Sachen man arbeiten darf und was nicht.
Also ich nehme jetzt an, das ist entscheidbar. Okay,
das heißt, es gibt irgendwie so eine Routine,
die ich aufrufen kann und die mir korrekterweise ja oder nein sagt.
Und da drumherum baue ich dann etwas oder damit baue ich dann etwas,
wo ich sage, oh,
jetzt habe ich hier eine Funktion geschrieben,
die ruft das einmal auf und arbeitet mit dem Ergebnis weiter und dann mache ich aber plötzlich Käse.
Dann kann ich plötzlich Dinge tun, von denen ich
schon weiß, dass ich die nicht machen kann.
Das ist so das Programmiersprachliche Äquivalent dazu
Noch Fragen? Kann man, kennst du Satz von Rice
? Liest man nach. Das sagt im Grunde genommen,
dass alles semantisch über Touring Maschinen nicht entscheidbar ist.
Also kannst du all die Fragen sofort mit Ja erschlagen,
aber da wir den nicht explizit machen oder eigentlich einüben wollen,
wie man Probleme so ein bisschen als Unentscheidbar nachweist
Weil wir das einüben wollen, mein Satz hängt gerade,
weil wir das einüben wollen. Genau, weil wir das einüben wollen,
machen wir den Satz von Reisen nicht explizit, so,
aber damit können wir solche Fragen sofort erschlagen.
So, Ausblick, wenn ihr keine Fragen habt, Ausblick.
Was wissen wir jetzt? Wir wissen, es gibt eine Menge entscheidbare Probleme,
also auch für das mit den Unentscheidbaren irgendwie frustrierend ist.
Wir wussten ja vorher auch, es gibt eine Menge entscheidbare Probleme.
Wir wissen leider auch, es gibt wichtige unentscheidbare Probleme und
jetzt kann man zwei Richtung so weiterverfolgen.
Einmal, nur zu wissen, dass ein Problem entscheidbar ist,
ist für Praxisanwendungen meistens nicht ausreichend. Ich will meistens auch wissen,
kann ich das schnell lösen oder wie schnell kann ich das lösen,
beziehungsweise wie viel Platz braucht das?
Platz ist heutzutage mit ganz vielen Anwendungen so ein bisschen in Vergessenheit geraten,
aber zum Beispiel so in der Bioinformatik oder sowas ist das
immer noch ein ganz wichtiges Thema.
Wenn ich riesige Datenmengen habe oder so,
kann ich nicht so verschwenderisch mit meinem Platz umgehen.
Also wenn ich irgendwie Endzahlen sortieren will und ich sage,
ach naja, nehme ich halt so einen Algorithmus,
der Endquadrat viel Platz braucht oder so,
dann ist das für ziemlich viele bioinformatische Anwendungen
nicht akzeptabel
Man nehme für Ende einen sehr, sehr großen Wert,
dann wird Endquadrat noch sehr, sehr viel größer.
Das ist hässlich. Sprich, was für einen wichtig ist,
ist, ich kann das Problem nicht nur entscheiden, sondern was sind die Kosten?
Wie lange brauche ich und wie viel Platz beziehungsweise Speicher brauche ich?
Das machen wir zum Ende der Veranstaltung noch und vor allem
kommt das dann nächstes Semester in diesem Algorithmen und Datenstrukturenmodul,
weil man dann eben auch wieder sagen kann, okay,
wenn ich jetzt das Problem schneller oder nicht so schnell lösen kann,
kann ich da auch wieder Grenzen haben, wo ich merke,
oh, dieses Problem ist für mich zwar wichtig,
aber es gibt gar keine Möglichkeit,
das schnell zu lösen
Also entscheidbar und unentscheidbar ist, so eine sehr drastische Grenze,
dass man sagt, dieses Problem lässt sich überhaupt nicht lösen,
sagt man als Informatiker, kann man gleich aufgeben.
Und dann gibt es halt noch diese Grenze, wo man sagt,
dieses Problem kann ich zwar lösen, aber es dauert zu lange.
Und dieses zu lange ist natürlich jetzt relativ variabel.
Also wenn ihr eine Datenbankanfrage stellt und die dauert irgendwie zehn Sekunden,
dann sagt ihr vielleicht noch, hey, okay,
wenn ihr eine Anfrage an Google stellt,
was im Grunde genommen auch eine Datenbankanfrage ist,
stellt euch mal vor, irgendeine Google-Anfrage würde zehn Sekunden dauern.
Ich glaube, dann wäre das Unternehmen nicht so abgegangen.
Wie es das so getan hat. Da ist dann halt wichtig,
wie Also was ist das Setting, wie viel Zeit darf ich benötigen?
Und es gibt halt Probleme, wo man nachweisen kann,
dass es einfach zu lange dauert, egal mit welcher Brille
man da jetzt raufguckt, um diese Probleme zu lösen.
Beziehungsweise, man kann es nicht so genau zeigen,
aber man kann es mit relativ großer Sicherheit sagen.
Das machen wir in den letzten vier Veranstaltungen nochmal und dann
eben in A und D. Und eine andere Richtung,
die man verfolgen kann, ist die,
wenn man nicht jetzt vom Problem weiß, dass es unentscheidbar ist,
also ganz aufgeben will ich dann ja nicht.
Also die Probleme sind ja durchaus sehr relevant,
also gerade diese ganzen Sachen,
die so mit Verifikation zu tun haben,
Sicherheitsaspekte und so,
da möchte ich eigentlich schon ran
Und die unentscheidbar bedeutet nur, das allgemeine Problem ist unentscheidbar.
Also gegebene Touring-Maschine und ein Wort hält die da drauf, ja oder nein?
Das ist unentscheidbar. Aber wenn ich jetzt eine spezielle Touring-Maschine habe,
äquivalent dazu, ein spezielles Java-Programm und ich möchte wissen,
ob dieses spezielle Java-Programm und diese spezielle Funktion da drin, terminiert die.
Da kann ich versuchen, Techniken für entwickeln, damit ich damit arbeiten kann.
Das Problem ist nur, dieses Unentscheidbarkeitsresultat sagt mir,
algorithmisch werde ich da nicht viel machen können.
Also ich werde das nicht so angehen können,
dass ich sagen kann,
so wie halt ein Compiler mit jedem Java-Programm klarkommt und das kompilieren kann,
werde ich nicht etwas semantisches machen können,
das mit jedem Java-Programm einfach per Knopfdruck sagt,
ja,
gib immer null aus
Das werde ich nicht machen können. Was ich aber machen kann,
ist, ich kann versuchen, Techniken zu entwickeln und Hilfestellungen,
damit Leute mit ihrem speziellen Java-Programm kommen können und sagen können,
okay, dieses Ding, was muss ich jetzt tun,
wie muss ich vorgehen, um zu zeigen, dass das immer null ausgibt?
Und das Unentscheidbarkeitsresultat sagt aber eben, das wird nicht algorithmisch,
also es wird nicht irgendwie so ein Verfahren geben,
wo ich sage, ah ja, okay,
dann rechne ich jetzt so, jetzt mache ich das,
jetzt mache ich das, jetzt mache ich das,
jetzt bin ich fertig, weil das wäre ein Algorithmus,
sondern das sagt mir quasi,
für jedes Ding muss man von neuem wieder Gehirnschmalz reinstecken und sich von neuem wieder zu überlegen,
was sind hier so die wichtigen Aspekte,
wie kann ich das machen?
Also es läuft darauf hinaus,
dass man für jedes Programm dann händisch zeigen muss,
sprich beweisen muss,
terminier das,
gibt das null aus solchen Geschichten
Auf sowas läuft das dann hinaus. Genau, die zwei Richtungen können verfolgen,
das untere Macht machen wir jetzt in FG1 nicht mehr.
Das sind so Themengebiete, wo es dann zum Beispiel um Verifikation richtig geht.
Genau, was wir noch machen wollen nach den Pfingstferien,
Aussagenlogik und Prädikatenlogik. Aussagenlogik, Sintax-Semantik,
was ist das eigentlich, was darf ich schreiben,
was ist die Bedeutung und dann so Begriffe wie Normalform und Resolution.
Resolution ist so ein Verfahren,
für das man irgendwie für Formeln zeigen kann,
sind die wahr oder nicht
Dann machen wir noch ein bisschen Predikatenlogik und dann in den letzten zwei Wochen,
also bei den letzten vier Terminen, machen wir,
da schließen wir das dann so ein bisschen,
da nehme quasi den Ball von hier wieder auf und zeigen dann,
gehen rein in die Komplexitätstheorie.
Und er schließt sich da ganz lustig,
weil es eben aus der Aussagenlogik Probleme gibt,
für die man dann eben gerade so untere Laufzeitschranken zeigen kann.
Genau, und für den Logikteil, wer da schon mal reingucken möchte,
das wird auf diesem Buch Logik für Informatiker basieren, von Uwe Schöning.
Ja, da könnt ihr schon mal,
wenn ihr so einen Fünfjährigen Zeit habt oder so,
kann man sich schon mal einen guten Start holen und
irgendwie die ersten 20 Seiten schon mal gelesen haben,
so über Sintax und Semantik da
Jo. Gut. Fragen. Dann machen wir noch,
habe ich noch Zeit? Ja, dann wollte ich einmal ganz kurz
eine Wiederholung mit euch machen von den letzten, ersten,
zwölf Vorlesungen. Was haben wir eigentlich gemacht? Genau,
weil ich euch danach, muss ich euch ja in die Ferien
entlassen und dann nehmen wir da irgendwann nach den Ferien,
wie gesagt, fangen wir da mit Aussagenlogik an.
Da kann man dann also erstmal alles,
was wir so mit Automaten gemacht haben und so für einen Moment vergessen
und fängt nochmal bei Null an und dann kommt halt so Logik,
Logik, Logik, Logik,
Logik,
fünf Wochen lang und dann führt wir die beiden Gebiete so ein bisschen zusammen und sind dann eben bei Komplexitätstheorie und dann ist auch schon das Semester zu Ende.
Was haben wir gemacht? Die Sprachfamilien, haben wir jetzt
schon zu Genüge gesehen, irgendwie die Kette da unten.
Und ich gehe jetzt mal für jede Sprachfamilie immer mit drei Folien durch.
Was waren die Modelle, die wir hatten?
Was waren die wichtigen Begriffe, die wir hatten?
Was waren die wichtigen Verfahren, die wir hatten?
Und wenn ihr bei jedem so das Gefühl habt,
so ja, kenne ich, ist einfach, kenne ich,
ist schwer, aber kenne ich, dann ist alles gut.
Wenn ihr bei irgendwelchen Begriffen das Gefühl habt,
also wenn ihr bei Begriffen das Gefühl habt, ui,
den Begriff sehe ich das erste Mal, dann ist irgendwas schlecht.
Wenn ihr beim Verfahren das Gefühl habt,
das Verfahren finde ich gerade so,
dann wird das ein Ansatzpunkt,
um sich nochmal das Verfahren nochmal anzugucken
Deswegen, wie holen wir das mal? Also,
reguläre Sprachen, die terministische, endliche Automaten haben wir gehabt.
Okay, nicht die terministische haben wir gehabt,
da darf ich aus einem Zustand irgendwie mehrere A-Kanten draus haben.
Dann mehr so ein Exkurs, weil wir gesagt haben,
wir wollen das einfach mal benutzen,
so war diese Geschichte mit NFAs mit Landerkanten, dass man sagt hat,
okay, ich kann da prinzipiell auch Landerkanten einbauen,
sprich Kanten, die ich entlang gehen kann,
ohne im Wort Buchstaben zu lesen.
Dann haben wir noch reguläre und rationale Ausdrücke uns angeguckt und später bei
den kontextfreien Grammatiken diese rechtslinearen Grammatiken, wo man gesagt hat,
links ein Non-Terminal und rechts irgendwie ein Terminalboard,
gefolgt von genau einem Non-Terminal.
Also sowas wie Großal wird abgebildet auf 000001 Großby.
Das ist rechtslinear. Link steht genau ein Non-Terminal.
Rechts steht in dem Wort. Auch genau ein Non-Terminal und
da steht ganz rechts. Rechtslineargrammatiken. Und vor den ganzen
Dingern haben wir gezeigt, die sind alle äquivalent.
Also alles, alle diese vier Modelle beschreiben die regulären Sprachen.
Und womit ihr halt arbeiten solltet, so die Begriffe,
Zustände, Eingabesymbol, Alphabet, die Überführungsfunktion, Übergangsrelation,
Startzustände, Endzustände.
Also das Das sind taktische bei dem endlichen Automaten.
Dann hatten wir diese beiden Begriffe vollständig und initial zusammenhängend, vollständig.
Für jeden Zustand gibt es für jedes Symbol eine Kante raus.
Initial zusammenhängt, jeder Zustand ist vom Staatszustand aus erreichbar.
Ich habe nichts Nutzloses. Auch noch Semantik im Sintax
im Grunde. Bis dahin ist das einfach nur Beschreibung.
Dann für die Semantik, also wie arbeitet der Automat eigentlich?
Begriffe, Konfiguration, Rechnung, akzeptierte Sprache. Und dann
deterministisch nicht deterministisch. Und was ist eigentlich eine Abschlusseigenschaft?
Also Vereinigung zum Beispiel, wenn ich zwei reguläre Sprachen habe,
ist die Vereinigung wieder regulär,
das von Abschlusseigenschaften
Das waren die Begriffe, die sollten einem alle was sagen,
also vier Modelle, dann die ganzen Begriffe. Und ach so,
und bei den Begriffen eigentlich auch noch das zu der Grammatik,
aber das kommt gleich bei den kontextfreien Grammatiken.
Also wenn man hier beim unteren Punkt rechtslineare Grammatiken hat,
da gehören natürlich noch diese ganzen begrifflichen Produktionen und so dazu,
aber das kommt gleich bei den Grammatiken.
Genau, die Technik und Verfahren, die wir hatten,
wir geben eine Sprache, konstruieren sie einen Automaten und zeigen sie,
dass der tatsächlich diese Sprache akzeptiert.
Üblicherweise, indem man eben zwei Richtungen irgendwie zeigt,
elf von Arsenal Timing, von Amiston Timing von 11 von A, fertig.
Das haben wir gemacht,
dann Techniken zu konstruieren vom Automaten und dann Potenziautomatenkonstruktion ausführen,
aus dem NFA ein DFA machen, verschiedene Konstruktionen um Abschlusseigenschaften zu zeigen,
vor allem eben zum Beispiel so Produktautomat oder der automatische Kompliment akzeptiert,
solche Sachen.
Und dann Pumpinglemmer der regulären Sprachen, um eben aus der Sprachfamilie jetzt rauszukommen.
Dann kommt man aus Reck raus und geht nach Kontext frei.
Und das Anwenden, also Technikverfahren soll bedeuten,
die Sachen solltet ihr ausführen können.
Also ihr solltet ein Potenziautomat machen können,
ihr solltet ein Produktautomaten machen können, ihr solltet zu einer Sprache wie A
hoch NB hoch N zeigen können mit dem Pumpinglemmer,
dass sie nicht regulär ist. Ihr solltet mit den Techniken,
die wir zum Konstruieren vom Automaten hatten,
für einfache Sprachen einen Automaten bauen können und zeigen können,
dass der eben tatsächlich
die Sprache akzeptiert
Kontext frei, da haben wir die kontextfreien Grammatiken kennengelernt und deswegen eingeklammert. Wir haben den gesehen,
wir haben den nicht explizit behandelt so richtig,
aber so den nicht die terministischen Kellerautomaten,
dass man weiß einfach, okay, der gehört,
der nicht die terministische Kellerautomat erfasst, die Familie der kontextfreien Sprachen.
Es ist einfach schön, das zu wissen,
wenn man sich mal mit anderen Informatikern unterhält,
dass man sagt, ja, ja, kenne ich.
Begriffe bei Grammatiken, Non-Terminale, terminale Produktion, Staatssymbol,
ist wieder die Sintax quasi,
was steckt alles in der Definition drin und dann für die Samantik,
Ableitung, sprich,
was darf ich tun und dann eben die erzeugte oder generierte Sprache
Achso, und dann gab es als Begriff noch Lamderproduktion,
lamnderfrei, also das ist,
wenn ich keine Lamderproduktion habe, ist die Grammatik lamnderfrei.
Und da unten wieder eingegeklammert Begriffe zum PDA, wenn man jetzt,
also zum Kellerautomaten, im Grunde genommen wie beim DFA und NFA,
man hatte zusätzlich noch das Kellersymbol und so, aber wie gesagt, eingeklammert.
Und die Verfahren, die wir da hatten,
auch wieder Techniken zum Konstruieren von der Grammatik, diese Idee irgendwie,
dass ich links und rechts gleichmäßig wachsen kann oder dass ich irgendwie linear wachsen kann.
Und eben beweist dann wieder, dass eine Grammatikensprache generiert,
so die zwei Sachen
Und dann, ähnlich wie eben,
Herstellung der Chomsky-Normalformen mit so ein, zwei Techniken als Unterpunkte,
Technik zum Reduzieren oder auch die Technik zum Ermitteln,
ob Lamda von der Sprache, von der Grammatik generiert wird oder nicht.
Ja, Konstruktion für Abschlusseigenschaften und Pumpinglämmer, um aus der
Make aus der Familie, der kontextfreien Sprache wieder rauszukommen.
Und zum PDA, also zum Kellerautomaten,
könnte man jetzt noch, wenn man die Zeit hätte,
dann behandelt man Kellerautomaten auch noch ausführlich und dann käme da eben noch sowas dazu,
wie Techniken zum Konstruieren von Kellerautomaten und Methoden,
um das zu beweisen,
dass der jetzt das Richtige tut.
Das würde man
dann noch dazu nehmen
Da ist man auch aus der Sprachfamilie raus und dann landet bei den Entscheidbaren und Aufzählbahnen.
Da habe ich jetzt nicht mehr explizit unterschieden zwischen aufzubauenden Scheiper.
Da sieht man jetzt die Modelle, die die aufzählbaren Sprachen erfassen.
Und wenn man dann eben sagt, naja, okay,
davon nehme ich mir eins und sage, das soll jetzt immer anhalten,
dann bin ich eben bei den Entscheidbaren Sprachen.
Das waren so die, die wir da hatten, insbesondere eben deterministische Touring-Maschine und nicht deterministische Touring-Maschine. Das mit den Bändern und so,
das ist nur, dass man sagt, okay,
das beeile ich im Hinterkopf,
weil wenn man die Touring-Maschine auf so einer gewissen Abstraktionsebene beschreibt,
dann arbeitet man im Grunde genommen eh immer so,
dass man sagt, ja, ja,
das schreibe ich mir jetzt irgendwo hin,
weil man das halt implizit irgendwie gemeint,
auf irgendein spezielles Band oder auf einem Band irgendwo an
der richtigen Stelle oder so
Ja, Begriffe, das erste im Grunde genommen,
erstes, zweitens, drittens im Grunde genommen,
so wie beim DFA die ganzen Begriffe, Zustände brauche ich,
Konfigurationen brauche ich, Rechnung, Erfolgsrechnung, akzeptierte Sprache,
das ist alles so wie beim DFA, halt aufwendiger,
aber die Begriffe sind die gleichen.
Und dann führe ich mir Turing berechenbar ein, sprich,
dass ich nicht nur Sprachen akzeptiere,
sondern dass ich auch Funktionen berechnen kann und eben diese
beiden Begriffe aufzählbar und entscheidbar damit arbeiten können
Und das waren dann die Verfahren, die wir da hatten. Touring-Maschinen konstruieren,
die eine Sprache akzeptieren tun, wir möchten konstruieren,
die eine Funktion berechnen, Touring-Maschinen konstruieren, die eine Sprache entscheiden,
also noch dafür sorgen, dass ich sie nicht nur akzeptiere,
sondern dass ich auch immer stehen bleibe.
Konstruktion für Abschlusseigenschaften, das, was wir vorher nochmal so andiskutiert haben,
wobei da halt prinzipiell am spannendsten ist,
dass man sich vergegenwärtigt bei Aufzählbar,
brauche ich häufig so Sachen, dass ich sie abwechselnd ausführe,
so die Technik kann man mal so im Hintergrund im Hinterkopf behalten.
Und dann eben heute beweisen,
dass ein Problem unentscheidbar ist.
Das war es da
Ja, das waren die drei, vier Sprachfamilien, also entscheidbar aufzählbar,
ja eigentlich unterschiedliche Sprachfamilien hier über den gleichen Folien behandelt.
Und jetzt haben wir ein paar Sachen geskippt,
zum Beispiel halt PDAs, ne, da mal so,
was wir so geskippt haben,
also so Kellerautomaten haben wir nur so angetatscht, ne,
dass man mal so grob weiß, was das ist.
Dann gäbe es da auch ein deterministisches Modell und bei Kellerautomaten passiert eben folgendes,
dass das deterministische und das nicht deterministische eben nicht äquivalent ist.
Deswegen hat man da nochmal eine Sprachfamilie,
die hängt dann sogar aber komplett quer, also die enthält einiges von Reck,
aber nicht alles und einiges von kontextfrei, aber nicht alles.
Deswegen sind die ganz interessant, aber so Kellerautomaten,
die terministische Kellerautomaten Das haben wir geskippt.
Und was man sich jetzt noch angucken könnte,
wer sich mal gefragt hat, warum wir Typ 0,
Typ 2 und Typ 3 Grammatiken haben und wo denn jetzt
die Typ 1 Grammatiken hin sind,
die sind hier bei den Kontextsensitiven.
Man kann noch Grammatiken einführen, die kontextsensitiv genannt werden und
die erfassen dann gerade diese Sprachfamilie CS hier.
Und die ist dann halt zwischen kontextfrei und entscheidbar.
Und dann habt ihr halt die ganze sogenannte Chompsky-Hierarchie nach Noham Chompsky.
Reck Typ 3, kontextfrei Typ 2,
Kontextsensitiv Typ 1, aufzählbar da.
Und die linear beschränkten Automaten, das ist quasi das Automatenmodell für CS.
Das sind Touring-Maschinen, die auf ihrem Eingabeband immer nur so
viel Platz benutzen dürfen, wie das Eingabewort lang ist.
Also wenn ich dem Eingabewort der Länge 10 vorlege,
dann dürfen die halt nur die zehn Zellen benutzen.
Kann man ein bisschen anders definieren, wenn man möchte.
Man kann sagen, der linear beschränkte Automat, da flienear
viel Platz benutzen. Also der darf für eine konstante C,
darf der zehnmal Eingabewortlänge benutzen. Wenn C dann irgendwie 15 ist,
dann darf er halt beim Wort der Länge 10 150 Zellen
benutzen und beim Wort der Länge 15 irgendwie 225 oder sowas.
Und dann ist das aber deswegen linear beschränkt.
Also Eingabewortlänge mal ein linearen Faktor
Dass wir das Automatenmodell für kontextsensitive Grammatiken, dann hat man
wieder Grammatiktyp und Automatentyp und der erfasst eben diese Sprachfamilie CS.
Nur, dass ihr mal gehört habt, dass es
für jede dieser Klassen ein Automatenmodell gibt und ein Grammatikmodell.
Und wir haben halt bei allen das Automatenmodell behandelt,
außer bei CF, da haben wir halt primär die Grammatik
behandelt und CS haben wir dann eben komplett geskippt.
Aber was sie halt wissen solltet, das da,
also zuerst haben wir so ein bisschen rausgenommen,
die solltet ihr kennen und halt für jedes Sprachfamilie irgendwie diese Fragen,
die da jetzt noch so stehen irgendwie,
kennt ihr für jedes ein Automatenmodell,
kennt ihr für jedes eine Grammatik, kennt ihr typische Sprachen,
so A-Stern, auch in Bio-Rennen, auch in Bio-Hencehoch-N,
Halteproblem, Sprachen, die in der einen sind,
in der anderen nicht,
kennt ihr euch mit Konstruktionsmethoden aus und kennt die ja unten erwähnt,
halt so die Verfahren, die wir so hatten,
könnte die anwenden.
Potenzautomatproduktautomat, Tomsky Normalfirma stellen, solche Sachen. Und wenn
ihr euch jetzt halt irgendwie bei irgendwas davon unwohl fühlt und
ihr habt in den In den Pfingstviagien ein bisschen Zeit über,
dann kann man halt irgendwie versuchen, das nochmal aufzuholen.
Wenn er sagt, in den Pfingstferien will ich Ferien machen,
dann ist das auch okay,
aber dann müsst ihr euch irgendwie eine mentale Notiz machen,
dass ihr sagt, okay, in irgendeiner Woche nach den Pfingstferien,
wo wir eigentlich im Logikteil machen,
da schaufel ich mir nochmal zehn Stunden frei und gucke mir das,
was mir da fehlt, nochmal genau an.
Oder eben nachher in dem, in der Klausurvorbereitungsphase,
dass man sich da schon mal irgendwie eine Flagge setzt,
um zu wissen, okay, da,
das muss ich mir nochmal angucken.
Gut. Fragen? Gut, daran wünsche ich in drei Tagen
dann schöne Pfingstferien und wir sehen uns in 14 Tagen,
12, 13 Tagen, irgendwie sowas.
Also in zwei Wochen den Montag,
schöne Ferien