1, 2, 3. Letztes Mal. Letztes Mal haben wir
ja Turing-Maschinen eingeführt und uns so verschiedene Modelle angeguckt und sowas.
Und am Ende des Foliensatzes war noch,
also am Ende des letzten Foliensatzes,
da waren noch so die Definitionen drin für Aufzählbarkeit und Entscheidbarkeit.
Wir haben das ja bei der Vorlesung nicht mehr gemacht,
aber wer da schon mal so reingeschnuppert hat, darum soll es heute gehen.
Im Grunde genommen aufzählbar, einfach, das wird die Sprachfamilie sein,
die eben von Turing-Maschinen akzeptiert werden kann.
Also all die Sprachen, die von Turing-Maschinen akzeptiert werden können
, das wird aufzählbar.
Entscheidbar wird dann
so ähnlich sein
Und dann wird es nachher darum gehen, dass einige Probleme
gar nicht entscheidbar sind, also dass die nun unentscheidbar sind.
Das wollen wir heute machen,
also quasi dieses Touring-Maschinen-Thema noch ein bisschen weiter treiben,
indem man jetzt wieder Sprachfamilien einführt und sich anguckt, was da passiert.
Genau. Das und morgen machen wir das auch noch
mal und dann sind ja auch schon Ferien,
können wir uns erst mal erholen.
Also Aufzählbarkeit und Unscheidbarkeit. Erstmal, was wir
letztes Mal gemacht haben,
Turing-Maschinen haben wir eingeführt
Dann haben wir uns angeguckt, dass die Sprachen akzeptieren,
dass die Funktionen berechnen und wie man sowas konstruieren kann und sowas,
haben wir uns angeguckt auf den Aufgabenzetteln.
Dann haben wir Varianten eingeführt und gesehen,
dass die im Grunde genommen alle Äquivalent sind, insbesondere hier,
dass die DTM, die NTM simulieren kann, haben wir uns angeguckt. Genau,
und dann haben wir für diese ganzen Sprachen da Touring-Maschinen gesehen,
in etwas, naja, informaler Schreibweise hier eine A auch NBO-Rennen,
das ist dann die Sprache aller Worte, A,
auch NBO-Rennen mit N-Element aus N,
das wo da Funktionen angegeben sind,
da geht es eben darum,
dass es eine Touring-Maschine gibt,
die diese Funktion berechnet
Das dritte solltet ihr auf dem Aufgabenzettel jetzt machen gerade.
Und das Clique-Problem haben wir uns mal angeguckt für so ein Problem,
wo man nicht die terministische Touring-Maschine bauen kann,
die dann eben relativ schnell arbeitet.
Also das haben wir uns alles letztes Mal angeguckt.
Habt ihr da Fragen zu? Fragen. Gut. Dann,
was wir heute machen wollen, wir wollen jetzt die Aufzählbahnsprachen angucken,
das wird die Sprachfamilie RE sein.
Das ist so ein bisschen historisch gewachsen,
das ist Recurse of Learn New Murble.
Dann die entscheidbaren Sprachen, das ist die Sprachfamilie Rack,
Dann wollen wir uns eben den Zusammenhang angucken zwischen den beiden Sprachfamilien,
die wir schon kennen und den beiden neuen Sprachfamilien,
also wie es da wieder die Timing-Beziehung.
Und dann gucken wir uns mal für jede Sprachfamilie noch mal eine Sprache an,
die da drin ist und dann eben auch eine Sprache,
die da nicht drin ist.
Und dann hat man so schön nachher so eine Kette von Sprachfamilien,
die alle tatsächlich echt ineinander enthalten sind, werden wir dann sehen.
Und dann hat man so Beispielsprachen,
dass man ungefähr weiß, so sehen Sprachen aus,
die da drin liegen und die nicht mehr in der Sprachfamilie
da drunter liegen.
Das ist der Plan für heute
Erste Definition, aufzählbare Sprachen. Das ist noch ganz einfach,
das sieht so ähnlich aus wie beim DFA auch.
Wir nennen so eine Menge rekursiv aufzählbar, genau dann,
wenn eine deterministische Touring-Maschine existiert, die diese Menge eben akzeptiert.
So wie beim DFA auch für die regulären Sprachen.
Da haben wir gesagt, eine Menge ist regulär,
genau dann, wenn DFA existiert, der eben diese Sprache akzeptiert.
Und all diese Familien, die nennen wir eben,
oder die bilden diese Sprachfamilie RE.
Von so definieren. So, jetzt gibt es auch historisch gewachsen,
andere Möglichkeiten, wie man diese Sprachfamilie erfassen kann
Da steckt so in diesem Satz drin, auch so ein Blau gehalten,
weil das nicht ganz so relevant für uns ist,
aber weil man das oft in Büchern findet,
wollte ich das einmal kurz erwähnen.
Man nennt eben so eine Menge, auch rekursiv aufzählbar genau dann,
wenn, entweder ist sie leer oder es gibt so eine
totale berechenbare Funktion von den natürlichen Zahlen auf Sigmar Stern,
die eben gerade die Menge M erfasst.
Dass die eine Möglichkeit, die zweite Möglichkeit ist,
es gibt eine K-Band-Offline-Touring-Maschine, also eine Touring-Maschine mit K-Bändern,
die jedes Wort genau einmal auf ihr Ausgabeband schreibt.
Und die dritte Möglichkeit, das ist die,
die wir hier schon hatten,
also es gibt eine Touring-Maschine,
die die Sprache akzeptiert
Das sind die drei Möglichkeiten, die sind alle Äquivalent zueinander.
Das müsste man dann zeigen. Also jetzt müsste man zeigen,
wenn eins gilt, dann gilt zwei, wenn zwei gilt,
dann geht drei, wenn drei gilt, dann gilt eins,
dann darf man so einen Ringschluss oder weiß man,
die sind alle äquivalent.
Ideen, wie man das macht.
Also wenn ich erstens weiß, will ich zweitens zeigen.
Das geht noch relativ einfach. Wenn ich erstens weiß,
würde ich zweitens zeigen,
wie geht das
Wenn ich erstens weiß, wenn die Menge leer ist,
das ist einfach, dann gibt es auf jeden Fall eine Touring-Maschine,
die die Menge, die jedes Wort der Menge einmal aufs Ausgabeband schreibt,
die macht einfach gar nichts, fertig.
So, wenn die Menge nicht leer ist, spannender Fall,
dann gibt es also so eine totale berechenbare Funktion,
gehe mit dieser Eigenschaft da.
Was wir jetzt machen müssen ist, wir wissen,
es gibt G, wir sollen eine Touring-Maschine bauen, eine Kaband-Offline-Touring-Maschine,
die jedes Wort der Menge genau einmal aufs Ausgabeband schreibt.
Benutzt G, konstruiert die Touring-Maschine,
hat gerade keinen Namen
Was ist denn zum Beispiel G von 1? Jevin, geh von Enden
gleich M ist, ne? Wenn ihr das wisst.
Dann ist G von 1 irgendein Wort aus der Menge M.
Geh von 2 ist auch irgendein Wort aus der Menge M,
geh von 3 auch, geh von 4 auch,
geh von 5 auch, geh von 6 auch und so weiter.
Und ihr wisst, die Funktion ist berechenbar. Das heißt,
es gibt eine Touring-Maschine,
der könnt ihr die Zahl 1 vorlegen und dann berechnet sie euch eben
das Wort G von 1. Könnt ihr auch die Zahl 2 vorlegen,
dann berechnet ihr, ich gehe von 2 und so weiter.
Was ihr hier also einfach macht, Für so eine Carband-Offline-Touring-Maschine ist,
ihr nehmt die Touring-Maschine, die G berechnet,
die nimmt ihr quasi als Subroutine und dann macht ihr euch
noch einen Zähler und dann berechnet ihr zuerst G von 1. Das schreibt ihr aufs Ausgabeband.
Dann berechnet ihr G von 2, schreibt ihr das Ausgabeband,
berechnet ihr G von 3, schreibt ihr aus Ausgabeband und immer so weiter.
Dann schreibt ihr die alle nacheinander drauf. Einziges Problem,
die Funktion G hier, das könnte sein,
dass ihr sowas habt, wie das G von 3,
das gleiche ist, WG von 5 oder sowas.
Also dass mehrere Wörter das gleiche Urbild haben. Naja,
dann macht man das halt nicht so,
dass man die gleich aufs Ausgabeband schreibt,
sondern dass man die sich erstmal immer alle auf so
ein Arbeitsband schreibt und dann berechnet man einen neuen Wert,
jetzt berechnet man irgendwie G von 5,
dann guckt man nach,
hat man den schon
Falls ja, macht man weiter mit G von sechs
und falls nein, schreibt man ja aus Ausgabeband.
Fertig. Also, weiß ich nicht, viele. Von 2 zu 3,
wenn ihr wisst, ihr habt eine Kaber- und Offline-Touring-Maschine,
die jedes Wort der Menge genau einmal auf die Ausgabeband schreibt.
Und ihr wollt jetzt eine normale Touring-Maschine basteln, die M akzeptiert.
Kriegt also ein Wort W vorgelegt und ihr müsst jetzt akzeptieren,
wenn das Wort tatsächlich in M drin ist und sonst ablehnen.
Und jetzt könnt ihr das bei zweitens als so
Routine benutzen.
Was kann man
da machen
Genau, im Grunde genommen, ja, ne,
also ich kann einfach die Carbon-Touring-Maschine hier,
die kann ich ja durch eine DTM mit einem Band simulieren und so,
dann lasse ich, dann mache ich das,
lasse mir alles aufs Ausgabeband schreiben, ne,
und dann gucke ich, ob da irgendwann mal mein Wort dabei ist.
Was ich halt nicht machen kann,
ist alles sofort aufs Ausgabeband zu schreiben,
weil es sind eventuell endlich viele Wörter,
also lasse ich mir immer eins aus Ausgabeband schreiben und dann Gucke ich,
ob das mein Wort ist, falls ja akzeptiere ich,
falls nein, lasse ich mir das nächste Haus Band schreiben.
Gucke ich wieder, entweder klappt es oder nicht und so weiter.
Passiert auch nicht viel. Und von drittens zu erstens,
das ist ein bisschen knifflig, da habe ich eine Touring-Maschine,
die die Sprache akzeptiert und ich will zeigen,
dass es dann so eine total berechenbare Funktion G hier gibt.
Genau, also ich weiß, es gibt eine Touring-Maschine dafür
und das hier will ich zeigen. Und jetzt,
wenn M leer ist, dann bin ich sofort fertig,
also brauche ich nur zeigen,
wenn M nicht leer ist,
dann gibt es so eine totale berechenbare Funktion
Ideen. Das ist knifflig. M ist nicht leer,
also M ist nicht leer und ich habe eine Touring-Maschine,
die M akzeptiert und jetzt würde ich zeigen,
dann gibt es so eine totale berechenbare Funktion hier.
So grob von der Idee, wenn ihr zeigen wollt,
dass es so eine totale berechenbare Funktion gibt,
müsst ihr halt zeigen, dass es eine Touring-Maschine gibt,
der ihr Zahlen vorlegen könnt und die irgendwann die ganze Menge M erwischt mit diesen Zahlen.
Und das macht ihr einfach, indem ihr sagt,
wenn ich da irgendeine Zahl vorlege, von ihr aus 1000,
dann legt die los, betrachtet erstmal alle Wörter der Länge 1.
Dann alle Wörter der Länge 2, alle Wörter der Länge 3,
alle Wörter der Länge 4 und so weiter.
Und die legt die alle immer wieder dieser Touring-Maschine A vor.
Und immer, wenn die mal akzeptiert, sagt sie,
ah, das ist das erste Wort, was akzeptiert wird.
Das ist das zweite, das dritte, das vierte,
bis die eng kommen beim tausendsten Wort angekommen ist.
Und dann sagt sie, ah ja, das ist mein
Bild unter 1000 von G. Das gibt sie dann aus,
dann hat man das auch.
Und dann hat man so einen Ringschluss, da hat man gezeigt,
wenn erstens gilt, gilt zweitens, mit zweitens gilt gilt drittens,
mit drittens gilt gilt erstens,
also sind die alle drei Äquivalent.
Okay, das, damit ihr ein Gefühl dafür kriegt,
könnt ihr euch zu Hause ja nochmal überlegen,
wie man von den einzelnen Punkten auf jeweils die anderen kommt.
Gibt ganz gut ein Gefühl dafür, wie man irgendwie mit Touri-Maschinen argumentiert oder auch mit Algorithmen argumentiert.
Was wir uns dabei primär merken wollen,
ist diese Definition da oben, dass wir sagen,
rekursiv aufzählbar, wenn es so eine DTM gibt,
die die Sprache akzeptiert. Und da drunter,
damit man sich jetzt wirklich ins Gedächtnis prügelt, nochmal in Rot,
also die wählen jetzt diese Sprachfamilie RE und die blaue Box nur,
damit ihr zuordnen könnt, dass das, was eben war,
eben primär so aus historischen Gründen da stand.
Und ich glaube, heute gar nicht mehr so viel benutzt wird,
also primär benutzt man eigentlich so eine Definition hier, dass man sagt,
rekursiv aufzählbar, wenn es eine Touring-Maschine gibt, die das akzeptiert.
Das ist die eine Sprachfamilie,
das ist aufzählbar
Jetzt kommt entscheidbar. Entscheidbar ist sehr ähnlich mit
so einem kleinen, mit so einer kleinen Änderung.
Da sagt man eine Menge M ist entscheidbar, genau dann,
wenn ein DTMA existiert, die die Sprache akzeptiert.
Das hatten wir eben schon. Und derart,
dass A auf jede Eingabe anhält. Das musste eben nicht
so sein. Bei sie akzeptiert die Sprache,
da muss es ja nur so sein, dass,
wenn sie ein Wort akzeptiert, kommt sie irgendwann mal in Endzustand.
Und da kann man noch sagen, okay,
danach geht sie da nicht mehr raus.
Das heißt, bei solchen Worten halte ich auch an.
Aber bei Worten, die sie nicht akzeptiert, muss sie
das nicht machen. Da muss sie nicht anhalten.
Und dann weiß ich immer nicht, akzeptiere ich das Wort
irgendwann nochmal
Oder will ich das gar nicht akzeptieren,
bin ich in der irgendeiner komischen Endlosschleife?
Und bei entscheidbaren Sprachen will man gerade den Fall rausnehmen.
Das ist also der Fall, der algorithmisch besonders interessant ist.
Also wenn ihr euch nachher in A und D im nächsten Semester,
wenn ihr euch dann mit Algorithmenentwurf beschäftigt, das sind alles entscheidbare Probleme.
Das sind alles Probleme, da kriegt ihr irgendwie eine Eingabe,
dann rechnet ihr rum und ihr produziert entweder ein Ja oder Nein oder halt eine Ausgabe.
Aber wir haben ja gesehen, Ausgaben zu produzieren und Sprachen entscheiden
ist im Grunde genommen das Gleiche. Das sind die Fälle,
die algorithmisch wichtig sind, weil ich dann immer weiß,
mein Programm hält an und gibt mir die korrekte Ausgabe.
Bei dem anderen weiß ich nicht,
ob mein Programm anhält
Also wenn, keine Ahnung, wenn der Fahrkarten kauft bei der Deutschen Bahn,
nur ein aufzählbares Problem wäre, dann wäre das irgendwie doof.
Dann sitze ich da, sage von Hamburg nach Hannover,
möchte ich fahren, dann drücke ich kaufen, dann passiert nichts.
Und dann weiß ich nicht, dauert die Datenbankanfrage gerade nur lange?
Oder kann er da die Strecke nicht berechnen oder was weiß ich?
Ist ihm das irgendwie zu umständlich? Deswegen sind entscheidbare Probleme
besonders relevant. Und deswegen ist es spannend,
nachher zu sagen, wenn Problem nicht entscheidbar ist,
wenn ich von Problemen, die relevant sind,
zeigen kann, die sind nicht entscheidbar,
dann habe ich als Informatik ein ernsthaftes Problem.
Vor allem,
wenn mein Chef gerne möchte,
dass ich das trotzdem implementiere
So, deswegen die Entscheidbaren besonders wichtig. Da gibt es
auch eine Alternative Definition, dass man eben sagt,
eine Menge heißt entscheidbar genau dann, wenn diese charakteristische Funktion berechenbar ist.
Oder eben, wenn eine DTM existiert, die auf jeder Angabe anhält.
Das ist, das zweite hatten wir eben, charakteristische Funktion ist das Neue.
Und die charakteristische Funktion ist eben so definiert,
dass die quasi für jedes Element aus der Menge liefert,
die eins und für jedes Element,
das nicht in der Menge ist, liefert sie dann dementsprechend null.
Deswegen charakteristische Funktion, wenn ihr da ein Wort aus M vorlegt,
sagt, ja, wenn ihr dem Wort das nicht
in MS vorlegt,
sagt die nein
Beweis in dem Fall ist relativ einfach,
wenn ich hier irgendwie so eine Touring-Maschine habe,
die gerade die Sprache akzeptiert und auf jeder Eingabe anhält,
dann mache ich das so wie eben, zähle irgendwie,
ach Quatsch, brauche ich gar nicht.
Um die charakteristische Funktion zu berechnen,
ich kriege dann so ein Wort aus Sigmar Stern,
dann lege ich das A vor und wenn Aja sagt,
gebe ich eins aus und wenn A nein sagt,
gebe ich null aus, fertig.
Und andersrum, wenn die hier berechenbar ist und ich will die Sprache hier entscheiden,
dann lege ich das Wort eben einfach der Touring-Maschine für die
charakteristische Funktion vor und wenn die null ausgibt,
sage ich nein und wenn ich eins ausgib,
sage ich ja.
Also da sind die beiden Richtungen einfach
Ja, und auch da wollen wir uns aber primär eben mit der Definition hier beschäftigen,
dass wir sagen, sie hält auf jede Eingabe.
Wobei man da oft im Sprachgebrauch auch so Sachen sagt wie,
sie sagt, ja,
sie sagt nein oder sie gibt eins aus oder sie gibt
null aus und das ist halt meistens klar,
dass sie akzeptiert oder sie akzeptiert nicht.
Also Touring-Maschinen, die stets anhalten, diese akzeptiert,
die Sprachen, die bilden diese Sprachfamilie weg.
Und auch da nochmal die Bemerkung, dass andere Primär aus
historisch gründen. Also zusammengefasst, Entscheidbarkeit,
Touring-Maschine akzeptiert die Sprache und hält auf jede Eingabe,
Aufzählbarkeit, Touring-Maschine muss nur die Sprache akzeptieren,
muss nicht
zwingend anhalten
Unten steht nochmal das, was ich eben schon erwähnt habe,
also insbesondere bei Worten, die nicht in M sind,
wisst ihr dann immer nicht, also ihr wisst eigentlich nicht,
ob die dann gerade nicht in M sind.
Ihr legt die irgendwie der Touring-Maschine vor,
die arbeitet und irgendwie kommt kein Ergebnis.
Das kann bedeuten, sie braucht noch Zeit,
bis sie das Ergebnis liefert oder es bedeutet,
das Wort ist gar nicht in der Sprache und das weiß man halt nicht.
Das ist doof. Da noch einmal. Und wenn man
sich die beiden Definitionen anguckt, hier sollen sie stets anhalten,
also bei Reck kommt zusätzlich noch hinzu, stets anzuhalten.
Das heißt, das wird eine Timing-Menge sein. Reck ist
eine Timing von RE. Was man noch nicht weiß,
ist, ob es auch eine echte ist
Aber bis dahin weiß man das schon mal. Und dann kann man
sich gleich noch Gedanken darüber machen, wo Reck und CF liegen.
Okay, soweit mitgekommen? Anhalten heißt einfach anhalten,
also dass es keinen Übergang mehr gibt, den sie machen kann.
Technisch kann man das ganz gut so machen,
dass man sagt, naja, wenn sie im Endzustand anhält,
dann, also ich kann das ja immer so bauen,
dass ich genau einen Endzustand habe und genau einen Error-Zustand und immer wenn sie normalerweise im Endzustand landen würde,
dann gehe ich jetzt noch in meinen speziellen einzigen Endzustand,
wo sie dann nicht mehr rausgeht,
dann weiß ich,
da ist sie
Und in allen anderen Zuständen, wo sie normalerweise blockieren würde,
dann gibt es halt zum Beispiel keine Kante für,
ich lese A oder so.
Da gehe ich dann in meinen Error-Zustand. Dann weiß ich halt,
entweder landet sie da, das heißt,
alles ist gut oder sie landet da, das heißt,
alles ist doof.
Aber anhalten bedeutet halt einfach, ich kann nicht mehr weiterrechnen.
Sonst noch? Das ist gerade irrelevant,
können wir daher nochmal machen, das ist irrelevant gerade.
Okay. Dann noch einmal ganz kurz als Exkurs,
weil wir die Grammatik ja hatten,
wenn man diese Grammatiken nimmt, die am aller,
allerwenigsten eingeschränkt sind, wo man also gesagt hat,
auf der linken Seite der Grammatik möchte ich einfach nur einen Non-Terminal haben und alles andere ist mir egal.
Und auf der rechten Seite völlig beliebig. Das waren ja die
am wenigsten eingeschränkten Grammatiken und die haben ja nachher eingeschränkt zu Kontext freien.
Wenn man diese Grammatiken nimmt, dann erfasst man auch gerade diese Sprachfamilie RE.
Also die mächtigste Sprachfamilie, die wir so kennenlernen werden. Achso,
als Exkurs sind Typen null Grammatiken, kann man sich überlegen,
R-E-Typ null, kontextfrei Typ 2, regulär Typ 3,
fehlt vielleicht noch irgendwie Typ 1 dazwischen,
aber das sind so die Grammatiken da.
Das einmal kurz als Exkurs. Gut,
wenn ihr keine Fragen mehr habt,
dann erste Frage,
sind alle regulären Sprachen entscheidbar
. Und bei 1,
2 oder 3
, warum
Mehrheit siegt, warum ist ja richtig? Also wie würde man das machen?
Warum sind die entscheidbar? Dann müsstet ihr ja jetzt,
gegeben, eine reguläre Sprache, müsstet ihr jetzt eine Touring-Maschine bauen,
die auf jeder Eingabe anhält und richtig ja oder nein sagt.
Wenn das Wort drin ist, sagt sie ja,
wenn das Wort nicht drin ist, sagt sie nein,
das muss zu jeder regulären Sprache gehen.
Wie? 34 Leute haben ja gesagt und keiner weiß warum
. Kann doch nicht sein. Warten, warte, ne
Genau, das reicht heute. Einfach antworten,
wenn die Sprache regulär ist, dann gibt es ein DFA,
mitnehmen wir von mir aus noch ein Vollständiger, aber ist eigentlich auch egal,
gibt es ein DFA und den kann ich ja von der Touring-Maschine simulieren lassen.
Also den codiere ich mir hart in die Touring-Maschine rein und dann kann ich das Wort,
das ich jetzt akzeptieren will oder nicht,
das kriege ich die Touring-Maschine vorgelegt,
dann arbeitet sie halt ab,
was so im DFA passiert und wenn die da im Endzustand ist,
akzeptiert sie und wenn der DFAMN-Zustand ist,
dann akzeptiert die Touring-Maschine und wenn nicht,
dann eben nicht
Also da ist relativ einfach, sind alle entscheidbar, ja.
Ich kann im Grunde genommen DFA simulieren und bin fertig.
Ähnliche Frage für die Kontextreihen
sind die entscheidbar
. . . .
Nehmen wir mal an, das wäre nicht entscheidbar.
Wenn ihr Programmiersprachen, die Sintax von Programmiersprachen,
die wird üblicherweise über eine kontextfreie Grammatik definiert.
Oder auch die Sintax von irgendwelchen geklammerten Ausdrücken,
hier 3 plus 4 mal 5 und sowas,
all diese ganzen Sintax-Geschichten kann man über kontextfreie Grammatiken definieren.
Wenn das Problem nicht entscheidbar wäre,
dann würde das bedeuten, ein Compiler könnte nicht feststellen,
ob das Programm gerade sind, taktisch korrekt ist oder nicht.
Das wäre eine ziemliche Vollkatastrophe,
wenn das nicht entscheidbar wäre,
ist glücklicherweise entscheidbar
Also, ne, weil die Frage dann,
ob das Programm sind, taktisch korrekt ist oder nicht,
ist eben die Frage,
ist dieses Wort in der von LG generierten Sprache drin oder nicht?
Und wenn ich die Frage nicht entscheiden kann, dann kann ich das nicht feststellen.
Die 26 Leute, die ja gedrückt haben, warum?
Was kann man denn so machen? Ja. Er sagt,
weil man Kellerautomaten wieder mit der Turing-Maschine simulieren kann, ja,
aber der hat nur einen endlich großen Keller und ist nicht deterministisch.
Das kann schon hässlich werden. Und wir haben nicht gesehen,
dass wir dir nicht die Terminismus durch Determinismus auflösen können.
Das heißt, es frage ich,
ob das funktioniert
Geht auch tatsächlich nicht. Also man kann die nicht deterministischen Kellerautomaten
nicht durch den deterministischen simulieren. Also vielleicht geht es,
aber nicht so einfach. Da müsste dann schon, also die Frage,
wie man dann quasi alle Rechnungen durchspielt, ist schwierig.
Noch eine Idee? Man kann irgendwie versuchen,
mit der Grammatik zu arbeiten, wenn ich weiß,
die Sprache ist kontextfrei, dann gibt es eine Grammatik,
die die Sprache generiert.
Und jetzt kann ich mir überlegen,
okay, dann male ich halt alle Ableitungen bis zu einer
gewissen Länge auf
Da habe ich aber das Problem bei einer normalen Kontext freien Grammatik,
mit diesen ganzen dusseligen Landerproduktionen, da weiß ich nicht,
bis zu welcher Länge ich generieren soll,
wenn ich ein Wort der Länge zehn vorgelegt kriege und entscheiden soll,
ist das in der Sprache oder nicht,
dann muss ich unter Umständen ein Wort,
der eine Satzform der Länge 100 generieren und dann jede Menge Symbole rauslöschen,
bis ich zu meinen Wort der Länge zehn gekommen bin.
Das heißt, ich habe mich so richtig so eine Grenze,
wo ich sagen kann,
ich brauche nur alle Ableitung der Länge,
500 testen oder irgendwie sowas,
das ist doof,
was mache ich da
Genau. Champsky Normalform ist für jede Cointisfreiheit gemeint, gibt es
eine Champsky Normalform. Das heißt, ich gehe einfach davon aus,
diese kontextfreie Sprache ist durch eine Grammatik in Champsky Normalform gegeben.
Dann teste ich einmal kurz diesen Sonderfall mit dem Lamda.
Und danach weiß ich, die haben ja immer nur spezielle Produktionen. A nach B,
C oder Großaner Klein A. Das heißt,
mit jeder Produktion, die ich anwende,
wenn die dann nicht zum Terminalzeichen geht,
wächst diese Satzform um 1. Und dann gibt es nur endlich viele Kombinationen,
die ich durchprobieren muss, um auf Wörter der Länge hinzukommen.
Und dann bin ich fertig. Das sollt ihr
in den Aufgaben einmal ausführen diese Woche.
Also es steht auf einem neuen Aufgabenzettel drauf
Sind alle aufzählbaren Sprachen entscheidbar? Mal gucken,
ob der Nein-Blog jetzt den Jablock überflügelt
Naja, ist tatsächlich nicht so, wissen wir aber noch nicht.
Wir wissen zwar, dass wir bei aufzählbaren Sprachen
mehr Freiheiten haben, ich muss ja nicht immer anhalten.
Damit weiß ich, was auf der vorvorherigen Folie war,
dass das eine Teilmenge ist.
Aber ich weiß noch nicht, ob es eine echte ist.
Da müssen wir gleich nochmal gucken, ob das tatsächlich nicht geht.
Also, dass es tatsächlich Sprachen gibt,
die nicht entscheidbar sind, aber aufzählbar.
Ist tatsächlich so, aber müssen wir dann gleich
uns nochmal angucken.
Nein,
ich habe es geschlossen
Wenn eine Sprache entscheidbar ist, kann ich auch das Kompliment
der Sprache entscheiden. Abschlusseigenschaften. Also bei regulär,
wenn eine Menge regulär ist, ist auch das Kompliment regulär.
Ich tausche im DFA Endzustände und Nicht-Endzustände aus. Bei
kontextfreien Grammatiken hat das nicht funktioniert. Bei Entscheidbaren und Aufzählbaren
, mal gucken.
Entscheidbar geht das
Für die, die erstens gedrückt haben,
wie für die wir die zweitens gedrückt haben, warum nicht?
Genau. Mehrheit gewinnt. Wenn eine Sprache entscheidbar ist,
heißt das, es gibt eine Touring-Maschine, die hält immer an,
bei jedem Eingabewort und sagt, korrekterweise ja oder nein.
Ja, wenn das Wort in der Sprache ist,
nein, wenn das Wort nicht in der Sprache ist,
wenn ich das Kompliment akzeptieren will, Oh, schön.
Er sagt, die Kontextfreien waren ja schon nicht gegenüber Kompliment
abgeschlossen und sind aber eine Teilmenge. Oder eine Teilfamilie.
Dann können die doch jetzt nicht gegenüber Kompliment abgeschlossen sein.
Doch, weil diese ganzen Timing-Argumentationen, die funktionieren alle nicht gut.
Das machen Leute auf, wenn sie sagen irgendwie, auch NB hoch
N ist ja, nee, warte mal,
A-Sterne ist eine Teilmenge von irgendwas anderem und ist regulär,
also muss auch die Übermenge regulär sein oder irgendwie sowas.
Solche Argumentationen, die klappen immer nicht. Hier geht es jetzt darum,
wenn die entscheidbar ist,
also wenn sie in dieser viel größeren Sprachfamilie drin ist,
dann das Kompliment auch wieder entscheidbar, also auch wieder in dieser Fi-Gloristin Sprachfilme drin.
Und das kann ja sein, weil wenn du eine kontextfreie Sprache hast,
dann ist das Kompliment, also kontextfreie Sprache, die ist auch entscheidbar.
Das Kompliment ist jetzt vielleicht nicht Kontext 3,
aber vielleicht ja entscheidbar. Und dann wisst ihr, okay.
Genau, beziehungsweise ich mache einen Schritt mehr.
Genauso wie ihr das auch im Java-Programm macht irgendwie,
ihr kriegt einen Bötchen Wert von irgendeiner Funktion zurück.
Ihr wollt aber nicht den haben, sondern das Gegenteil,
naja, Ausrufezeichen davor, fertig.
Da passiert nicht so viel. Es ist ein Schritt mehr
, hier genau die gleiche Idee.
Ich habe eine Touring-Maschine,
die die Sprache entscheidet
Wenn das Wort drin ist, hält sie an und sagt,
ja, wenn das Wort nicht drin ist,
hält sie an und sagt, nein.
Naja, jetzt kann ich eine Touring-Maschine bauen,
die genau das Gleiche macht,
aber bevor die andere ja sagt,
macht sie lieber noch den einen Schritt und tauscht das ja ein Nein aus und gibt das aus, fertig.
Und beim Nein halt den Schritt machen und ja ausgeben.
Also das klappt. Und letzte Frage, bei dem,
wenn zwei Sprachen L1L2 entscheidbar sind,
ist dann
auch der Schnitt entscheidbar
Also all die Worte, die in L.1 drin sind und in L.2.
Ja, so muss das aussehen, sehr schön.
Wobei 48. Bei einer Anmelderate von 450 Leuten
sind 48 schon
ein bisschen bedenklich
Einfache Lösung, so wie ein Doppel- und irgendwie in der Java-Programmiersprache.
Ich starte dir eine Touring-Maschine für L1, wenn die Ja sagt,
starte ich danach die andere für L2,
wenn die auch Ja sagt, gebe ich insgesamt Ja aus.
Wenn eine von beiden Nein sagt, höre ich auf,
sage ich Nein. Vereinigung geht genauso,
nur dass ich halt nicht nur unten mache, sondern oder,
also ich starte die eine, wenn die Ja sagt,
akzeptiere ich, dann starte und wenn die Nein sagt,
starte ich die zweite, wenn die Ja sagt, akzeptiere ich.
Klappt das mit Aufzählbarn auch? Die Idee von eben,
hintereinander ausführen, ich glaube,
die mit aufzählbar
Ja, ist das schlimm? Weil genau der Fragestellung.
Er hat gerade gesagt, klappt nicht so gut,
weil wir nicht wissen, ob die stoppt, aber ist das schlimm?
Weil, und? Wenn ich die erste starte und
die stoppt nicht, die arbeitet immer weiter.
Dann ist das Wort ja auch nicht im Schnitt drin.
Also ist egal, dass sie immer weiter rechnet.
Dann rechnet halt meine für den Schnitt auch immer weiter.
Beim Schnitt geht es ja darum, es soll in L1
drin sein und es soll in L2 drin sein.
Wenn die Touring-Maschine für L1 also immer weiter rechnet,
und gar nicht akzeptieren will, dann tut deiner das für L1 geschnitten,
L2 jetzt auf, was ja okay ist.
Du willst das Wort ja nicht akzeptieren, die erste akzeptiert
ja schon nicht. Also du müsstest nur dafür sorgen,
dass wenn die irgendwann akzeptiert, dass du dann sagst,
okay, dann hör mal jetzt auf und dann startest du die zweite, dafür musst du sorgen.
Also da klappt es, aber bei der Vereinigung hätte man genau dieses Problem.
Wenn ich da jetzt die Tourenmaschine für L1 starte und dir immer weiter rechnen lasse und die aber irgendwann,
also die in so einer Endlosschleife ist,
dann komme ich nie zu dem Punkt,
dass ich die Tourenmaschine für L2 starte,
die aufzählbaren sind,
aber auch gegenüber Vereinigung abgeschlossen,
gucken wir uns morgen mal an
Also er will, kann ja schon mal ein bisschen Gedankenschmalz heute
Nacht da reinstecken, worum die Aufzählbaren gegenüber Vereinigungen abgeschlossen sind.
Da muss man ein bisschen basteln. So. Ja,
ja, das erste war für regulär, haben wir gesehen.
Das zweite war für kontextfrei. Gucken wir uns genau in
den Hausaufgaben an. Das dritte war,
dass die entscheidbaren eine echte Teilmenge der Aufzählbaren sind,
das sehen wir heute am Ende der Veranstaltung noch genauer.
Und vier und fünf waren eben für die Abschlusseigenschaften.
Begründung, Punkt, Punkt, Punkt,
damit ihr bei der Nachbereitung euch nochmal vergegenwärtigt.
Wie ist denn die Begründung eigentlich? So,
dann zusammengefasst mit diesem Ganzen hier erstens und zweitens,
dass die entscheidbar sind.
Da kommt man jetzt zu so
einer Hierarchie unten
Reck echt in CF enthalten, echt entscheidbar enthalten und zumindest irgendwie in RE enthalten.
Und wir wissen noch nicht, ob das echt ist.
Das machen wir nachher noch. Also Touring-Maschine kann alles,
was ein DFA kann, ich kann auch alles,
was eine kontextfreie Grammatik kann, sehen wir noch.
Außerdem kann ich sowas hier, von dem ich weiß,
dass es nicht kontextfrei ist, auch irgendwie auch in CON,
also habe ich hier dieses echte Timing-Ding zwischen CF und Reck.
Und das, da weiß ich jetzt alles. Jetzt kann man sich so überlegen,
typische Sprachen, die in den einzelnen Sprachfamilien drin sind,
in Reck irgendwie A, Stern, in CFA hoch NB hoch ändern,
das ist dann nicht mehr in Reck drin, Entscheidbar,
A, hoch in Biochen, C,
hoch in und hier müssen wir gleich nochmal gucken,
was wir da irgendwie was finden.
Okay, letzte Frage, wenn eine Sprache aufzählbar ist,
ist dann auch das Kompliment aufzählbar.
Also beim Entscheidenden haben wir ja gesagt, jo,
das klappt, wir drehen das Ergebnis um.
Bei aufzählbar, was klappt das da?
Was meint ihr?
Moment, die funktionieren beide. Die funktionieren bei Aufzählbar
und bei Entscheidbar, also bei Entscheidbar funktionieren alle drei,
bei Aufzählbar funktioniert zumindest Vereinigt und Durchschnitt und vielleicht auch Kompliment.
Das ist jetzt gerade die Frage. Klappen die?
Was meint ihr? Wer ist für ja?
Niemand. Wer ist für nein? War auch niemand,
für einer. Das ist der Vorteil bei diesen Klickern,
da kriegt man zwischendurch irgendwie mehr Ergebnisse.
Was ist denn das, was hindert uns denn daran,
das so zu machen,
wie eben einfach
die Ergebnisse umzudrehen
Ja, zumindest theoretisch. Also dieses mit den Endlosschleifen,
es könnte ja auch sein, dass Reck und,
also entscheidbar und aufziehbar nachher tatsächlich leicht sind,
dann würde das bedeuten,
alle Endlosschleifen kann ich irgendwie detektieren und bin glücklich so,
dass das nicht geht, okay, kann man irgendwie wissen.
Und genau da ist irgendwie das Problem. Was würde denn,
wenn ich eine Sprache habe, ich habe eine Sprache,
die ist aufzählbar und das Kompliment ist auch aufzählbar
Ich habe eine Sprache, L ist aufzählbar, Kompliment von L
ist auch aufzählbar, was weiß ich jetzt über L?
Was kann ich jetzt nämlich machen? Ich weiß,
L ist aufzählbar und Kompliment von L ist auch aufzählbar,
das kann ich jetzt machen. Ja, warum? Nee,
du hast eine Touring-Maschine, die hält bei Jahren Stanzenanlust.
Eine Touring-Maschine hält bei Nine Instanzen an,
jetzt hast du nicht eine Touring-Maschine, die bei beiden anhält.
Da muss man mehr basteln, das kann man machen
Mit zwei Kopfthüringen, Machine, okay, ja,
könnte man sich überlegen, dann müsste ich mir danach überlegen,
wie ich die simuliere, dann kommt das aufs Gleiche hinaus.
Was kann ich machen? Wenn ich, ja,
die Idee ist ja gut, ich habe jetzt eine Turing-Maschine,
die hält bei Jahren Stanzen an und ich habe eine Turing-Maschine,
die hat bei Nein-Instanzen an.
So, ich will aber nur eine Turing-Maschine haben,
ich will nicht zwei haben.
Was kann ich machen
Ja. Ja, aber wie? Ja, genau,
das ist die Frage. Ansonsten war das super.
Aber wie mache ich das? Na,
nehmen wir mal an, du hast jetzt beide, ne?
Also du baust dir jetzt einen großen Kasten,
da tust du die beiden einzelnen Dinger rein.
Und das Blöde ist ja jetzt, du kannst nicht das
Wort nehmen und es beiden vorlegen und beide rechnen lassen.
Und dann gucken wir zuerst Ja sagt. Dafür bräuchtest du
so eine Art Parallelopperator. Das funktioniert irgendwie nicht.
Wie mache ich das sequenziell? Statt es parallel auszuführen,
mache ich was? Wie mache ich mein Parallelprogramm sequenziell
Genau, perfekt. Genau, das ist die ganze Idee.
Ich habe diese beiden Touring-Maschinen und dann lasse ich die erste einen Schritt machen,
dann lasse ich die zweite einen Schritt machen,
denn dass die erste ihren zweiten Schritt machen,
dann lasse ich die zwei,
die ihren zweiten Schritt machen und so weiter.
Also ich lasse sie nicht komplett durchlaufen,
sondern ich lasse sie einen Schritt machen, dann die einen Schritt,
dann die einen Schritt, dann die einen Schritt,
dann die einen Schritt, dann die einen Schritt.
So wie auch irgendwie,
wenn man mehrere Prozesse hat und jeder kommt mal dran,
jeder darf mal ein paar Schritte machen.
Und genauso macht man das auch. Und dann hat man eine Touring-Maschine,
weil jetzt ja eine von beiden muss ja anhalten,
entweder ist ein Wort in Älteren
oder ist ein Kompliment von Älteren
Was dazwischen gibt es ja nicht. Also man muss eine von beiden anhalten,
sobald einer anhält, höre ich auf und sage eben dementsprechend,
ja oder nein? Also ups, also nicht zwingend,
ist eine Sprache entscheidbar oder ein Spaß mit Chiper,
genau dann, wenn L und das Kompliment von L aufzählbar sind,
Richtung von links nach rechts, ist ganz einfach, wenn L entscheidbar ist,
dann ist L auch aufzählbar, wegen der Timing-Beziehung.
Außerdem wissen wir, das Kompliment von L ist entscheidbar,
weil die entscheidbaren Sprachen gegenüber Kompliment abgeschlossen sind und das ist auch das Kompliment von L aufzählbar.
Okay, die Richtung ist einfach, die Rückrichtung,
die spannende Sein A und A quer irgendwie Touring-Maschinen,
die eben L und L quer akzeptieren,
also L und L quer sollen ja jetzt aufzählbar sein.
Und jetzt macht eine Touring-Maschine DL, entscheidet das folgende,
bei Eingabe von W,
die kriegt jetzt ein Wort W und soll entscheiden,
ist das in Älteren, ja oder nein?
Dann lasse ich A einen Schritt machen und dann lasse ich A quer einen Schritt machen.
Und dann wiederhole ich das, bis eine von beiden akzeptiert.
Wenn A akzeptiert hat, akzeptiere ich,
wenn er quer akzeptiert hat, lehne ich ab,
weil wenn A quer akzeptiert, heißt das ja,
das Wort ist in L quer drin,
also im Kompliment von L und damit eben gerade nicht in L.
Und dann habe ich
das gemacht
Also wenn die Aufzählbahnen könnten immer noch gegenüber Kompliment abgeschlossen sein,
nämlich genau dann, wenn entscheidbar und aufziehbar gerade die gleiche Sprachfamilie sind.
Werden wir nachher noch sehen,
dass sie das nicht sind und dann weiß man eben,
okay, die Aufzählbahnen sind nicht gegenüber Kompliment abgeschlossen.
So, das wollen wir jetzt heute und morgen
noch machen.
Habt ihr Fragen bis hierhin
Okay. Dann, was jetzt gleich noch kommt,
ist, jetzt gucken wir uns zum Einüben mehrere Sprachen an,
die entscheidbar sind und überlegen uns immer, wie würde ich die entscheiden?
Das ist im Grunde genommen Algorithmenentwurf, weil die Touring-Maschine kann ja alles,
was ein normaler Algorithmus kann und andersrum, also ist das im Grunde genommen,
wenn jetzt gleich so eine Frage kommt, wie gegeben
DFAA und ein Wort W akzeptiert er das ja oder nein,
das ist alles Algorithmenentwurf, Eingabe ist genau spezifiziert,
Ausgabe ist auch genau spezifiziert, ja oder nein,
ist Algorithmenentwurf für Entscheidungsprobleme.
Das machen wir jetzt und dann,
wenn wir da gleich noch zu kommen,
gucken wir uns ein Problem an,
das aufzählbar ist und zeigen dann,
dass dieses spezielle Problem tatsächlich
nicht entscheidbar ist
Damit fangen wir dann morgen auch wieder an,
dass wir dann genau dieses Problem uns nochmal angucken,
weil der Beweis ein bisschen knifflig ist. Und setzen dann darauf auf,
dass wir uns noch weitere unentscheidbare Probleme angucken und quasi so ein bisschen,
das ist nicht ganz so wichtig, aber so als Exkurs,
dass wir auch mal so eine Sprache sehen,
die nicht mal mehr aufzählbar ist.
Also für die es gar keine Touring-Maschine gibt, wie
die Sprache akzeptiert. Das ist der Plan. Erstsprache,
DFA-Akzeptanz, Eingabe, AW, ASNDFA und akzeptiert weh.
Also ich kriege als Eingabe so einen String und die Behauptung ist,
der vordere Teil des Strings ist ein DFA,
der hintere Teil des Strings ist das Wort weh.
Und die Frage ist, akzeptiert A
dieses Wort
Da nochmal als Anmerkung, dieses mit den eckigen Klammern hier,
das macht man immer, um anzudeuten, eine Kodierung davon.
Also wenn ich ein DFAA habe, dann muss ich den
ja irgendwie so kurdieren, dass die Touring-Maschine damit arbeiten kann.
Und das, was man meistens auch jetzt beim Algorithmen,
also hier beim Entwurf vernachlässigt ist,
normalerweise muss ich einmal über den Stwing rübergehen,
über die Kodierung und gucken, ist das tatsächlich eine richtige Codierung,
ist das denn taktisch korrekt und so weiter.
Das gibt man immer, weil das klar ist,
dass die Tour-Maschine das machen kann,
also solange man da nicht irgendwelche wilden Codierungen benutzt,
klappt das ja immer
Dann ist die Frage eben, kann ich dieses Problem entscheiden?
Ich kriege vorgelegt, also ein DFA und ein Wort
und jetzt soll ich entscheiden, geht das?
Ja oder nein? Haben wir im Grunde genommen vorhin schon gemacht,
als wir gesagt haben, die regulären Sprachen sind entscheidbar.
Das ist genau die gleiche Idee, ne? Hier kriege ich
jetzt zusätzlich auf dem Eingabewand, auf dem Eingabeband diesen DFA vorgelegt. Ja,
was ich jetzt mache, ist,
ich simuliere den DFA auf dem Wort weh und wenn der irgendwann anhält und in einem Endzustand ist,
also wenn das Wort zu Ende gelesen, anders,
wenn das Wort zu Ende gelesen hat und in einem Endzustand ist,
dann akzeptiert die Touringmaschine
Das ist die ganze Idee dann. Also simuliere A mit Eingabe W,
endet diese Simulation im Endzustand, akzeptiert, sonst lehnt man ab.
Später reicht sowas, das so hinzuschreiben bei solchen Problemen,
wenn man das jetzt ein bisschen expliziter machen will,
dann hat man hier noch die ganzen Details, so irgendwie.
AW ist eine sinnvolle Repräsentation,
zum Beispiel Liste der Komponenten von A,
dann in den Listen die einzelnen Elemente und dann überprüft die Tour und Maschine,
erstmal ist das wirklich ein DFA und ist das andere wirklich ein Eingabewort.
Und dann merkt sie sich irgendwie auf ihrem Band,
in welchem Zustand der DFA gerade ist,
Und die aktuelle Position in dem Wort,
also sprich eine Konfiguration merkt sie sich von dem DFA.
Und dann guckt sie immer, ah ja,
wenn ich in dem Zustand bin und dieses Symbol jetzt lese,
was sagt mir da die Übergangsfunktion?
Also was ist Delta von ZX? Beim ZA,
in dem Fall. Und entsprechend wechselt sie den Zustand
und geht bei dem Wort ein Feld weiter nach rechts,
sprich sie aktualisiert die Konfiguration und macht so immer weiter.
Und entweder liest A das Wort zu Ende und ist dann im Endzustand,
dann würde ich akzeptieren oder eben nicht, dann lehne ich ab.
Dann muss man sich nochmal Gedanken machen,
die Touring-Maschine hält bei jeder Eingabe,
gibt immer die korrekte Antwort aus,
Also das Problem relativ einfach. Anderes Problem, ach so.
Genau, das Problem hat ja einfach da noch das,
was ich eben gemeint habe, hier mit den Sintax-Überprüfungen.
Solche Schritte überspringt man. Nächstes Problem für den NFA.
Wie mache ich das denn? Kann ich das
auch entscheiden? Muss ich,
aber wie
Genau. Die Idee ist, darauf zurückzugreifen, was wir so kennen.
Ich kriege diesen NFAA vorgelegt und den implementiere ich in meine Touring-Maschine,
diese Potenzautomatenkonstruktion ein oder macht sie also aus diesem NFAA jetzt irgendwie einen DFA-A-Strich und dann benutze ich die Touring-Maschine,
die mein Problem von eben entschieden hat,
legt er jetzt dieses A-Strich-Komma-W vor, wenn die dann ja sagt,
sage ich auch ja, wenn die nein sagt,
sagt die nein, Alternative wäre
Er meint gerade, ob man so eine komplexe Toury-Maschine nochmal sehen wird,
weil er sich nicht richtig vorstellen kann,
wie die jetzt so ein DFA oder so eine NFA simuliert.
Da versucht man eigentlich gerade drumherum zu kommen,
indem man halt illustriert, wie sie eine Adition macht,
wie sie eine Subtraktion macht und so weiter.
Das funktioniert halt alles gut. Und von dem Rest weiß man
, das kann sie machen. Es gibt auch Leute,
die sich mit sowas beschäftigen, aber das wird halt sehr,
sehr, sehr groß und führt eigentlich zu keinem großartigen Erkenntnisgewinn
Also du weißt ja zum Beispiel,
wenn ich dir den DFA so gebe, dass das jetzt eine lange,
lange Zeichenkette ist mit irgendwie die ganzen Zustände,
dann die ganzen Eingabesymbole, dann die einzelnen Dinge von Delta,
irgendwie so als eigentlich Tabelle,
aber die kommen jetzt halt alle linear hintereinander weg und so weiter.
So, jetzt hast du diese große Eingabe. Jetzt schreibst du dir halt
irgendwie auf ein Arbeitsband, Z-0-W, weil du weißt,
da ist ein Z-0 und hier ist das Wort. So,
und jetzt fängst du an und guckst, ja,
wenn ich hier ein Z-0 bin und das erste Symbol ist ein A,
jetzt gehst du oben, suchst du so lange,
bis du irgendwie deine Tabelle gefunden hast und gehst da an
die richtige Stelle
So, musst du irgendwie eine richtige Trendsymbole einführen und so weiter, findest die Stelle dann.
So, jetzt weißt du, ah ja, okay,
wenn ich in Z0 bin und ein A lese,
dann soll ich einen Zustandswechsel zu Z1 machen.
Jetzt gehst du auf deinem anderen Band, ne,
löscht du dir die Z0 da,
gehst einen weiter in deinem Wort, schreibst da Z1 hin.
So, jetzt guckst du wieder A,
wenn ich in Z1 bin und ich lese jetzt wieder ein A,
jetzt gehst du wieder oben in die Tabelle,
guckst danach und so weiter.
Und das wird aber halt riesig. Und das,
also besonders erhält es das nicht. Deswegen macht man das
eher auf so einem Niveau. Man überlegt sich das für
einige ausgewählte Sachen, wie das so prinzipiell funktioniert.
Und bei dem Rest weiß man dann,
dass man es machen kann, will aber so eine Programmiersprache
nicht benutzen
Was man halt macht, ist, man zeigt,
dass man andere Programmiersprachen damit simulieren kann.
Dann brauche ich nämlich immer nur Sprachkonstrukte zeigen. Da muss ich nur
zeigen, Ifs and Elts kann ich prinzipiell auch damit machen.
Und dass ich in Östern Elts machen kann, weiß ich,
alles gut. Hat er gerade das Handy geklaut?
Nee, okay. Also die und sowas. Oh,
sie geht, nehme ich das Handy. Ich weiß nicht,
dass ich bestimmte Sprachkonstrukte machen kann, sowas wie Zuweisung,
da merke ich mir irgendwie auf dem Band den Wert von der Variablen X.
Und wenn X um eins erhöht wird, höre ich den um eins.
Wenn X irgendwie einen anderen Wert zugewiesen wird,
der irgendwo anders auf dem Band steht, weiß,
kann ich da hinschreiben.
All solche Sachen kann ich machen,
dann weiß ich halt,
die ganzen Basic-Programmkonstrukte kann ich machen
Naja, und dann müsste ich halt quasi all diese kleinen
Programmkonstrukte von der Tour Machine alle hintereinander ballern und zusammenschrauben.
Aber es wird halt groß und unübersichtlich, war nicht so
wirklich viel Spaß. Deswegen macht man das eigentlich nicht.
Hält es also quasi das, was irgendwo hier stand?
Wir beschreiben auf einem gewissen Abstraktionslevel diese Funktionsweise, dass man das so macht.
Okay, Idee hatten wir schon mit der Potenzautomaten-Geschichte.
Man kann das so ähnlich machen, wie eben auch,
sich immer alle Zustände merken, die man so hat und so.
Oder man macht das eben, indem man zu A,
dem Potenzautomaten konstruiert,
dann ist das ein DFA und dann benutzt man die eben konstruierte Touring-Maschine,
um das zu entscheiden,
ob BW eben akzeptiert wird oder nicht
Wichtig dafür, wir wissen, dass die Potenzautomatenkonstruktion korrekt ist und
wir wissen, dass diese Konstruktion quasi ein Algorithmus ist,
der immer mit dem richtigen Ergebnis terminiert.
Wichtiger Punkt. Wenn das nicht immer terminieren würde,
dann könnte ich nicht sagen,
dass ich gerade eine Touring-Maschine gemacht habe, die mein Problem entscheidet,
weil da dieser erste Punkt hier eventuell gar nicht terminiert,
wäre also doof.
Nächster Punkt, die Sprache,
das ist die Sprache aller DFAs, die nichts akzeptieren.
Wie werden die charakterisiert?
Was könnte man
da nachgucken
Was ich halt nicht machen kann, ist,
alle Wörter durchgehen und die Touring-Maschine von eben benutzen.
Weil da brauche ich irgendwie unendlich lange. Selbst wenn das Alphabet nur aus Bs besteht,
dann müsste ich B vorlegen und B, B und 3
Bs und 4 Bs und 5 Bs und 6 Bs,
das führt zu nichts.
Das würde also nicht klappen. Ich will das ja entscheiden
. Idee. Genau. Rückwärts von den Endzuständen ausgucken.
Wenn ich von den Endzuständen irgendwann mal so einen Start zustande erreiche,
alles gut. Oder ich mache so eine Suche,
ich fange beim Startzustand an und gucke mir an,
welche Zustände sind alles erreichbar,
wenn da irgendwann mal so ein Endzustand dabei ist,
das ist super.
Ich ignoriere quasi die ganzen Kantenbeschriftungen und nehme nur die Kanten.
Genauer ausführen könnt ihr das in die Präsenzaufgaben einmal
Dann haben wir den auch, dann wissen wir,
wann so ein DFA-Lehrer ist, wenn die akzeptierte Sprachfunk,
die er war leer ist,
und die noch zwei DFAs, die gleich sind,
also die die gleiche Sprache akzeptieren.
Wie macht ihr das?
Was ist gleicher
Ein Produktautomaten bilden und den überprüfen, was darf da jetzt nicht passieren?
Oder was muss gelten, so formulieren? Nee,
du baust den Produktautomaten, nennen wir den mal A, geschnitten
B, der müsste A geschnitten B gleich A gleich B sein,
also 11 von A geschnitten, B muss gleich LA gleich LB sein,
lass das Problem quasi darauf zurückgeführt, für andere Automaten zu testen,
ob die gleich sind, das hilft noch nicht.
Hilft aber schon fast, Produktautomat ist eine gute Idee.
Wenn ihr euch das als Vendiagramm vorstellt,
dann habt ihr so ein I für A und so
ein I für B und was dann nicht passieren darf,
ist, dass da irgendwo Bereiche sind,
die nicht von dem anderen erfasst werden.
Also die müssen deckungsgleich sein, kriege ich das hin.
Ich muss quasi ausschließen, da kommt wieder das von Ebene
mit leere Menge. Ich muss ausschließen,
dass der Bereich A hat was und B nicht,
der muss leer sein und der Bereich B hat was und A nicht,
der muss auch leer sein.
Da ist es schon fast mit verraten jetzt. Ja,
aber dann hast du die Gleichheit auf die Komplimentgleichheit zurückgeführt,
das reicht noch nicht, aber Kompliment ist auch gut.
Kompliment ist super, Produkt ist super,
kann man
alles gebrauchen
Ja. Was war das erste A-Kompliment? Ja, aber wie kriegst du ohnehin? Ja,
genau, wenn du das ausformulierst, mit Konstruktionen,
die wir hatten, ihr braucht das eigentlich,
was ich eben informal gesagt habe,
das braucht ihr nur in Worte gießen,
der Bereich A und Nicht-B muss leer sein,
also Kompliment von B bilden,
Produkt mit A bilden
Und, vereinigt, der Bereich B und Nicht-A muss auch leer sein.
Also die Dinger hier. Das ist das Gleiche, ne?
A, also alles, was A akzeptiert und nicht B.
Sowas darf es ja irgendwie nicht geben, ne?
A. Etwas, was in A ist und nicht in B
, das würde dieser Gleichheit hier oben widersprechen.
Das darf es nicht geben. Und gleichzeitig darf es auch nichts geben,
was nicht in A ist,
aber in B. Wenn es das beides nicht gibt,
sprich, wenn LC leer ist,
dann weiß ich,
L.A. ist gleich LB
Kann man nochmal genauer ausführen, aber von rechts nach links ist es sehr einfach,
wenn ich weiß, A ist gleich LB,
dann steht hier LA, geschnitten, LA quer,
naja, das ist leer, und LA quer geschnitten,
LA, ist auch leer, vereinigt, leer mit Leervereinig,
das ist immer noch leer, fertig.
Und wenn ich anders weiß, dass LC leer ist,
also dass hier nichts drin ist, dann kann man argumentieren,
dass ein WNAA auch hier drin sein muss,
weil wenn WNAA ist, dann ist es eben nicht in LB,
dann ist es nicht in Nicht-LB,
weil sonst das hier nicht leer wäre.
Also muss es eine B sein. Und Andersrum genauso. Und die ganzen Konstruktionen hier,
Das hier ist der Komplimentautomat, das, also LB Quer,
das ist der Komplimentautomat von B, das ist der Produktautomat,
hier genauso Komplimentautomat von A und Produktautomat und hier nochmal die Vereinigung.
Konnte man auch hinkriegen. Neue Staatszustand, zwei Lambler kannten zu
den einen Staatszuständen fertig. Und dann aus dem NFA&DFA machen und
dann hat man hier einen DFAC und braucht nur testen, ist das leer.
Also konstruierte C, benutze die Touring-Maschine für dieses DFA leer von eben.
Und dann, wenn die akzeptiert, akzeptiere ich es sonst nicht.
So, kommt da noch einer? Ja, die Sprache
, Im Grunde genommen hatten wir die auch schon.
War die Frage, ob kontextfreie Grammatik, ob kontextfreie Sprachen entscheidbar sind.
Das ist die gleiche Frage, so ähnlich wie eben auch
mit dem DFAs entscheidbar und so. Erster Ansatz,
ich gehe durch alle Ableitungen, ich teste ob eine davon vegeneriert,
falls ihr akzeptiere ich sonst nicht. Problem bei dem Ansatz,
hatten wir vorhin schon einmal kurz diskutiert,
dieses durch alle Ableitungen durchgehen, das kann ich nicht gut machen,
weil ich eventuell erstmal eine sehr lange Satzform generieren muss,
bevor ich dann Sachen lösche, was also doof.
Aber es gibt ja so Chomsky-Normalformen,
wenn man mit der Chomsky-Normalform arbeitet,
dann kriegt man das hin
In den Übungsaufgaben sollt ihr zeigen, LG ist entscheidbar und
das kann man halt mit Jumpsky Normalformen machen.
Und wenn ich weiß, LG ist entscheidbar,
dann ist es ganz einfach. Wenn ich weiß,
LG ist entscheidbar, dann gibt es ja eine Touring-Maschine,
die mir bei Vorlage von W sagt, ist
WNRG drin oder nicht. Und dann nehme ich einfach die Touring-Maschine,
die LG entscheidet, lege irgendwie vor und antworte genau wie die.
Dann ist es fertig. Und ihr sollt eben zeigen,
dass man tatsächlich so eine Touring-Maschine zu jedem G generieren konstruieren kann.
So, habe ich noch eine? So,
von ganz vielen Sprachen wissen wir jetzt,
dass sie entscheidbar sind
Na, ich weiß das von Addition,
von sowas wie Akzeptierten, DFA und Wort.
Ich weiß das auch von solchen Geschichten hier gegeben,
Graf und Knoten ist der Knoten erreichbar, ja oder nein?
Das habt ihr mal so in diskrete Mathematik gehabt,
so hier Algorithmus von da extra.
Wichtig ist immer, das sind Algorithmen,
die terminieren bei jeder Eingabe und sagen korrekterweise ja oder nein
Fragen? Okay, was ihr bis hierhin mitnehmen solltet,
ist, wie sind die Aufzählbahnsprachen definiert?
Touring-Maschine akzeptiert die Sprache. Wie sind die entscheidbaren Sprachen definiert
? Touring-Maschine akzeptiert die Sprache und hält immer an.
Die zwei Sachen solltet ihr auf jeden Fall mitnehmen.
Und die dritte, welche Bedeutung die entscheidbaren Sprachen haben,
illustriert durch so etliche Beispiele hier. Und wie man da rangeht,
wenn man jetzt eben für ein Problem erstmal nur zeigen soll,
ist das entscheidbar oder nicht. Im Grunde genommen,
man gibt einen Algorithmus an, der das Problem löst.
Gerne auch erstmal mit Brut Force oder so,
dann weiß man erstmal,
das geht
Über andere Sachen kann man sich später Gedanken machen,
also wie man es effizient löst.
Erstmal geht es nur darum, kann ich es überhaupt lösen?
Dann weiß ich, die Sprache ist entscheidbar. Und was einen
jetzt natürlich irgendwie interessiert ist, gibt es überhaupt relevante Probleme,
die nicht entscheidbar sind? Wenn es das nicht gäbe,
dann braucht man sich über solche Fragestellungen keine Gedanken machen.
Die Sprache, die sieht so ähnlich aus wie das,
was wir eben hatten mit dem DFA und das,
was wir hatten mit einer Grammatik.
Jetzt steht da aber nicht, dass es entscheidbar ist,
sondern hier steht erstmal nur, das ist aufzählbar.
Wie geht das? Fast genauso wie bei DFA
Wie macht ihr das? Er ist eine Touring-Maschine und akzeptiert,
wie es aufzählbar, wie geht das? Wir haben es
beim DFA gemacht, wir haben den DFA simuliert, ne?
Das Schöne war nur beim DFA, wir wussten,
der muss bei jedem Schritt irgendwie einen Buchstaben in diesem Wort weiterlesen,
also muss er irgendwann aufhören.
Entweder blockiert er oder er kommt dann das Ende des Wortes,
zwei Möglichkeiten gibt es nur.
Der geht ja nicht zurück oder irgendwie sowas.
Also weiß ich noch spätestens entschritten, bin ich fertig.
Hier mache ich das ganz genauso. Ich lege diese Touring-Maschine
M das Wort W vor und lasse sie einfach machen.
Sprich, ich simuliere sie einfach. Meine neue Touring-Maschine,
die dieses Problem aufzählen soll, also akzeptieren soll,
die sagt, alles klar, hier ist mein M,
hier ist mein W, starte ich einfach M auf W und gucke, was passiert.
Entweder akzeptiert M irgendwann, dann ist okay, dann akzeptiere ich auch.
Oder ja, oder halt nicht. Dann lasse ich es
halt machen. Das ist im Grunde genommen nichts anderes,
als wenn ihr ein Programm schreiben sollt, wo euch gesagt wird,
das Programm kriegt eine Funktion und die Argumente der Funktionen.
Und die Fragestellung ist, liefert diese Funktion irgendwie Trut zurück,
ja oder nein. Was ihr macht ist,
ihr ruft halt die Funktion mit den Argumenten auf.
Und wenn ihr Trut zurückliefert, liefert ihr ja auch Trut zurück.
Und falls ihr das nicht tut,
dann liefert ihr entweder fort zurück,
dann könnt ihr das auch machen oder die arbeitet halt unendlich lange oder dann arbeitet ihr halt auch unendlich lange.
Ihr simuliert die einfach weiter. Nichts anderes passiert hier gerade
. Einfach MFW zu simulieren. Also simuliere MFW,
wenn einem jemals einen Endzustand erreicht, akzeptieren wir, sonst lehnen wir ab.
Wenn M jetzt irgendwie als nicht-diterministische Turing-Maschine gegeben ist,
dann muss man bei dem Simulieren so ein bisschen aufpassen,
dass man alle Konfigurationen da fasst und so.
Oder man wandelt die halt einmal in die DTM um,
dann ist das Simulieren einfacher
Wichtiger Punkt aber, wenn M hier irgendwie eine Endlosschleife gerät,
dann eben auch die Touring-Maschine, die M simuliert,
die simuliert dann halt immer weiter. Sprich, mit dem Vorgehen hier,
akzeptieren wir diese Sprache, aber entscheiden sie noch nicht.
Warum könnte das relevant sein, die Sprache zu entscheiden?
Wenn ihr euch mit diesem Gedanken anfreundet und der sich so langsam in euren Köpfen zettelt,
dass so eine Touring-Maschine nichts anderes ist als ein Algorithmus,
dann ist die Frage, ob ich diese Sprache entscheiden kann,
das ist die Frage, ob ich ein Programm schreiben kann,
dem ich ein anderes Programm und seine Eingabeparameter vorlegen kann.
Und er sagt mir dann, ja, ist super,
das terminiert oder nein, terminiert nicht.
Ja. Bitte? Ja, da kommen wir gleich hin.
Es ist quasi das Halteproblem. Ja, versteht ihr
die Relevanz? Also das hätte ich gerne. Ich hätte
gerne bei meinem Compiler nicht nur diese Möglichkeit hier kompiliere,
was wir ja meistens irgendwie auch zwischendurch mal kurz als Sintax-Check benutzen.
So hier ist das alles gerade richtig, danke.
Beim Kompilieren passiert aber nichts, als die,
die Sintax, irgendwie eine andere Sintax umzuwandeln.
Ich wandle irgendwie, ja, war Source-Code,
ein Java-Byte-Code um. Da ist gerade nichts Magisches passiert.
Da habe ich
eine Sintaxumwandlung gemacht
Mit wahrscheinlich irgendeinem semantischen Wissen im Hintergrund, aber im Moment
habe ich eine Sinntagsumwandlung gemacht. Was ich auch gerne hätte,
wäre, dass ich sagen kann,
entweder für das ganze Programm oder von mir aus für Ausschnitte des Programms,
hey, ich habe hier gerade eine Methode geschrieben, ich glaube,
die tut folgendes, habe ich mir zumindest dabei gedacht,
als ich die implementiert habe.
Ich gebe dir als Argumente zwei Zahlen und zurück kommt die Summe.
Jetzt möchte ich das gerne spezifizieren, dass ich sage,
das ist wirklich so, drück auf den Knopf und er sagt mir,
ja, ist alles richtig gemacht.
Das hätte ich gerne. Und das hätte ich natürlich gerne
für große Programme. Das hätte ich gerne so,
dass ich sage, hier,
ich habe gerade die Steuerung für die neuen U-Bahn geschrieben,
damit wir keine Zugführer mehr brauchen,
funktioniert das immer oder fährt er manchmal einfach an der Station vorbei.
Staaten, das hätte ich gerne. Solche Fragen möchte ich
entscheiden können
Wenn wir jetzt da hinkommen, dass wir sagen,
ups, das ist aber gar nicht entscheidbar,
ist das eine ziemlich fiese Grenze, ne?
Das ist eine Grenze dafür, semantische Eigenschaften von Programmen automatisch nachweisen zu können.
Jetzt hat das noch keiner von euch in seinem Compiler gesehen.
Da kann man schon vermuten, vielleicht geht das nicht oder ist sehr,
sehr schwierig. Da nochmal die zwei roten Boxen,
um nochmal zu betonen, wie wichtig das ist gleich.
Sollten wir eine Möglichkeit haben, algorithmisch zu entscheiden,
dass M auf wen nicht anhält, dann könnten wir auch anhalten.
Also wenn ich wüsste, Held auf W gar nicht,
hier bei dieser Fragestellung. Wenn ich vorher entscheiden könnte,
hält er eigentlich auf W? Wenn ich dann wüsste,
nee, das passiert gar nicht, dann weiß ich,
ah ja, okay, dann kann ich ablehnen,
dann wird es nämlich wenig akzeptieren.
Und wenn ich weiß, es hält an,
dann kann ich sagen, ah ja, cool,
dann simuliere ich es einmal und wenn es Ja sagt,
sage ich Ja und wenn es Nein sagt, sagt es Nein.
Deswegen so diese Ähnlichkeit zum Halteproblem. Hier ist es eigentlich
das Akzeptanzproblem. Man kann das auch so umformulieren,
dass man hier nicht fragt, akzeptiert die TMW,
sondern hält die Touring-Maschine auf W an,
was im Grunde genommen das gleiche Problem oder sehr, sehr, sehr ähnlich.
Also fall klar, was das Problem ist, ist,
wissen bisher nicht, so, kann ich es algorithmisch lösen,
dieses Problem gegeben, M und ein Wort weh,
hält die Touring-Maschine auf weh an.
Und wir werden jetzt gleich sehen, dass es unentscheidbar ist.
Das heißt, es gibt eben keinen Algorithmus, der das entscheiden kann.
Simulation ist, was Grundverschiedenes zu entscheiden. Simulation ist irgendwie,
ich lasse laufen und gucke mal, was passiert.
Und dann kann das Laufen eben auch ewig lange dauern.
Jetzt kann man irgendwie an Debugger denken und kann denken,
wieso, ich kann auch beim Debugger im Breakpoint setzen und warten,
bis ich da hinkomme.
Wenn ihr aber irgendwie öfter mit dem Debugger gearbeitet habt,
dann wisst ihr, ihr könnt auch mal irgendwo einen Breakpoint setzen,
startet das Ding und irgendwie
passiert aber nichts
Jetzt kann das entweder darin liegen, dass ihr noch nicht bei eurem Breakpoint angekommen seid,
dass das Programm also noch einen Tag rechnen muss, bis es da ist.
Oder es liegt daran, dass ihr da nie hinkommt.
Und bedauerlicherweise wisst ihr das immer nicht. Was man dann in der Praxis natürlich tut,
ist, man hat ja eine gewisse Vorstellung von seinem Programm,
man weiß so Dinge wie, naja,
eigentlich hätte ich schon nach fünf Sekunden bei diesem Breakpoint sein müssen,
also es wurde irgendwas schiefgelaufen.
Also dann weiß man grob, dass irgendwas doof ist.
Aber das ist halt nicht algorithmisch das Problem gerade gelöst.
Das ist irgendwie intuitiv das Problem angegangen. So,
und da wir jetzt tatsächlich zeigen werden,
dass das unentscheidbar ist, dieses Problem,
da nochmal zur Bedeutung, Wenn das Problem unentscheidbar ist,
dann wird nachher folgen, das machen wir dann morgen,
dass ganz viele Probleme,
die eben auch mit semantischen Eigenschaften von Programmen zu tun haben,
dass die alle unentscheidbar sind.
Also sowas wie, ist eine bestimmte Stelle im Programmcode erreichbar.
Gibt das Programm ein bestimmtes Wort aus,
überweist das Programm korrekterweise 500 Euro auf das Konto,
wenn der Kunde das wollte.
All solche semantischen Fragen, alles unentscheidbar.
Okay, die letzte Viertelstunde,
das wird schwierig
Könnt ihr noch noch mal so die letzten Kräfte sammeln, so?
Die letzten Kräfte sammeln und danach essen gehen, nicht jetzt.
Also, wir wollen zeigen, dass das nicht entscheidbar ist.
Das, was jetzt passiert ist, wir führen natürlich einen Widerspruchsbeweis.
Wir nehmen an, das wäre entscheidbar und zeigen dann,
wir kommen zu irgendeinem Widerspruch. Wenn ihr,
wir haben ja jetzt mehrfach betont, irgendwie Touring-Maschinen im Grunde genommen,
das Gleiche wie ein Algorithmus und so.
Auf Programmebene würde das bedeuten, ich nehme mal an,
es gibt irgendwie eine Methode in irgendeiner Library,
der kann nicht M und W vorlegen und die liefert dann
richtigerweise True davor jetzt zurück
Das ist die Idee bei einer Programmiersprache. So,
also das nehme ich an, dass es das gibt.
Und alles, was ich jetzt mache, sind Umformungen,
die ich durchaus im Programmcode machen kann. Also,
dass ich zum Beispiel sage, wenn ich so eine Methode habe,
also die das jetzt entscheidet,
dann kann ich diese Library-Funktion ja aufrufen, so,
dann kriege ich was zurück, tue oder folz.
Und jetzt drehe ich das Ergebnis nochmal um. Das kann
ich ja machen. Es ist ja irgendwie eine Operation in
der Programmiersprache, die es gibt. Oder dass ich sage,
wenn da True zurückkommt, dann Print Hallo, wenn da voll zurückkommt,
Print World, so, kann ich auch machen.
Und der Kniff ist jetzt, dass ich mit erlaubten Umformungen,
habe diese eine Annahme, dass ich sage,
diese Library Funktion gibt es und mit erlaubten Umformungen komme ich jetzt zu etwas,
wo ich nachher sagen muss, oh,
das kann es ja nicht geben.
Also sowas wie, wenn ich diese Methode aufrufe,
dann liefert die gleichzeitig Schuh zurück und falt beim gleichen Eingabewert.
Das kann irgendwie nicht sein, ne? Und wenn man
so einen Widerspruch hat, dann weiß man,
oh okay, dann kann das vorher angenommene nicht gelten,
muss also falsch sein, kann also nicht entscheidbar sein.
Und ihr könnt ja mal versuchen, im Kopf immer nochmal mitzumappen,
dass sie ja hier stehen jetzt gleich ganz viele so HMs und so weiter,
dass sie im Kopf mal versucht mitzumappen,
was passieren würde, wenn das Funktionsaufrufe wären.
Dann passiert nämlich genau
das Gleiche
Also was machen wir? Wir nehmen an, wir hätten
so eine Touring-Maschine H, die dieses Problem hier entscheidet.
Haar für Halten. Haars, also eine Touring-Maschine,
wenn M das Wort W akzeptiert, dann akzeptiert Haar.
Und wenn M das Wort W ablehnt, dann lehnt Haar halt ab.
Und das Wichtige ist halt, H entscheidet das Problem.
Also ich lege H dieses MW vor,
H terminiert immer und sagt richtigerweise ja oder nein.
In Kurzform, H von MWS1, genau dann,
wenn M von W1 das H von MBS0, genau,
dann wird M von W eben nicht eins ist.
Also null oder wenn es blockiert
Okay. Was wir jetzt so, ja,
was wir jetzt machen, ist, wir bauen uns jetzt
eine neue Touring-Maschine D, die hat H zur Brotine.
Also bis dato waren wir nur da, was ich jedem erzählt habe.
So, wir nehmen an, es gibt diese Library-Funktion,
die das für uns tut. Und wir wollen jetzt was
Neues bauen, weil wir wollen ja irgendwie Widerspruch erzeugen.
Wir bauen jetzt eine neue Touring-Maschine D und die kriegt H als Subrotine.
Und D arbeitet wie folgt, die kriegt als Eingabe
auch wieder eine Touring-Maschine M und soll damit irgendwas tun.
Und zwar macht sie Folgendes, sie kriegt eine Touring-Maschine M
und startet jetzt
Also Haar, was die Azobroutine hat, da startet sie
mit der folgenden Eingabe hier. Mit der Eingabe-Turing-Maschine,
also M, die, die sie gekriegt hat, als Eingabe.
Und als Wort auch M, also sprich,
die guckt sich an, was passiert eigentlich,
wenn ich der Turing-Maschine M, M selbst als Eingabe vorliege.
Akzeptiert sie das oder nicht? Quasi ihr habt eine Funktion,
die kriegt einen String als Eingabeargument. Und jetzt sagt er,
hey, ich tue da jetzt mal nicht Hallo oder World oder irgend sowas rein,
sondern als Eingabeargument gebe ich ihr eben die Funktion selbst, also den textuellen String-Funktion selbst.
Und dann macht sie noch hier das Ergebnis umdrehen.
Das ist ja auch okay. Und alles Operationen, die
völlig okay sind
Bei den Funktionsargumenten hier kann ich spielen, wie ich möchte.
Ergebnis kann ich umdrehen, alles in Ordnung.
Wichtig ist ja hier, Haar hält immer an.
Das heißt, bei der Eingabe hier sagt sie ja oder nein.
Wenn sie sagt irgendwie, das ist totaler Blödsinn,
aber kann ich nicht arbeiten, dann sagt sie halt nein, alles okay.
Und Haar und D dreht dann auch dieses Ergebnis um.
Das heißt, zusammengenommen D von MS1,
wenn M die Eingabe M nicht akzeptiert und D von MS0,
wenn M die Eingabe akzeptiert.
Wenn man sich jetzt noch anguckt, hier,
dieser Kram hier, der hing ja irgendwie von dem Haar ab,
dann hat man insgesamt jetzt diesen Punkt erreicht hier.
Haar von MW ist 1, wenn MW 1 ist,
Haar von MW ist 0, wenn MW eben nicht einzeln ist,
sprich wenn MW nicht akzeptiert.
Und D kriegt jetzt einfach nur eine Touring-Maschine M als Vorgabe
und startet dann dieses Haar auf MM.
Also ich rufe jetzt hier bei D, da rufe ich
hier quasi HMM auf und drehe das Ergebnis um.
Das heißt, wenn hier gesagt wurde,
wenn MM gleich eins ist, dann liefere ich eins zurück,
dann liefere ich jetzt halt null zurück.
Also D von der MM ist null, wenn MM 1 ist.
Okay. So. Und jetzt kann ich mir ja noch
eine Touring-Maschine bauen oder noch eine Funktion basteln.
Und die macht jetzt Folgendes, die nimmt D und ruft
D mit D auf
Also die eben gebastelte Touring-Maschine hier, die,
die war ja total okay, die hat ja nichts gemacht eigentlich,
die hat irgendwie mit dieser Library-Funktion H gearbeitet und die nehme ich jetzt und die sagt ja,
sie will eine Touring-Maschine M haben als Eingabe,
D ist ja auch eine Touring-Maschine,
also kann ich D ja mit D starten.
Und jetzt passiert aber folgendes,
wenn man hier jetzt überall, wo M steht,
D einsetzt, dann habe ich diesen Fall erreicht.
Das heißt, D von DS1,
wenn D von D nicht eins ist und D von DS 0,
wenn D von D 1 ist.
Kann ich gehen, ne
Also spätestens da springt es einen an, dass es ein Widerspruch ist,
ob man jeden Schritt mitgeht, der zu diesem Widerspruch führt.
Das muss man wahrscheinlich drei, vier, fünf,
sechs Mal lesen und sich angucken.
Aber hier sieht man, dass das ein Widerspruch ist.
Also wenn ich da hinkomme, dass ich behaupte,
DVDS1, wenn DVD nicht eins ist und DVDS0,
wenn DVD 1 ist, funktioniert nicht diesen Widerspruch.
Und was ihr jetzt beim Nachbereiten mal probieren solltet,
ist, jeden einzelnen Schritt durchgehen und euch bewusst machen,
dass man hier eine Annahme hat, hier eine Annahme hat.
Wir nehmen an, es gibt diese Turing-Maschine H und alles,
was danach kommt, sind total in Ordnung,
sind völlig in Ordnung und seinde Umformungen.
Das kann ich
alles machen
Ich kann, wenn ich Haare habe,
ja klar kann ich dir irgendwie so ein String-MW vorlegen,
dafür ist sie ja da.
Und wenn ich das machen kann,
dann kann ich ihr natürlich auch MM vorlegen.
Warum denn nicht? Aufgabe ist ja nur Turing-Maschine und String
. Also kann ich auch M als String nehmen,
lege ich ihr vor. Ergebnis umdrehen kann ich auch.
Die terminiert ja immer und liefert mir True oder Falls zurück.
Was hält mich also davon ab, dass in irgendeinem Brötchen
Wert B zu speichern, den umzudrehen und das zurückzuliefern?
Man kann ja machen. Und dann lande ich aber genau
bei dieser Turing-Maschine D, die solche Sachen tut hier.
Und wenn ich der dann eben D wieder selbst vorlege,
dann habe ich halt so
einen komischen Widerspruch
Und dieser ganze Widerspruch kommt daher, dass ich behauptet habe,
ich könnte Haar entscheiden, sprich hart terminiert immer.
Wenn ich das nämlich nicht mache,
dann kriege ich an den Stellen hier Probleme, da.
Weil ich dann gar nicht weiß, hier terminiert das immer.
Hier bei der Konstruktion von D, da habe ich ja gesagt,
ich starte Haar mit der Eingabe MM und drehe das Ergebnis um.
Wenn ich das gar nicht machen kann,
weil es gar nicht immer ein Ergebnis gibt,
dann fliegt es da auseinander.
Also da ist essentiell wichtig,
dass Haar immer ein Ergebnis liefert.
Also da wird diese Annahme benutzt
Okay, Intermezzo haben wir schon quasi davor gemacht,
dass man sich bewusst macht,
wenn ich statt Haar sage, ja,
das ist eine Funktion in irgendeiner Library und dann sage,
ja,
ich konstruiere nicht D,
sondern ich baue mir jetzt eine neue Funktion Funk 2 und
die ruft halt Funk 1 auf und dann ruft ihr halt Funk 1 mit Funk 1 als Eingabe auf und dann dreht sie das Ergebnis um, ist alles genau das Gleiche.
Da kann ich auch alles im Java-Code machen und dann komme ich dahin,
dass ich dann irgendwann sagen muss, oh,
dann kannst du aber diese Library-Funktion da,
die kann es gar nicht geben oder die Spezifikation der Library-Funktion
muss Müll sein,
weil das führt hier irgendwie zu nichts.
Haben wir die erste nicht entscheidbare Sprache und dann wissen wir,
dass das so aussieht. Also Reck, echte,
die regulären, echte Teilfamilie, der kontextfreien, echte Teilfamilie,
der entscheidbaren, echte Teilfamilie, der aufzählbaren.
Und da sieht man sie nochmal alle vier hier unten.
Da sind sie alle vier. Und was wir morgen nochmal machen,
ist, wir gucken uns eine Sprache an,
die nicht mal mir hier ein RE ist.
Also jetzt haben wir ja eben eine gesehen, die in RE ist.
Morgen gucken wir uns nochmal eine Exkursartig an, die nicht in RE ist.
Und dann wollen wir insbesondere an Techniken arbeiten,
um für Probleme zu zeigen, dass sie ihm nicht entscheidbar sind.
Dann haben wir als Technik, um von Reck zu CF zu kommen,
haben wir das erste Pumpinglemmer als Technik,
um von CF zu Reck zu kommen.
Das zweite Pumpinglemmer und dann eben eine Technik,
um zu zeigen, oh, ist nicht mal mehr entscheidbar.
Können wir immer weiter gucken, wo Sprachen dann genau
liegen.
Wenn die, wenn du eine Touring-Maschine hast,
die die Sprache akzeptiert, dann kommt die ja bei Worten,
die sie akzeptiert,
nicht in Endlosschleifen.
Ja gut, Christian, nehmen wir mal die deterministische Touring-Maschine,
da ist ja immer klar, was sie bei jedem Schritt macht.
Jetzt kriegst du ein eigenes Wort,
jetzt arbeitet sie irgendwie und entweder macht sie jetzt deterministisch halt
diesen Sprung in den Endzustand oder weil sie den nicht machen kann,
geht sie deterministisch in diese Endlosschleife.
So, und das siehst du halt leider nicht.
Du weißt immer nicht, ist jetzt in dieser Endlosschleife drin
oder geht sie da hin? Weil es könnte ja auch sein,
dass sie in dieser Schleife, dass das gar keine Endlosschleife ist,
sondern dass sie irgendwelche Zahlenwert auf irgendeine komische Art und Weise manipuliert.
Und nachher sagt sie, oh, jetzt bin ich gar
nicht mehr in der Schleife. Bedingung gilt nicht mehr,
also springe ich raus. Und dann weißt du, ah ja,
okay, ich musste da gar nicht unendlich drin sein,
sondern nur 2000 Mal und dann konnte ich da hingehen.
So, wäre ja total okay. Und das Problem ist halt,
das sagt dieses Ergebnis eben, Dass du keine Möglichkeit hast,
einen Algorithmus zu entwickeln, dem du insbesondere Schleifen vorlegen kannst.
Und er kann dir dann sagen, ja, die terminiert bei der Eingabe oder nicht?
Das geht halt leider nicht. Für spezielle Programme,
wenn du mir jetzt ein ganz spezielles Programm gibst und sagst irgendwie,
bei dieser Weisschleife möchte ich wissen, terminiert die immer oder nicht.
Da kann man dran arbeiten. Aber da ist es jedes Mal wieder,
genauso wie bei Beweisen für irgendwelche Aussage, Aussagen,
jedes Mal wieder ein kreativer Akt irgendwie,
auf die richtigen Sachen zu kommen und zu beweisen,
ja, diese Schleife terminiert tatsächlich immer.
Und der Unterschied zum Algorithmus ist ja ein Algorithmus,
würde nach irgendeinem vorgegebenen Muster mit allen Schleifen arbeiten.
Und das können wir halt leider nicht machen
So, noch erstens, zweitens. Okay, morgen fangen
wir an mit, warte doch. Akzeptieren, Accept.
Da kannst du auch irgendwie anders nennen, aber.
Okay, morgen fangen wir an mit kurzer Wiederholung und dann
fangen wir insbesondere diesen Unentscheidbarkeitsbeweis, genau den einfach nochmal.
Also guckt euch den gerne heute Abend zuhause nochmal an.
Dann könnt ihr morgen Fragen dazu stellen.
Da gehen wir also nochmal durch und dann,
wie gesagt, dann gucken wir uns eine Sprache an,
die nicht in RE ist und dann noch ein paar unentscheidbare
Sachen.