So, geht das? Geht das? Könnt ihr es hören
? Ja. Okay. Alles klar. Super. Dann
, die vorletzte Woche. Christopher hat mich gerade überredet,
dass ich den übernächsten Montag schon an ihn abtrete,
damit er dann die ganze Woche hat für den Logikteil und dann den Aufgabenzettel anständig dieser einen kann.
Sprich, wir haben jetzt noch diese Woche und nächste Woche
und am 19.05. übernimmt dann Christopher mit dem Logikteil.
Das, was wir jetzt noch machen,
zwei Wochen
Wird relativ anspruchsvoll. Also jetzt kommt noch so zwei Wochen,
die ziemlich schwierig sind. Es geht darum,
in der ersten Woche geht es noch mal primär um Berechenbarkeitstheorie.
Das heißt, welche Probleme kann man mit Naturingmaschinen und damit dann auch mit dem Computer lösen?
Welche nicht? Das ist der eine Teil. Und nachdem man dann weiß,
dass man bestimmte Probleme lösen kann oder eben nicht,
guckt man sich speziell die noch mal an,
die man lösen kann und überlegt sich,
ob man die überhaupt auch effizient lösen kann.
Weil wenn ich ein Problem lösen kann,
aber das viel zu lange dauert,
dann ist das vielleicht für praktische Anwendung eben doch nicht so,
dass ich das lösen kann,
sondern eben nur theoretisch das Ding lösen kann.
Genau,
das wollen wir die nächsten zwei Wochen noch mal machen
Und dann sehen wir uns irgendwie am Ende des Semesters nochmal wieder,
da mache ich dann nochmal eine zusammenfassende Vorlesung und das Repertorium.
So, Entscheidbarkeit und Aufzählbarkeit hatten wir ja in der letzten Vorlesung am Dienstag,
ganz zum Schluss nochmal definiert. Eine Menge heißt Rekursiv aufzählbar,
genau dann, wenn sie entweder leer ist,
das ist immer so ein Sonderfall oder eben so eine Funktion existiert,
geh von den natürlichen Zahlen auf Sigmar Stern,
derart das G von N eben gerade M ist,
bedeutet, wenn ihr in G die Zahl 1 reinschmeißt,
dann die Zahl 2, 3, 4, 5,
6 und so weiter, kommen da irgendwann alle Elemente aus M raus.
Es kommt nicht mehr raus, sondern es kommen halt auch nicht weniger raus.
Und diese Familie wird dann eben mit RRE bezeichnet, so historisch gewachsen.
Warum aufzählbar? Weil man eben zeigen kann,
dass so eine Mehrband-Touring-Maschine existiert, die jedes Wort der Menge
genau einmal auf ihr Ausgabeband schreibt.
Und dann kann man zeigen, dass das auch Äquivalent dazu ist,
dass einfach eine Touring-Maschine existiert,
die eben diese Sprache akzeptiert
Wir werden nachher primär mit dem zweiten Punkt hier unten arbeiten,
also dass eine Touring-Maschine A existiert mit LA gleich M und wir werden das quasi als Definition nehmen,
was wir halt sagen, eine Sprache ist dann aufzählbar,
wenn es eine Touring-Maschine gibt, die die akzeptiert.
Genauso wie wir früher auch gesagt haben,
eine Sprache ist regulär, wenn endlicher Automat existiert,
der die akzeptiert oder eine Sprache ist kontextfrei,
wenn eine Grammatik existiert, die die Sprache generiert,
sagen wir jetzt eben eine Sprache ist aufzählbar,
wenn eine Touring-Maschine existiert, die die Sprache akzeptiert.
Man kann sich auch relativ schnell überlegen, dass die drei Sachen,
also das erste hier oben mit rekursiv aufzählbar,
die eigentliche Definition Und die beiden Punkte hier im Satz,
dass das alles äquivalent ist.
Also wenn es, wenn das da oben gilt,
wenn ich so eine total berechenbare Funktion gehe, habe,
dann kann ich eine Carbon-Touring-Maschine konstruieren,
die jedes Wort genau einmal auf ihre Ausgabeband schreibt.
Die macht ein verfolgendes, die hat einen Zähler,
dann ist der Zähler 1, dann berechnet sie den Wert von G von 1.
Das ist ja eine berechenbare Funktion, das heißt,
die KG von 1 berechnen. Das Ergebnis schreibt sie sich
aufs Band. Dann berechnet sie G von 2,
schreibt das Ergebnis aufs Band, gehe von 3,
schreibt das Ergebnis aufs Band und immer so weiter.
Und das, was sie halt noch machen muss, ist,
weil sie eben jedes Wort genau einmal auf die Ausgabeband schreibt,
guckt sie halt immer, habe ich das Wort schon mal geschrieben.
Und erst dann schreibe ich das vielleicht aufs Ausgabeband.
Das ist relativ einfach
Dann der Schritt von, wenn ich schon so eine K-Band-Offline-TM habe,
dann zu zeigen, dass es auch eine Touring-Maschine gibt,
wie die Sprache akzeptiert. Das ist auch relativ einfach,
da kriege ich ja ein Eingabewort weh und ich will entscheiden,
ist das in M drin oder nicht. Naja,
dann schmeiße ich einfach diese K-Band-Offline-Touring-Maschine an und gucke immer bei jedem Wort,
dass sie ausspuckt, irgendwann ist das das Wort,
was bei mir gerade auf dem Eingeband steht,
falls ja, akzeptiere ich, falls das nie kommt,
akzeptiere ich eben nicht.
Kann unendlich gut sein, ja. Die Frage war,
ob die Sprache M hier,
das da
Ob die unendlich groß sein kann, das war die Frage.
Kann sie. Wenn sie unendlich,
wenn sie endlich groß ist, dann würde man hier wahrscheinlich
ganz viele Werte von Ende auf das gleiche Element abbilden.
Aber das ist dann halt so. Wenn eine Sprache regulär ist,
schöner Einschub, wenn es Sport ist, habe ich selbst gesagt,
wenn eine Sprache endlich ist, ist sie auch regulär.
Und dann ist sie natürlich auch inklusiv aufzählbar. Warum sind
endliche Sprachen regulär ein Startzustand und dann für jedes Wort?
In einen extra in Zustand gehen. Das ist die Sprache
regulär. Habt ihr nur endlich viele Worte?
Also habt ihr dann auch nur endlich viele Zustände hier
gehen müsst
Was hatte ich gerade gemacht hier? Erstens von da zu
der Carband-Offline-TM von da zu der Sprache.
Ist auch einfach. Und jetzt müsste man auch zeigen,
dass man auch von der Sprache,
also wenn ich eine Touring-Maschine habe, die die Sprache akzeptiert,
dass ich dann auch die Funktion G da oben berechnen kann.
Und da kann man so einen ähnlichen Kniff machen wie,
wie wir das bei dem Vereinigungs,
bei dem Abschluss gegenüber Vereinigung für aufzählbare Sprachen gemacht haben.
Man fängt mit dem Wort an, der Länge 1,
also man nimmt erstmal alle Worte der Länge 1,
lässt darauf die Touring-Maschine A hier einen Schritt machen.
Da nimmt man alle Worte der Länge 2,
lasst sie einen Schritt darauf machen,
dann lässt man sie in den zweiten Schritt auf den Worten
der Länge 1 machen,
den zweiten Schritt auf den Worten der Länge 2,
den ersten Schritt auf den Worten der Länge
Dann den dritten Schritt auf den Worten der Länge 1,
den dritten Schritt auf den Worten der Länge.
Zwei, den zweiten Schritt auf den Worten der Länge 3,
den ersten Schritt auf den Worten der Länge 4 und immer so weiter.
Und dann hat man halt irgendwann, muss man bei so Worten ankommen,
die wirklich in der Sprache drin sind und die gibt man dann hier als erstes,
zweites, drittes, viertes Wort aus.
Und dann hat man das auch. Also das ist wirklich
alles äquivalent. Wer den Beweis nochmal nachlesen will,
steht im Hauptcraft Ulman auf jeden Fall drin. Wir werden nachher,
wie gesagt, mit der Definition hier unten primär arbeiten und einfach sagen,
okay, wir definieren das so.
Dann hatten wir noch Entscheidbarkeit, da haben wir gesagt,
eine Menge ist entscheidbar, wenn die charakteristische Funktion berechenbar ist.
Das führt dazu, wenn ich die Funktion hier berechnen kann,
die so, wie hier unten definiert ist.
Das heißt, Xi von X ist eins genau dann,
wenn X in M drin ist. Sprich,
wenn ich in die Funktion ein Ding aus M reintue,
dann sagt sie eins, wenn ich ein Ding reintue,
das nicht in M ist, sagt sie null.
Wenn ich die Funktion also berechnen kann,
dann gibt es eine Touring-Maschine, die bei Vorlage eines Wortes ausrechnet,
ist das Wort in M drin oder nicht.
Wenn es drin ist, gibt sie eine Eins aus,
wenn es nicht drin ist, gibt sie eine Null aus.
Und das Wichtige dabei ist, ich kann das dann so konstruieren,
dass ich sage, sobald sie eins ausgibt,
höre ich auf oder sobald sie null ausgibt, höre ich auf.
Sprich, anders als eben, wo ich gesagt habe,
ich will die Sprache nur akzeptieren,
werde ich jetzt die Sprache akzeptieren und auf jeden Fall anhalten.
Also sowohl bei den Jahrinstanzen werde ich anhalten,
als auch bei den Nein-Instanzen
Kann man dann auch zeigen,
eine Menge heißt entscheinbar genau dann, wenn eine Touring-Maschine existiert,
die die Sprache akzeptiert und A hält auf jeder Eingabe.
Auch da kann man das eben als alternative Definition benutzen,
also den Satz hier unten, das wollen wir auch machen, das sieht dann...
Das sieht dann so aus. Also die von Touring-Maschinen akzeptierten
Sprachen bilden diese Sprachfamilie der aufzählbaren Sprachen und der Teil von den Aufziehbaren Sprachen,
die eben akzeptiert werden, aber eben so,
dass die Touring-Maschine auf jede Eingabe anhält, das sind die entscheidbaren Sprachen.
Und das mit den entscheidbaren Sprachen, das ist das,
was man primär nachher algorithmisch haben will.
Ich möchte meine Algorithmen so implementieren, dass die immer entweder ja oder nein sagen. Also wenn ich ein,
wir hatten ja dieses Beispiel mit der Additionsmethode,
wo man eben sagt, F von XY,
ist X plus Y, das codiert man dann so in eine Sprache,
dass man ein Triebel vorgibt und eben sagt,
das Triebel wird dann akzeptiert,
wenn das dritte Element im Triebel die Summe der ersten beiden ist,
also XYZ vorgegeben,
du musst Z gleich X plus Y sein,
das akzeptiere ich
Und da wäre es ja jetzt ein bisschen blöd,
wenn der Algorithmus so abläuft, dass der nur Ja sagt,
wenn X plus Y wirklich gleich Z ist und ansonsten halt irgendwie nichts sagt.
Damit kann man nicht so viel anfangen. Deswegen sind diese Entscheidbaren von
besonderer Bedeutung. Da nochmal zusammengefasst, Entscheidbarkeit, Touring-Maschine,
die Sprache akzeptiert und auf jede Eingabe hält, Aufzählbarkeit,
es muss nur eine Touring-Maschine geben, die die Sprache akzeptiert.
Und da über diese Aufzählbarkeit, das, was man halt machen kann,
ist, dass die Touring-Maschine bei den Ja-Instanzen anhält,
indem ich das einfach so mache,
dass sobald ich in einem Endzustand bin,
lasse ich da keine Kanten mehr rausgehen
Sprich, ich halte an, wenn ich in einem Endzustand bin.
Aber bei den Nein-Instanzen, da merke ich halt immer nicht,
die Tourier-Maschine rechnet jetzt irgendwie und ich weiß immer nicht,
will sie das Wort nicht akzeptieren oder wird sie irgendwann doch nochmal so weit sein,
dass sie sagt, ja, das ist okay als Instanz.
Also als Beispiel, wenn ihr irgendwie einen Grafen habt und
ihr wollt einen Weg von A nach B berechnen.
Jetzt gebt ihr einen ganz großen Grafen vor und jetzt könnte das ja sein,
dass das halt sehr, sehr lange dauert, das da auszurechnen,
ob es einen Weg von A nach B gibt.
Und dann wisst ihr immer nicht, wenn sie noch rumrechnet,
ist sie gerade irgendwo in der Schleife drin und kommt dann nicht mehr raus.
Gibt so einen Weg vielleicht gar nicht oder kommt das
irgendwann doch
Ja, Fragen ist dahin. Entscheidbarkeit, Aufzählbarkeit, ist
das klar? Jetzt wäre ein guter Moment noch nachzufragen,
wenn du noch irgendwas so in Scheidbarkeit und Aufzählbarkeit noch nicht verstanden hast.
Sonst kommen jetzt nämlich gleich ganz viele Beispiele und die versteht man
ja nicht, wenn man die Definition nicht verstanden hat.
Habt ihr noch? Naja, gut. Dann Dann gucken wir uns jetzt
ein paar entscheidbare Sprachen an. Also so typische Sprachen,
von denen man, die man algorithmisch irgendwie lösen möchte.
Und man stellt sich die Frage, ist das entscheidbar oder nicht?
Beispielsweise das Akzeptanzproblem für DFAs. Also gegeben so ein Tupel
bestehend aus dem Automaten A und einem Wort, wie ist die Frage,
akzeptiert der Automat A wirklich dieses Wort W, ja oder nein?
Das,
was ich
Das, was ich in den letzten zwei Vorlesungen noch so
ein bisschen, naja, ein bisschen schluderig gemacht habe.
Normalerweise müsste man hier nicht einfach so ein Tupel AW reinschreiben oder so,
sondern eben immer sagen, dass es um eine Codierung geht.
Also ihr könnt ja der Turing-Maschine nicht irgendwie den Automaten A als mathematisches Objekt vorlegen,
sondern irgendwie als eine Codierung, mit der er arbeiten kann.
Also genauso wie ihr das auch beim Programmieren macht,
wenn ihr beim Programmieren über Grafen reden wollt,
dann braucht ihr auch irgendeine Datenstruktur, mit der ihr dann arbeiten könnt.
Das, was man hier eben beispielsweise machen kann,
ist um den Automaten A darzustellen, alles linie,
ja, alles linie aufs Band schreiben.
Also alle Zustände aufs Band, dann die Eingabesymbole,
dann kommt diese Überführungsfunktion als Triebel oder sowas aufs Band
Und dann halt die Touring-Maschine, dieses Ding und dann kann sie damit arbeiten.
Das ist aber nur so wichtig fürs, naja,
fürs Formal ist das wichtig, damit man weiß,
okay, die Tour immer stehen kriegt eigentlich eine Kodierung davon.
Wie macht ihr das? Eine Touring-Maschine angeben, die das akzeptiert.
Oder alternativ auch in irgendeiner höheren Programmiersprache. Das ist Äquivalent,
von daher kann man das auch irgendwie in Pseudo-Code einer imperativen
Programmiersprache angeben.
Wie würdet ihr das machen
Nehmen wir mal an, ihr habt jetzt Übungsaufgabe für zwölf von zwölf Punkten, ein DFA und ein fünfbuchstabiges Wort.
Was macht ihr? Option 1, ich laufe, schreiend aus dem Raum. Wir fangen am Staatszustand an, ne? So,
jetzt guckt ihr, wo kommt ihr mit dem ersten Buchstaben hin,
wo kommt ihr mit den zweiten Buchstaben hin,
wo kommt ihr mit den dritten Buchstaben hin,
wo kommt ihr mit den vierten Buchstaben hin,
wo kommt ihr mit dem fünften Buchstaben hin,
wenn das ein Endzustand ist, akzeptiert ihr,
wenn es kein Endzustand ist, lehnt ihr ab,
wenn ihr irgendwo zwischendurch nicht weiter könnt,
also wenn ihr in irgendeinem Zustand seid und ihr sollt eine B-Kante entlang gehen oder gibt es aber keine B-Kante raus,
lehnt ja auch ab,
weil dann könnt ihr das Wort ja nicht zu Ende lesen.
Fertig ist. Naja, und wie würde man das mit der Touring-Maschine machen? Halt viel,
viel umständlicher, weil sie irgendwie, wenn sie nur ein Band hat,
ständig über dieses Band rüber wandern muss,
aber im Grunde genommen merkt sie sich auch irgendwo,
die aktuelle Konfiguration, sprich den Zustand,
in dem sie ist und das Restwort,
was sie noch lesen muss und dann guckt sie immer,
in welchem Zustand bin ich gerade,
was ist der nächste Buchstabe und jetzt geht sie zu der
Überführungsfunktion und guckt nach,
was sie dann als nächstes lesen muss
Was der nächste Nachfolgezustand ist, dann aktualisiert sie ja einen aktuellen Zustand,
bei dem Eingabewort, das noch zu lesen ist,
streicht sie einen Buchstaben und macht weiter.
Also simuliere A mit Eingabe W. So würde man das machen.
Jetzt kann man die eben genannten Details irgendwie noch durchgehen.
Also wenn man nachher ein bisschen Erfahrung hat,
dann reicht es meistens, das aufzuschreiben,
weil jedem dann klar ist,
was damit gemeint ist,
wenn man das jetzt ein bisschen,
also irgendwie
Ihr könnt ja mal lesen,
ich wechsel währenddessen
die Batterien
Ach, daran könnte es liegen. Also das,
worauf man achten muss, ist,
diese Eingabe muss irgendwie sinnvoll repräsentiert sein für die Touring-Maschine,
sodass sie damit arbeiten kann.
Wichtig ist auch hier dieser dritte Unterpunkt,
dass die Touring-Maschine normalerweise zu Anfang überprüft,
ob sie da wirklich eine Eingabe gekriegt hat,
mit der sie arbeiten kann.
Sprich,
sie macht irgendwie
einen Sinntaxcheck
Überspringt man auch meistens, aber streng genommen muss sie einmal
vorne weg einen Sintax-Check machen und dann arbeitet sie irgendwie damit.
Dann merkt sie sich immer, die aktuelle Position in dem
Wort und den aktuellen Zustand von A und aktualisiert das immer.
Das ist das. Genau, und wenn sie dann in einem Endzustand ist,
akzeptiert sie sonst nicht und wichtig ist eben,
dass die Touring-Maschine wirklich bei jeder Eingabe hält,
sonst würde sie die Sprache nicht entscheiden.
Und dass sie eben auch immer die korrekte Antwort ausgibt und
damit entscheidet sie dann
diese Sprache
Genau. So, und das wollen wir in der Zukunft nicht so detailliert machen,
sondern wir wollen halt etliche Schritte immer überspringen und im Grunde
genommen immer auf einem relativ hohen Abstraktionsgrad einfach nur sagen,
was die Touring-Maschine tun muss.
Sowas wie sie aktualisiert den Zustand, in dem der DFA
sein muss. Da kann man sich schon vorstellen,
dass sie irgendwo auf dem Band hat, sie halt stehen,
Z3, dann muss sie irgendwie an diese Stelle gehen,
das Z3 löschen und daraus ein Z5 machen,
wenn sie halt diesen Kantenübergang gemacht hat.
Aber das will man dann nicht mehr so detailliert sagen und
ganz bestimmt will man dafür auch keinen Zustandsübergangsdiagramm angeben,
sondern man möchte halt einfach nur sagen, okay,
sie macht das.
Aber am Anfang solltet ihr euch immer noch mal überlegen,
vielleicht was die Touring-Maschine da so tut,
das übt
Zweites Beispiel. A, ist ein NFA und akzeptiert weh
. Wie macht er das denn? Beim DFA hatten wir
gerade, wie macht er das für den NFA?
Ich gebe euch einen NFA und ein Wort weh.
Ja, wir können es aber nicht ganz genauso machen.
Der NFA kann ja verzweigen.
Ja, genau. Und wie machst du das? Frage
. Er sagte, man muss irgendwie mit den Verzweigungen,
auf die Verzweigung jetzt achten. Wie macht ihr das?
Was sind Zucken? Das könnte man machen,
man macht eine deterministische Touring-Maschine draus und macht dann das,
was wir eben gemacht haben.
Oder, was passiert im Grunde genommen beim Potenziautomaten?
Man merkt sich in jedem Zustand von Potenzautobahnen,
also von dem DFA, in welchen Zuständen der NFA sein könnte.
Und das kann man ja auch machen. Man fängt mit
der Menge von Zuständen an, in der man ist am Anfang,
geht alle Zustände durch und schreibt sich all die Zustände auf,
in denen man dann sein könnte.
Dann kriegst du halt immer eine Menge. Und aktualisiert die
immer wieder. Also irgendwie. Gucken, ob das besser geht.
Also man merkt sich dann über die Menge der Zustände,
die der NFA ist und aktualisiert diese Menge mit jedem gelesenen Buchstaben,
muss man halt immer über die komplette Menge rübergehen.
Es ist umständlicher, muss man sich immer merken,
welche Zustände man schon abgearbeitet hat und so weiter,
aber das kriegt man auch hin
Alternativ eben, man konstruiert den Potenzautomaten und benutzt dann
die Touring-Maschine aus dem vorherigen Satz,
die eben dieses Akzeptanzproblem für DFAs entscheidet und akzeptiert dann,
falls da akzeptiert wird.
Wichtig dafür ist, dass man eben schon irgendwie weiß,
dass diese Potenzautomatenkonstruktion korrekt ist.
Also, auch noch relativ einfach. Dann gegeben ein DFA,
entscheiden, ob die Sprache, die der akzeptiert,
leer ist.
In deinen Ideen, Ideen. Nee,
du sollst ja nicht den DFA konstruieren, sondern du kriegst
einen DFA und du sollst entscheiden, ob der kein Wort akzeptiert.
Also die Eingabe ist ein DFA oder die Eingabe ist irgendwas
und überprüft so, als ob das ein DFA ist,
sonst könnt ihr gleich Nein sagen.
Und wenn es ein DFA ist,
wollt ihr jetzt gucken, ob die von ihm akzeptierte Sprache
leer ist
Wann ist denn die von einem DFA akzeptierte Sprache leer?
Dann auch, ja, aber das ist ein Spezialfall.
Es gibt ja auch DFAs Mitübergangsfunktionen, bei denen die Sprache leer ist.
Wenn es keinen Endzustand gibt, stimmt auch, aber noch viel,
viel genereller. Genau, wenn kein Endzustand erreicht werden kann.
Das muss man ja irgendwie gucken, ob man das überprüfen kann.
Hausaufgabe. Das ist eigentlich mehr Agrafentheorie als mit Automaten zu arbeiten,
aber wie kann man entscheiden, Schöne hier ist noch,
ihr dürft ja so ineffizient sein, wie ihr wollt.
Es geht ja nur darum, dass ihr irgendwann nach endlicher Zeit zu einem Ergebnis kommt. Also,
und jetzt nehmen wir mal an, wir haben da schon,
also nehmen wir mal, wir wären in der nächsten Woche,
und ihr habt das schon gelöst und so,
die Sprache gegeben zwei DFAs,
sind die Äquivalent, sprich akzeptieren sie die gleiche Sprache.
Das ist für so Geschichten wichtig,
wie wenn ihr einen DFA habt und eine Spezifikation und ihr wollt gucken,
ob irgendwie der DFA die Spezifikation erfüllt und solche Geschichten,
kann man gucken, ob die irgendwie die gleiche Sprache akzeptieren.
Wie würdet ihr das machen,
wenn ihr All die Sachen, die wir eben hatten,
die von denen wisst ihr schon, dass sie entscheidbar sind.
Also ihr könnt das Lehrheitsproblem für DFAs entscheiden. Ihr könnt
das Akzeptanzproblem für DFAs entscheiden und das Akzeptanzproblem für NFAs.
Wie kann man das machen? Und wie viele Eingaben
musst du ausprobieren
Nehmen wir mal ein A, akzeptiert A,
Stern und B, akzeptiert auch A, Stern.
Wie viel Eingaben muss ich jetzt ausprobieren?
Ganz, ganz viele. Das klappt noch nicht. Mit
Simulation klappt es nicht. Also der Vorschlag eben war,
ich simuliere den einen DFA auf einem Band,
den anderen DFA auf einem anderen Band.
Und jetzt gucke ich immer, ob sie jedes Wort akzeptieren oder eben nicht.
Ob das immer gleich ist. Wir müssen entweder beide akzeptieren oder
beide ablehnen. Stimmt auch. Problem dabei ist nur,
selbst bei sowas wie A, Stern müsste ich halt
das Wort A ausprobieren. Zwei As, 3 As,
4 As, 5 As und so.
Da werde ich nie mit fertig.
Dauert die Simulation ewig
Äh... Darf es ein Wort geben,
das von A akzeptiert wird und nicht von B?
Nee, darf es irgendwie nicht geben,
weil die sollen ja beide entweder akzeptieren oder beide nicht akzeptieren.
Von A akzeptiert zu werden und nicht von B akzeptiert zu werden,
bedeutet, naja, A, von A akzeptiert zu werden,
macht A. Nicht von B zu akzeptieren macht der Komplimentautomat zu B und beides macht der Produktautomat.
Also A, geschnitten mit dem Komplimentautomaten von B,
macht man dann nochmal in der anderen Richtung,
das darf keine Wörter geben, die von A akzeptiert werden,
aber nicht von B und es darf keine Wörter geben,
die von B akzeptiert werden,
aber nicht von
Sieht dann so aus. L.A., also die Wörter,
die von A akzeptiert werden und nicht von B,
vereinigt mit denen,
die nicht von A akzeptiert werden und von B. Das ist ein Automat,
den kann man konstruieren, das ist der Automat C. Und dann gilt,
wenn die Sprache von C leer ist,
dann ist gerade L.A. gleich L.B. und andersrum auch.
Kann man sich relativ schnell überlegen, wenn L.A. gleich L.B. ist,
dann kann hier kein Wort drin sein, das ist also leer.
Hier kann auch kein Wort drin sein, das ist auch leer,
ist die Vereinigung leer, spricht dann das L von C leer. Und andersrum,
wenn L von C leer ist, Kann man sich überlegen,
wenn dann ein Wort in LA drin ist,
dann kann es nicht nicht in LB drin sein,
weil wenn es das wäre, wäre dieses Wort in dieser Sprache,
LA geschnitten mit LB quer und dann wäre LC nicht leer.
Und andersrum kann man es genauso machen, dann hat man die Mengleichheit gezeigt.
Und so ein DFA-C hier, den können wir konstruieren.
Wir kriegen ja die Automaten A und B als Eingabe. Dann können wir sagen,
okay, ich habe jetzt einen Automaten für A,
ich habe einen Automaten für B,
der Automat A quer geht aus A hervor,
indem ich Endzustände und Zustände austausche.
Also alles, was vorher im Zustand war,
ist jetzt ein Endzustand, alles,
was ein Endzustand war, ist jetzt ein Zustand,
dann akzeptiere ich genau
das Kompliment
Produktbildung, das war diese Geschichte mit,
sich in einem Tupel, in einem Zweiertupel zu merken,
wo ist der eine Automat, wo ist der andere Automat?
Dann bin ich in Z0 oder in Z0 Strich und jetzt
gucke ich, wo komme ich mit dem A hin,
dann bin ich in Z1 und Z5 Strich oder irgendwie sowas.
Und dann schreibe ich mir immer in ein Tupel.
Der Produktautomat. Und Vereinigung ging einfach beide Automaten zusammenschreiben.
Ja, und jetzt hat man das und damit
kann man jetzt irgendwie die Sprache entscheiden.
Jetzt konstruiert die Touring-Maschine diesen Automaten C und dann benutzt sie
die Subroutine für das Lehrheitsproblem beim DFA,
was ihr als Hausaufgabe machen sollt
Und dann akzeptiere ich eben genau dann, wenn M akzeptiert.
Alle Schritte sind von der Touring-Maschine ausführbar. Alle Schritte enden auch nach endlicher Zeit.
Das heißt, ich habe auch das Problem entschieden.
Genau, das war jetzt alles so zu DFAs.
Jetzt kann man sich überlegen, einen Schritt weiter kontextfreie Grammatiken.
Die Frage, gegebene Grammatik und ein Wort. Generiert die Grammatik
dieses Wort weh? Frage ist das entscheidbar oder nicht?
Braucht man üblicherweise irgendwo im Compilerbau? Hier geben die Grammatik
einer Sprache. Frage, ist das Programm in dieser Sprache
drin? Bedeutet, ist das in taktisch korrekt,
ja oder nein
Ja, ist das entscheidbar, Vorschlag? Wir konstruieren alle Ableitungen
nach und nach und testen, ob eine davon weh generiert.
Falls ja, akzeptieren wir, sonst akzeptieren wir nicht.
Wir müssen ja immer mit dem Staatssymbol anfangen und dann können wir gucken,
wo komme ich überall mit S hin,
also welche Produktionen sind anwendbar, die benutze ich alle,
dann gucke ich wieder bei den Satzformen,
die dann entstanden sind, wo komme ich von da hin,
mach das und so weiter.
Problem, erstens, das werden ganz schön viele und zweitens,
das werden bedauerlicherweise
unendlich viele
So funktioniert es also nicht. Insbesondere,
weil ihr so Sachen haben könnt, wie von A geht es,
zu B geht es, zu C geht es zu A.
Dann könnt ihr irgendwie unendlich viel ableiten. Oder ihr könnt so
Sachen haben, wie, es kann ja Landerregeln geben.
Also Regeln, die non-terminale löschen. Das heißt,
ihr wisst auch nicht, dass die Worte, dass ihr
nur bis zum Weg gehen müsst zur Länge weh konstruieren müsst.
Es könnte sein, dass ihr zwischendurch eine Satzform habt,
die viel, viel länger als weh ist.
Und irgendwann später könnt ihr bestimmte Symbole rauslöschen und dann kommt
wirklich das Wort weh raus.
Sprich, ihr habt auch keine Grenze.
Genau. Champsky Normalform machen
Oder erweiterte Chomsky-Normalform. Da gilt jedes Wort der Länge in Größe gleich eins.
Kann man in genau zwei N minus eins Schritten ableiten.
Warum? Chomsky-Normalform war ja sowas, dass sie nur zwei Arten von Regeln habt.
Entweder von einem Non-Terminal geht es genau zu einem Terminal oder
von einem Non-Terminal geht es zu zwei Non-Terminalen.
Und jetzt kann man sich überlegen, naja,
um so ein Wort der Länge N aufzubauen,
muss ich eben erst mal, keine Ahnung,
aus A und B-C machen, dann aus zehn DE oder so,
aber da kommt immer nur ein Non-Terminal dazu.
Dann habe ich irgendwie Endschritte gebraucht und danach leite ich
die alle zu einem Terminalzeichen ab und dann habe ich
so zwei N minus eins Schritte gebraucht
Außer, wenn das Wort die Länge Null hat, also das leere Wort,
aber da war es ja bei der erweiterten Chamsky-Normalform so,
wenn Lamda in der Grammatik ist,
dann gibt es genau eine Regel zum Lamda,
nämlich vom Staatssymbol zum Lamda und der Staatssymbol steht dann auch auf keiner rechten Seite,
sprich ich kann zwischendurch nichts löschen und das kann ich benutzen.
Sprich, ich wandel gehe in diese erweiterte Chamsky-Normalform um und dann gucke ich,
welche Länge das Wort hat,
wenn die Länge gerade null ist,
dann liste ich nur alle Ableitungen der Länge 1 auf,
wenn die Länge größer Null ist,
liste ich alle Ableitungen der Länge 2 in minus 1 auf und wenn einer davon wehgeneriert,
bin ich fertig,
sonst eben nicht
So, und das kann man jetzt benutzen,
um zu zeigen, also da nochmal kurz, so wie hier,
alle Ableitungen der Länge 2 in minus 1 aufzulisten,
das sind so typische Brut-Force-Attacken, dass man irgendwie sagt,
okay, ich teste alles durch, dauert natürlich blöd lange,
ist also ineffizient, viel effizienter, so ein Verfahren von Coke,
Yanga und Kasami, könnt ihr im Skript,
glaube ich, finden, ja, doch,
könnt ihr auch ein Skript finden oder eben im Hauptcraft Ulman,
ist ganz schön benutzt, auch die Jumpsky Normalform, sprich,
man konstruiert erst die Jumpsky Normalform und hat dann sehr effizientes Verfahren,
das Wortproblem zu lösen
So, dann der Satz, zu dem ich eben
eigentlich wollte, jede Kontextfreisprache sind scheitbar. Sprich,
wenn ihr eine Sprache kriegt und ihr wollt jetzt entscheiden,
nee, ihr kriegt eine Sprache und jetzt soll es eine Turing-Maschine geben,
die bei jedem Wort ja oder nein sagt und ja,
eben wenn das Wort in der Sprache drin ist,
nein, wenn das Wort nicht in der Sprache drin ist.
Dazu kann man das Problem von eben benutzen,
denn wenn die Sprache kontextfrei ist,
dann gibt es ja irgendwie eine Grammatik,
die die generiert und die Grammatik kodiert ihr in
die Turing-Maschine rein
Und dann, Daddy Damn, M benutzt die VR-Gedöttete,
startet M eben diese Touring-Maschine im Strich von eben auf dieser Eingabe GW. Und das,
was M eben immer machen muss, ist bei Vorlage von W,
schreibt sie sich eben als Konstante, das ist bei ihr irgendwie konstant drin,
diese Grammatik G aufs Band, dann auch das Wort W,
was sie als Eingabe hat und auf diesem Tupel startet sie dann die Touring-Maschine im Strich von eben und akzeptiert eben genau dann, wenn die akzeptiert.
Das klappt, was nicht klappt, ist mit einer PDA-Simulation,
oder das klappt zumindest nicht so offensichtlich,
weil wenn ihr das einfach nur simuliert, also wenn ihr sagt,
okay, zu der kontextfreien Grammatik gibt es ja auch einen Kellerautomaten,
der die Sprache akzeptiert, also nehme ich mir den und gucke,
was passiert da, wenn ich irgendwie auf dem Wort weh arbeite,
der könnte theoretisch in Endlosschleifen gelangen und dann simuliert er unendlich lange weiter.
Das würde also nicht so gut funktionieren, zumindest nicht so auf Anhieb.
Kann man auch rumtweaken, aber funktioniert nicht so auf Anhieb. Ja,
so und solche Sprachen, so typische algorithmische Sachen,
also Addition um eins, normale Addition oder auch sowas wie,
wenn Graf gegeben ist und ihr wollt gucken,
ist V erreichbar oder nicht oder wenn Graf gegeben ist und ihr wollt testen,
ist der B-Partit oder nicht oder ist da irgendwie eine Clique drin,
all solche Sachen, das ist alles entscheidbar,
also alles,
wofür ihr irgendwie Algorithmen im Studium kennenlernt,
das ist im Allgemeinen alles entscheidbar
Dann noch die Fragestellung, die wir eben so hatten mit
DFAs, NFAs, kontextfreie Grammatiken und so.
Alles, alles entscheidbar. Jetzt das Problem,
da behaupten wir jetzt nur, dass das aufzählbar wäre.
Also da wollen wir jetzt gar nicht sagen, dass es entscheidbar ist,
wir wollen nur sagen, dass es aufziehbar ist.
So ähnlich wie eben auch bei dem DFA und NFA,
wir kriegen Automatenmodell M vorgelegt,
das soll jetzt eine Touring-Maschine sein und wir kriegen Wort W und wir wollen gucken,
akzeptiert die Touring-Maschine das Wort ja oder nein.
Aufzählbar ist relativ einfach, weil ich ja nur auf Jahrinslanzen
anhalten muss. Sprich, ich kann einfach die Touring-Maschine auf
W simulieren
Erreicht M irgendwann mal einen Endzustand, akzeptiere ich, sonst lehne ich ab.
Simulieren, M in der Endlosschleife kommt. Naja,
dann kommt die Maschine, die simuliert auch in der Endlosschleife.
Macht aber nichts, weil wir wollen halten,
sondern wir wollen sie nur akzeptieren. Das heißt,
wir wollen ja nur Ja sagen, wenn die Tour in Maschine,
die ich simuliere, wenn die auch irgendwann mal Ja sagt.
Das heißt, aufzählbar ist damit sogar schon gezeigt.
Entschieden haben wir die Sprache aber noch nicht. Also wir
haben erstmal nur gezeigt, dass diese Sprache aufzählbar ist,
mit einer ziemlich grundlegenden Technik einfach zu sagen, okay,
ich simuliere das,
was davor liegt
Wie würdet ihr das entscheiden? Also bei DFAs war es
ja so, ich gebe dem das Wort W vor,
ich lasse es arbeiten und bin fertig.
Wie würdet ihr das entscheiden
Naja, ihr könntet einen Zähler für die Schritte einbauen,
ne? Wir könnten ja sagen,
wenn das Wort weh die Länge N hat, dann,
boah, und sagen wir mal,
und K ist die Anzahl der Kantenübergänge, die so möglich sind.
Dann kann ja bei jedem Buchstaben maximal K Kark-Kantenübergänge auftreten. Ja,
dann gibt es irgendwie vielleicht so eine Schranke N-Hoch-K,
nach N-Hoch-K-Schritten muss ich auf jeden Fall akzeptiert haben.
Dann simuliere ich nur irgendwie alle Rechnungen der Länge N-Hoch-K oder so,
wenn einer dabei ist, akzeptiere ich, sonst akzeptiere ich nicht.
Klappt aber nicht. Rechnung könnte viel,
viel länger sein, weiß man vorher nicht
Könnte ich nur machen, wenn ich wüsste,
dass die Toury-Maschine auf jeden Fall nach so und so vielen Schritten irgendwie akzeptiert.
Zeichnung in der Luft? Wenn ich Kreise ausschließen kann oder so. Ja,
das Erstaunliche ist jetzt, dass man zeigen kann,
dass das nicht geht, dass das zwar aufzählbar ist,
aber dass es nicht entscheidbar ist.
Ja, das ist also keine Touring-Maschine und auch kein anderes Programm gibt,
das bei Vorlage einer Touring-Maschine und einem Eingabewort W entscheiden kann,
ob die Touring-Maschine anhält oder nicht.
Und das Problem ist deswegen so wichtig, weil man zeigen kann,
dass ich mit dem Computer eine Touring-Maschine simulieren kann, das ist relativ klar.
Und auch andersrum, dass ich mit einer Touring-Maschine jeden möglichen Computer simulieren kann.
Also zumindest die Berechnungsmodelle, die bei uns so im Moment
irgendwo im Kosmos herumflattern. So von Neumann Architekturen,
Pipelining, all solche Geschichten kann ich alles damit machen.
Sprich, das Problem lässt sich meppen auf das Problem gegeben,
ein Programm in C oder ein Programm in Java oder was auch immer.
Terminiert das oder nicht, hält das an oder nicht.
Gibt das die korrekte Ausgabe oder nicht? All die Probleme
sind unentscheidbar. Also ihr könnt zwar einen Compiler schreiben,
dem ich irgendwie ein Stück,
oder das ist ja eigentlich der Parser, ne,
könnten Parser schreiben, dem ich ein Stück C-Code gebe.
Und der sagt mir dann etwas in taktisch korrektes oder nicht.
Und sogar noch, wenn ich ihn gut programmiert habe,
wo der so in taktische Fehler ist, wenn ich welche gemacht habe.
Das kann ich machen. Ne. Du kannst auch in
C kein Programm schreiben, mit dem du testen kannst,
ob du in Endlosschleifen kommst oder irgendwie sowas.
Das geht auch nicht. Du kannst das Programm ablaufen lassen und dabei merken,
dass du in eine Endlosschleife kommst oder solche Geschichten bei bestimmten Eingabewerten oder sowas.
Das kann man machen, wenn du als Mensch da noch
mit drauf guckst. Du kannst aber nicht Programme schreiben,
denen ich ganz generell ein C-Programm vorlege und dann sowas frage,
wie liefert das Programm jemals True zurück, ja oder nein?
Sprich, terminiert das. Das kann ich nicht machen.
Oder auch kleiner gedacht, ich gebe euch ein C-Programm und
eine Methode in diesem C-Programm.
Also ihr habt da irgendwie eine Methode und ihr fragt,
ist ja irgendwie so, komisch wird die überhaupt mal aufgerufen.
Jetzt möchte man ja vielleicht ein anderes Zielprogramm haben,
dem ich das T-Programm geben kann und den Funktionsnamen und dass man irgendwann sagt so,
ja, diese Methode wird auf jeden Fall mal aufgerufen oder nein,
diese Methode wird nicht aufgerufen
Auch das kann ich nicht implementieren. Was ich implementieren kann,
das ist ja auch bei gängigen IDEs so drin, dass ihr irgendwie sehen könnt,
wird dieser Methodenname mal irgendwo im Source Code sind taktisch aufgerufen.
Das könnt ihr natürlich machen,
da brauche ich nur durch den Source Code durchgehen und irgendwie,
meine Funktion heißt irgendwie My Function und dann kann ich gucken,
wird My Function irgendwann mal aufgerufen, ja oder nein,
das kann ich machen, aber ich weiß nicht semantisch,
ob das wirklich passiert oder nicht.
So,
das als Einleitung
So, das Problem heißt auch manchmal, Halteproblem,
das richtige Halteproblem sehen wir nachher auch noch kurz.
Das hier ist eigentlich das Akzeptanzproblem, aber weil die so ähnlich sind,
nennt man die im Grunde genommen beide Halteprobleme.
Wie eben erwähnt, ist das unentscheidbar. Und ganz wichtig zur Bedeutung,
das kann man eigentlich nicht genug betonen oder hoch genug einschätzen.
Damit fallen quasi sämtliche Verifikationsprobleme, die irgendwie von Relevanz sind,
vom Himmel fallen, weg, kann man alle nicht lösen.
Was einen natürlich nicht davon abhält,
mit komischen Workarounds vielleicht doch irgendwelche Dinge zu machen,
aber das können wir uns später nochmal angucken
Erstmal geht das nicht. Beweis für Touring-Maschinen. Wir wollen zeigen,
dass die Sprache nicht entscheidbar ist. Das wird jetzt ein,
der Beweis ist deswegen so schwer zu verstehen,
weil das Beweis mit Widerspruch ist und man versucht so einen Paradoxon herzustellen.
Und paradox sind irgendwie immer ein bisschen schwierig zu verstehen.
Hier arbeiten wir gleich damit, dass wir irgendwie Naturing-Maschine sich selbst
als Eingabe geben und dann muss sie irgendwie eins ausgeben,
obwohl sie auch eigentlich null ausgeben müsste und sowas.
Gucken wir uns mal im Detail an. Das,
was man machen muss, ist, wir nehmen an,
wir hätten eine Touring-Maschine, die dieses Problem entscheidet.
Also wir haben irgendwie so eine Touring-Maschine H,
die diese Sprache entscheidet
Das heißt, Haar funktioniert so, dass Haar die Eingabe MW akzeptiert,
wenn M das Wort W akzeptiert und Haar lehnt diese Eingabe ab,
wenn M das Wort W nicht akzeptiert.
Wichtig dabei ist, ich weiß nicht, wie Haar arbeitet.
Also Haar wird ganz bestimmt nicht mit Simulation arbeiten,
weil wenn M das Wort nicht akzeptiert,
könnte M ja unendlich lange laufen,
dann müsste Haar auch unendlich lange laufen und könnte nie ablehnen.
Also Haar muss noch irgendwas anderes machen als eine Simulation.
Mir ist aber im Grunde genommen egal, was ich behandle,
dieses Haar wie eine Blackbox. Ich nehme nur an,
das gibt es und wenn ich dem eine Touring-Maschine und ein Wort vorlege,
dann sagt die Ja oder Nein,
je nachdem,
ob die Touring-Maschine auf diesem Wort anhält oder nicht
Oder Äquivalent, ich nehme an, es gibt ein Java-Programm,
den ich ein anderes Java-Programm und Eingabewerte vorlegen kann und
mein neues Java-Programm sagt mir, das terminiert oder nicht.
Etwas kürzere Notation, damit man das gleich alles auf eine
Folie kriegt. H ist bei der Eingabe MW 1,
wenn M bei der Eingabe W1 ist und H ist bei
der Eingabe MW 0, wenn MW eben nicht eins ist.
Wichtig, hier habe ich jetzt nicht null geschrieben,
weil wenn M wenig akzeptiert, könnte das ja irgendwie eine Endlosschleife sein.
Das soll jetzt auch nur eine kurze Notation sein für
diese Schreibweisen hier, wenn M das Wort akzeptiert,
wenn M das Wort nicht akzeptiert.
Also wir nehmen an, wir haben so eine Funktion H.
Jetzt kann ich mir hier eine andere Funktion schreiben,
die irgendwie mit H arbeitet.
Und zwar macht die folgendes. Die nennen wir jetzt D,
die nennt H als Subroutine. Und D kriegt als Eingabe
auch eine Touring-Maschine M und macht folgendes.
Ja, sie startet H mit der Eingabe M.M.,
dreht das Ergebnis von H um und gibt es aus.
Sprich, D kriegt als Eingabe einfach nur irgendwie ein Stück Programmcode und sagt dann,
okay, ich teste jetzt mal,
ob dieses Stück Programmcode mit sich selbst als Eingabe terminiert oder nicht
Ein typisches Beispiel eines Programms, dass man sich selbst vorlegen kann,
so ein Compiler oder sowas, da kann man sowas machen.
Das heißt, die von seiner Eingabe M ist eins,
wenn M die Eingabe M nicht akzeptiert und D von M ist 0,
wenn M die Eingabe M akzeptiert, ich wollte ja das Ergebnis noch umdrehen.
Insgesamt sieht das jetzt also so aus,
dass mit dem Haar ist das, was wir angenommen haben,
das existieren sollte, wenn das existiert,
dann können wir ganz einfach so eine Touring-Maschine D bauen.
Die tut nichts anderes als ihre Eingabe zu kopieren und dann beides eben der Touring-Maschine Haar vorzulegen.
So, und wenn man jetzt aber Dieser Touring-Maschine D,
die halt existiert, wenn Haar existiert,
wenn wir die jetzt sich selbst als Eingabe geben, was müsste dann passieren?
Jetzt kann man hier überall, wo in M steht,
ein D hinschreiben, also DVD ist gleich eins,
wenn D von D ungleich eins ist,
D von D ist gleich null, wenn D von D gleich eins ist.
Sprich, so müsste das aussehen. Das kann es irgendwie
nicht geben. Die müsste ja sagen, wenn sie Nein
sagen müsste und nein, wenn sie Ja sagen müsste.
So, und der einzige Schritt, wo wir was Komisches
gemacht haben, war, als wir angenommen haben,
das Haar existiert.
Alle anderen Schritte sind okay
Wenn ich annehme, das H existiert,
dann kann ich so eine Methode D schreiben,
wenn ich so eine Methode D habe,
die irgendwie eine Thuring-Maschine nimmt als Eingabe,
dann kann ich dir auch D, was ja auch eine Thuring-Maschine ist,
als Eingabe vorlegen.
Und dann laufe ich aber in Widerspruch. Und wie gesagt,
das Einzige, was ich vermutet habe, war,
ihr wohl angenommen habt, war eben das H existiert.
Naja, den kann H eben nicht existieren. Und wenn
H aber nicht existiert, dann kann keine Thuring-Maschine existieren,
die dieses Haltepro, dieses Akzeptanzproblem entscheidet.
Sprich, es ist aufzählbar,
aber nicht entscheidbar
Schön paradox. Als Programmcode, wenn man das jetzt irgendwie
... Ohne, dass das jetzt sind taktischen Ansprüchen genügen muss.
Wenn ihr da auch vermutet, die Funktion oben,
dieses, hier reagieren noch andere Dinge.
Spannend. Na gut, die Funktion, oh
Kill All. Die Funktion ganz oben. Das ist die,
wie beim, wie diese Touring-Maschine Haar,
von der wir mal annehmen, dass die existiert.
Das heißt, wir haben eine Methode, Returns two,
die nimmt halt als Strink einen Funktionsnamen und als anderen Strink den Input dieser Funktion.
Und die sagt, ja, wenn die Funktion auf Input
eben Two zurückrückliefert und sonst sagt sie halt, nein.
Und auch da, da steckt auch drin,
Returns for is otherwise, also sprich,
wenn die Funktion Function auf Input nicht True zurückliefert,
sondern vielleicht falsch zurückliefert oder in einer Endlosschleife landet oder irgendwie sowas,
dann würde die Funktion Return True auf jeden Fall vor Ort zurückliefern.
Kann also auch wieder nicht mit einer Simulation arbeiten,
sondern muss das
irgendwie anders machen
So, die Funktion kriegen wir irgendwie aus einer Library.
Das heißt, du wirst nicht, wie die intern aussieht,
das ist auch egal, die kriegen wir irgendwie.
Jetzt kann ich mir diese etwas skurrile Methode da drunter schreiben,
die genau dann True zurückliefert, wenn ihr Eingabe wird,
auf sich selbst aufgerufen, ablehnt.
Returns falls darf da nicht stehen. Returns True, wo
ich monien? Ja, genau. Das ist falsch.
Das da
Weil, wir wissen ja gar nicht,
dass die vorher zurückliefert. Wir wissen ja nur,
wenn Function auf sich selbst als Eingabe false zurückliefert,
bedeutet das ja hier das Aserbise, sprich es wurde nicht Schuh zurückgeliefert.
Sprich, sie akzeptiert nicht. Sie liefert nicht Schuh zurück
. Und dieses B, den Wert B,
den kann ich umdrehen, dann liefere ich genau das Gegenteil zurück.
Sage ich also genau dann True, wenn Function Function eben nicht akzeptiert und false sonst.
Naja, und jetzt kann man sich hier unten überlegen,
Das ist jetzt die Touring-Maschine, ne, das hier ist die Touring-Maschine D.
Und das ist jetzt die Methode, die D auf sich selbst aufruft.
Die ruft jetzt hier diesen länglichen Methodennamen mit sich selbst als
Eingabe auf. Das wird beides hier reingetan. Ja,
und jetzt passiert genau das Gleiche wie eben bei den Touring-Maschinen.
Wenn jetzt Function und Function nicht akzeptiert, dann wird hier Too zurückgeliefert.
Und dann kriege ich hier den Wert True raus,
obwohl ich da oben ja gesagt habe, äh Quatsch,
wenn Function nicht akzeptiert, kriege ich einen Falls raus, genau.
Und der Wert wird umgedreht, dann habe ich einen True,
dann kommt hier also ein True hin,
wobei das ja von der Methode behauptet wurde,
dass das Falls ist.
Passt irgendwie nicht. Und bei der Falls-Argumentation genauso. Also
auch da wieder irgendwas komisches muss mit dieser Library-Funktion dann nicht stimmen.
Die kann so dann nicht funktionieren. Sprich,
auch so eine Methode wie die da oben,
die irgendwie in String und die irgendwie einen Funktionsnamen und den Input für diesen Funktionsnamen kriegt,
auch die kann er irgendwie nicht existieren mit der gleichen Begründung
Bahnbrechende Arbeiten von Thuring, Church und Gödel in den 30ern des letzten Jahrhunderts. Warum beanbrechend,
weil man zu Beginn des letzten Jahrhunderts,
also 1900 und so weiter, da hat man noch gedacht,
dass man alles irgendwie ausrechnen können müsste,
dass man jeden Satz mathematisch beweist,
also dass man für jede Aussage entweder mathematisch sagen können muss,
gilt oder gilt nicht, so, also ja oder nein.
Und dann kamen eben die drei eben genannten Herren und haben
das ordentlich zerpflückt,
so in den 30ern
Und Thuring gilt dann ja auch als einer der Urväter der Computerarchitekturen
überhaupt so der Computerwissenschaften.
Fragen dazu. Wo zeige ich mich denn noch?
Fragen. Wer hat mal Thuring-Maschine gegoogelt?
Oder bei Wikipedia nachgelesen
1, 2, 3. Wer hat daraufhin auf,
da steht dann bestimmt sowas,
wie ich bin mir gerade nicht ganz sicher, was da steht,
aber steht da irgendwie sowas wie die Touring-Maschine wurde von Alan Touring erfunden,
erdacht, irgendwie sowas.
Wer hat dann auf Alan Touring geklickt? Auch allen,
zwei. Einer. Was wisst ihr über Alan Touring?
War was? Ja. Ja. Unter anderem
, genau. Wer weiß noch was über ihn
Beatley. Ja. Ja, genau. Der,
die höchste Auszeichnung in der Informatik oder in der eben Computer-Science,
wenn du im Angelsächsischen Raum durch die Gegend läuft,
die höchste Auszeichnung ist nach ihm benannt,
der Touring im Wort, Preis, Touring-Medaille.
Und Touring hat wirklich, also das war wirklich Bahnbrechen zu der Zeit,
was der gemacht hat, der hat sich auf dem Gebiet der künstlichen Intelligenz rumgetrieben.
Es gibt auch diesen berühmten Touring-Test, der nach ihm benannt ist,
wo man ja irgendwie sagt so,
Kannst du ein Chatbot oder was auch immer schreiben,
der so tut, als wäre er ein normaler Mensch,
ohne dass das Gegenüber merkt, dass das ein Mensch ist oder nicht,
so, das ist so der Touring-Test.
Ja, also in der KI aktiv,
dann hier in der Berechenbarkeitstheorie, Logik und so weiter und
eben auch dann insbesondere im Zweiten Weltkrieg einer der ganz großen Kotknacker.
Es gab in England so eine Gruppe von Leuten,
die waren in so einer Villa, Bleachie Park,
Bleach Park und haben kurz geknackt,
unter anderem eben diese Enigma-Maschine von den Deutschen
Wen ihr euch damit mal beschäftigt,
das liest sich etappenweise wie ein James-Bond-Roman,
weil dann auch irgendwie, ich glaube, eins,
zwei englische Agenten haben irgendwie so ein deutsches Schiff gekapert und da dann
irgendwie so eine Maschine mitgenommen und dann mussten sie das nachher aber so aussehen lassen,
als ob die Maschine ja mit dem Schiff untergegangen ist oder ich weiß nicht was,
weil die Deutschen ja nicht wissen sollten,
dass die Engländer so eine Maschine haben und nünne.
Naja, dann haben sie nachher die Kurz geknackt und so über die Jahre,
also eins der Probleme war, dass,
oder sozial gesehen eins der Probleme war,
dass sie das lange Zeit unter Verschluss gehalten haben.
Also, dass man irgendwie bis in die 70er Jahre,
durfte man dazu nichts sagen und auch die ganzen Leute,
die da gearbeitet haben, haben halt immer gesagt so,
Ich habe ehrlich gesagt keine Ahnung, was die erzählt haben.
Fehlt haben die erzählt, sie haben irgendwie während des
Zweiten Weltkriegs Grundgrundschüler unterrichtet oder so, keine Ahnung.
Aber die haben auf jeden Fall echt andere Sachen gemacht.
Und dann irgendwann in den 70ern wurde das Publik.
Und dann wurden die eben nach, danach auch dementsprechend geehrt.
Und mittlerweile gilt das, ob es kriegsentscheidend ist oder nicht
, darüber streiten sich so ein bisschen die Historiker.
Man ist auf jeden Fall sich sicher,
dass es mindestens den Krieg um Jahre verkürzt hat,
weil die Engländer damit eben diesen U-Bootkrieg ziemlich dann auf ihre Seite nachher gezogen haben.
Und dann ging das mit den Versorgungslinien alles besser und so weiter und so weiter.
Und einige sagen halt auch, es wäre irgendwie kriegsentscheidend gewesen
Und diesen guten Mann, Thuring,
den hat man dann irgendwann in den frühen 50ern.
Da gab es dann in England ziemlich starke Homosexualitätsgesetze.
Und er war halt homosexuell. Und dann haben sie gesagt,
okay, dann jetzt gab es irgendwie so total schräge Hormontherapien.
Und dann hat man ihn in dieser Hormontherapie unterzogen und
relativ kurz danach hat er sich dann umgebracht.
Selbstmord gemacht. Genau. Und in 2011 oder 12
gab es eine Rede von dem damaligen englischen Premierminister,
der sich dann endlich öffentlich dafür entschuldigt hat,
wie er eben,
wie Thuring eben von der englischen Regierung behandelt hat,
Und am 24.12. des letzten Jahres gab es das königliche Pardon.
Damit ist er auch offiziell, ich weiß nicht,
ob man dann offiziell unschuldig ist, aber offiziell hat England
sozusagen eingestanden, dass sie da irgendwie Mist gemacht haben.
Ja, wer das mal lesen will,
also alleine schon die Wikipedia-Seite lohnt sich,
es gibt ansonsten von Name vergessen, es gibt so einen Autor,
der hat sich, glaube ich, primär mit Tourings Leben beschäftigt.
Da gibt es irgendwie so einen 600-Seiten-Wälzer.
Biografie zu Touring. Das ist auch echt schön.
Also insbesondere wegen diesem ganzen Krypto- und so weiter Kram ist
das echt beeindruckend
So, das zu Touring. Wir müssen ja auch mal
irgendwie über die Großen in unserem Gebiet reden.
Ah, noch eine weitere Sprache. Die Sprache LD.
Wir kennen ja jetzt reguläre Sprachen. Wir kennen kontextfreie Sprachen
. Wir kennen entscheidbare Sprachen. Wir kennen jeweils Sprachen,
die in der nächst höheren Sprachfamilie sind, aber in der da drunter nicht.
Sprich, wir wissen schon, dass das alles irgendwie echte Teilmengen-Beziehungen sind.
Jetzt kommt noch eine Sprache, eben diese Sprache LD,
von der man sogar zeigen kann,
dass die nicht mal mehr aufzählbar ist.
Wie macht man das? Man überlegt sich zuerst,
dass man alle Worte in so einem Alphabet
irgendwie aufzählen kann
Also aufzählen soll, in diesem Fall bedeuten nicht Turing-Maschine,
die das akzeptiert, sondern dass wir die hintereinander wegschreiben kann.
Ich schreibe zuerst alle Worte der Länge eins auf,
dann alle Worte längen zwei,
dann alle Worte der Länge drei und so weiter und das
mache ich immer in so einer lexikalischen Ordnung, dann klappt das.
Kann man auch mit Codierung von Turing-Maschinen machen und mit Codierung von Wörtern.
Genauer nennt man das nachher Gydalisierung und solche Sachen,
wenn ihr das mal lesen wollt, könnt ihr das machen.
Was für uns wichtig ist, ist nur,
ich könnte die Touring-Maschinen irgendwie aufzählen,
ich kann von der ersten, zweiten, dritten,
vierten Touring-Maschine und so weiter reden oder von einem ersten,
zweiten,
dritten,
vierten Wort
Und dann kann ich mir so eine Sprache LD,
das D steht für diagonal, sehen wir gleich, warum.
So eine Sprache kann ich mir definieren,
da sollen eben die Wörter WI drin sein,
die gerade nicht in der von AI akzeptierten Sprache sind.
Als Tabelle, wenn ihr oben irgendwie eure Touring-Maschinen der Mainz und 2,
M3, M4, M5 und so weiter hinschreibt,
hier die Wörter wie 1,42, wie 3,
wie 4,
wie 5,
dann ist für die Sprache LD gerade
die hauptdiagonale wichtig
Und ihr guckt immer, also eins soll bedeuten,
wie eins ist in der von M1 akzeptierten Sprache enthalten,
W2 ist nicht in der von M2 akzeptierten Sprache enthalten,
W3 ist in der von M3 akzeptierten Sprache enthalten und so weiter.
Und die, wo in einem Null steht,
da ist das Wort WI ja nicht in MI drin,
sprich hier, WI ist nicht in L-A-I drin.
Und die nehmt ihr in L-D rein.
Also hier das Wort W2 kommt rein und das Wort W4
kommt rein und die Worte wie eins und W3 nicht.
Kann man sich so definieren? Anders als das entscheidbar,
anders als dieses Halteproblem eben,
ist das eine relativ nutzlose Sprache,
aber um mal zu zeigen,
dass es eine gibt,
die eben nicht mehr mehr
aufzählbar ist
Da kann man jetzt nämlich zeigen,
es müsste jetzt so eine Touring-Maschine, die LD akzeptiert,
die müsste ja irgendwie so ein MJ in der Matrix sein.
Sprich, beispielsweise dieses M3, nehmen wir mal ein M3,
würde LD aufzählen. Dann werdet ihr irgendwie einen Widerspruch kriegen,
weil wenn hier eine Eins steht, dann steht hier eine Null.
Und wenn hier eine Null stehen würde, dann würde da
ja ein Ja stehen. Also dann habt ihr so einen Widerspruch,
so ist das Wort jetzt drin oder nicht in der Sprache.
Ihr kommt auf jeden Fall zu so
einem Widerspruch
Also sein müssen und dann wird es ein Widerspruch mit VJ geben,
akzeptieren und nicht akzeptieren, genauer angenommen, LD wäre aufzählbar,
dann gibt es so eine Touring-Maschine aus der Aufzählung,
die diese Sprache akzeptiert.
Sei das mal AJ und jetzt betrachten wir dieses Wort WJ
und dann muss entweder WJ in LD drin sein oder eben nicht.
Erster Fall, wenn wir J in LD enthalten ist,
dann ist WJ nach der Definition von LD hier oben ja nicht in LAJ.
Wenn wir aber gerade angenommen haben, dass LAJ das Gleiche wie LD ist,
Dann wärst du also auch nicht in LD drin.
Ja, und dann haben wir hier irgendwie stehen,
WJ ist in LD, dann dann WJ nicht in LD.
Kann irgendwie nicht sein, ist irgendwie ein Widerspruch. Andere Richtung,
wenn wir J nicht in LD drin ist,
dann ist es nach der Annahme,
dass LD das gleiche ist wie LRJ, eben auch nicht in LRJ drin.
Wenn es aber nicht in LRJ drin ist,
dann müsste es in LD drin sein.
Habt ihr auch wieder einen Widerspruch. Ergo kann das nicht aufzählbar sein,
es kann keine Touring-Maschine geben, die diese Sprache LD akzeptiert.
Das stört den Praktika jetzt eher weniger,
weil dafür braucht man irgendwie auch keine,
das davor ist irgendwie tragischer
Heißt übrigens Diagonalisierungstechnik, weil man eben hier in diesem,
in dieser Matrix, sich diese Hauptdiagonale anguckt.
Man kann auch das Halteproblem von eben,
das kann man auch in so einer Matrik-Schreibweise sich angucken und
dann kann man da im Grunde genau auch die gleiche Technik benutzen.
Allgemein, wenn ihr irgendwas so habt, wo ihr Dinge abzählen wollt,
dann kann man die oft ganz gut in so einer Matrix irgendwie anordnen.
So, LD ist nicht mal aufzählbar, ist aber abzielbar,
abzielbar bedeutet, entweder ist sie endlich,
ist sie in dem Fall nicht oder es gibt eben eine Bieraktion von den natürlichen Zahlen.
Für diese Sprache LD kann man tatsächlich eine angeben. Das heißt,
wir haben so eine Kette von Sprachfamilie,
jetzt die regulären Sprachen, die kontextfreien Sprachen,
die entscheidbaren Sprachen, die aufzählbaren Sprachen und dann kommen die
abzählbaren Sprachen
Und wenn man sich jetzt noch dafür interessiert,
noch was zu finden, was dann nicht mal mehr abzählbar ist,
das sind eben zum Beispiel die reellen Zahlen,
habt ihr vielleicht ein DM gehabt?
Weiß ich genau. Oder ein Anal ist es jetzt.
So. Das ist jetzt das Ziel.
Weitere Probleme als unentscheidbar nachweisen. Habt ihr bis hierhin
denn Fragen
Wer fühlt sich jetzt schon völlig hingerichtet, fertig mit den Nerven
und so weiter? Ja, das ist ja noch überschaubar.
Wo hakt es denn? Oder ich trage mal anders,
wer von den Ebenen, die sich eben gemeldet haben,
fühlt sich so, was habe ich für eine Formulierung eben benutzt,
hingerichtet, fertig mit den Nerven und so weiter.
Wer fühlt sich so fertig, dass er nicht mal mehr
in der Frage ist, eine sinnvolle Frage zu formulieren?
Auch so viele. Oh, weio, wei.
Weißt du
Hm. Na, guck nicht so erwartungsvoll,
ich mach noch keinen Feierabend, das ist noch zu früh.
Also die wichtig, die wichtigen Punkte,
die ihr mitnehmen solltet, um das mal zusammenzufassen,
die wichtigen Punkte, die ihr mitnehmen solltet.
Erstens, ja, erstens, die englische Regierung hat komische Dinge mit Turing gemacht.
Solltet ihr alle mitnehmen, ist wichtig. Zweitens,
eine Sprache ist entscheidbar, wenn eine Turing-Maschine akzeptiert, der ich ein Wort vorlegen kann
Und die sagt dann auf jeden Fall, ja oder nein?
Also sprich, die bleibt stehen und sagt entweder, ja,
dieses Wort gefällt mir, sprich, ich möchte das akzeptieren oder nein,
dieses Wort gefällt mir nicht, ich möchte das nicht akzeptieren. Äquivalent dazu eine Java-Methode,
die bei jeder Eingabe, die irgendwie okay ist,
also wenn ich da jetzt in die Argumentliste schreibe,
stringen und da kommt irgendwie jemand mit dem Intager Arry,
dann muss die natürlich nichts machen, so,
aber wenn man da jetzt wirklich mit dem Ding dann kommt,
dann, und die Java-Methode hat ein Bultchen, Rückgabewert,
dann möchte ich den auch irgendwann erreichen können und ich möchte sinken,
voll Ja oder Einsagen sein,
weil True da vorwärts zurückliefern.
Das ist irgendwie etwas,
was man auch da immer haben möchte,
man möchte eben nicht,
dass ich irgendwie in einer Methode
eine Endlosschleife komme und da irgendwie nichts passiert
So, das ist entscheidbar, aufzählbar, schwächer.
Ich muss bei 9-Instanzen nicht anhalten. Ich sage zwar ja bei Worten,
die in der Sprache drin sind,
aber wir wollten die nicht in der Sprache drin sind,
sage ich eben nicht zwingend nein.
Bei einigen terminiere ich vielleicht aber eben nicht bei allen. Problem dabei ist dann,
wenn ich dem jetzt ein Wort vorlege und die Touring-Maschine arbeitet,
dann weiß ich immer nicht,
kommt da jetzt nochmal das Jahr oder eben nicht.
So, das ist entscheidbar und aufzählbar,
das sollte die auf jeden Fall mitnehmen.
Dann sollte die noch mitnehmen,
es gibt unentscheidbare Probleme,
eben dieses Halteproblem
Beim Halteproblem solltet ihr doch wissen, was das ist und was
die Bedeutung von dem Halteproblem für die Programmierung an sich ist.
Und ihr solltet einfach nur so als Gimmick noch wissen, okay,
es gibt auch nicht aufzählbare Probleme. Die sind dann aber,
wie gesagt, das ist dann eher so theoretische Spielerei,
das braucht man dann nicht mehr machen, aber auch noch mal schön zu wissen.
Aber in diesem Kosmos von entscheidbaren Problemen und das ist dann
eben auch nicht entscheidbare Probleme gibt, das ist wichtig.
Und was eben auch wichtig ist, ist,
dass ihr ein Gefühl dafür entwickelt, das kommt jetzt,
welche Probleme auch nicht entscheidbar sind und wie man das nachweisen kann,
warum ist das wichtig,
wenn ihr irgendwas implementieren sollt und das geht gar nicht,
braucht man
gar nicht
erst anfangen
Aber man will vielleicht zeigen, dass das auch nicht geht.
Oder begründen können, dass das nicht geht. Jetzt
wäre das, was wir bei diesem Halteproblem gemacht haben,
also immer irgendwie zusammen Paradoxon zu kommen, das wird ziemlich anstrengend.
Gibt einen einfacheren Weg, nachzuweisen, dass Probleme unentscheidbar sind,
wenn man denn schon mal welche hat.
Und mindestens eins haben wir ja jetzt schon mal. So,
wenn man eine Spreiz, ihr kriegt eine Sprache L und
ihr wollt zeigen, dass die unentscheidbar ist.
Übliches Vorgehen, wir nehmen an El Vereen schaltbar,
benennen die Turing-Maschine, die diese Sprache L entscheidet,
So. Und unter Nutzung von M,
M ist jetzt irgendwie eine Subroutine, die benutzen können,
konstruieren wir jetzt, uns jetzt einen Algorithmus,
der ein Problem, von dem wir schon wissen,
dass es nicht entscheidbar ist, plötzlich als entscheidbar nachweist.
Es ist ein Widerspruch, kann M also nicht existieren.
Die Idee ist also, wenn wir jetzt ein neues Problem kriegen,
von dem wir zeigen wollen, dass es unentscheidbar ist,
sagen wir, okay, nehmen wir mal an,
das wäre entscheidbar, Bastel, Bastel, Bastel.
Oh, ich kann das Akzeptanzproblem von eben entscheiden oder das Halteproblem oder so.
Da weiß ich aber schon, dass das nicht geht,
also kann meine angenommene Maschine auch nicht existieren.
Also ist auch das Problem unentscheidbar
Nennt man eine Reduktion und sagt eben,
dass man das unentscheidbare Problem auf das neue Problem reduziert hat.
Ist in dem Kontext hier nicht so schick zu sehen,
sehen wir nachher, wenn es um Komplexität geht,
noch ein bisschen schicker.
Nur, dass ihr den Begriff schon mal gehört habt,
Reduktion. Beispiel. Das Eigentliche Halteproblem. Eben haben wir
das ja auch schon Halteproblem gelernt, streng genommen,
weil das ist das Akzeptanzproblem.
Das hier ist das eigentliche Halteproblem gegeben, eine Touring-Maschine,
die auf W anhält.
Aussage des Satzes,
dieses Problem ist nicht entscheidbar
Wir nehmen an, es wäre entscheidbar und wir basteln uns
eine Touring-Maschine, die das Akzeptanzproblem löst.
Das Akzeptanzproblem war ja vorgelegt, dieses MW akzeptiert M,
das wir ja oder nein.
Wie könnt ihr eine Touring-Maschine, die das Problem da löst,
benutzen,
um das Akzeptanzproblem zu lösen
Ja. Genau. Perfekt. Wenn ich das Problem vorhin war,
ja, bei diesem Akzeptanzproblem, nicht unbedingt die Ja-Instanzen,
sondern die Nein-Instanzen, bei denen wir halt nicht wussten,
hält die an oder nicht.
Das, was wir jetzt machen können,
wenn ich so eine Touring-Maschine dafür habe,
Jetzt kriege ich ein MW und ich will entscheiden,
akzeptiert M das W ja oder nein?
Jetzt lege ich dieses MW der Turing-Maschine für TM Halt davor.
Dann weiß ich, sie hält oder sie hält nicht.
Wenn sie nicht hält, dann akzeptiert sie auch nicht.
Also kann ich nein sagen. Wenn sie aber anhält,
dann kann ich sie simulieren. Und dann sage ich eben
das, was sie sagt, ja oder nein.
Also angenommen TM halt wäre entscheidbar, sei harne Turing-Maschine,
die diese Sprache eben entscheidet. Exkonstruieren wir uns eine neue
Turing-Maschine S, die eben dieses Problem TM Ack entscheidet,
von dem wir ja schon wissen, dass es nicht entscheidbar ist.
Funktioniert genauso, wie wir das eben kurz gesagt haben,
H entscheidet nach Annahme, diese Sprache und es arbeitet nun bei Eingabe MW wie folgt.
Und es soll eben das Problem entscheiden, ob MW akzeptiert oder nicht.
Wir starten zuerst H, also die Touring-Maschine dafür,
mit dieser Eingabe, wenn H ablehnt,
lehnen wir auch ab, weil wenn M auf wenig anhält,
kann MW auch nicht akzeptieren, akzeptiert H aber,
dann simulieren wir MFW.
Wir wissen auch, dass M terminiert,
weil H uns das ja gerade gesagt hat,
sprich bei dem dritten Schritt,
gibt es irgendwann
einen Schluss
Und wenn Emma eben akzeptiert, akzeptieren wir auch,
sonst lehnen wir ab. Und dann haben wir das Akzeptanzproblem entschieden,
da wissen wir aber, dass es nicht entscheidbar,
dann kann die Annahme nicht stimmen und die Annahme sagt eben,
dass ha, eine Touring-Maschine, dass die dieses Problem entscheidet,
also kann es so eine Touring-Maschine nicht geben.
Das war noch relativ einfach,
weil man da nicht viel machen musste,
sondern einfach nur einmal die Methode, die Subroutine,
die neue da aufrufen musste und dann eben das Ergebnis benutzt hat.
Hier wird es
schon schwieriger
Eine Touring-Maschine,
also begeben ist jetzt eine Touring-Maschine M und wir wollen gucken,
ob, wenn ich M auf dem Leon Band starte,
ob M dann irgendwann mal null ausgibt, ja oder nein.
Könnte man auch so machen, dass man sagt,
MW und dann irgendwie auf Wege startet gibt,
das jemals null aus, ja oder nein.
Auch das ist nicht entscheidbar. Ist auch ganz spannend,
weil das eben auch mit so Sachen zusammenhängt,
wie gegeben dieses Java-Programm gibt, das jemals Hello World aus,
ja oder nein.
Ist dann auch nicht entscheidbar, die Frage.
Präsenzaufgaben, mach dir ab morgen
in den Präsenzaufgaben
Ja. Da könnt ihr euch dann nochmal austoben.
Wie spät ist das jetzt? Haha. Nein, nein,
nein, nein. Ein letztes Problem, danach sind wir
aber fertig. Da wird es nämlich mal ein bisschen kniffliger.
Also das davor war ja auch schon schwierig zu verstehen,
aber die Beweise waren halt immer relativ kurz so.
Und hier wird der Beweis jetzt etwas umfangreicher.
Wir kriegen eine Touring-Maschine A und einen Zustand Kuh.
Und die Frage ist, ob Kuh ein nutzloser Zustand ist
Nutzloser Zustand soll einer sein, der niemals betreten wird.
Also im DFA könnte man, sind nutzlose Zustände die,
die gar nicht erreichbar sind.
Würde man die einfach raustun. Ist hier nicht so einfach,
weil ja gar nicht unbedingt klar ist, dass ich bei
irgendeinem eigenen Wort mal jemals in irgendeinem bestimmten Zustand komme.
Frage eng verwandt mit der Frage,
ob eine bestimmte Stelle in einem Java-Programm jemals erreicht wird.
Übrigens ganz spannend, weil dieses mit wird diese Stelle
im Java-Programm erreicht. Normalerweise macht man sowas ja so,
indem man irgendwie, man schmeißt die Vibagger an,
setzt da einen Breakpoint und lässt das Ding laufen
Das ist aber nicht die Frage,
ob das Java-Programm jemals diesen Punkt erreicht, sondern da steckt drin,
naja, ich habe das so und so programmiert.
Ich weiß, dass ich da hinkomme, setze ich mal
den Breakpoint, weil ab da will ich mir Dinge angucken.
Und dann simuliere ich das Programm, bis ich da bin.
Da wird ja nicht die Frage beantwortet, ob ich da jemals hinkomme,
sondern im Grunde genommen weiß ich schon, oder ich vermute,
dass ich bei den und den Eingabewerten da hinkomme und ich verifiziere das nochmal kurz.
Das ist eine ganz andere Aussage. Und insbesondere arbeitet das mit Simulationen.
Also wenn ich das dann simuliere und ich komme da nicht hin,
dann weiß ich nicht,
ob ich da wirklich nicht hinkomme oder ob ich gerade
nur irgendwie komische Eingabewerte benutzt habe oder komisch rumgeklickt habe oder
irgendwie sowas
So, angenommen, das wäre unentscheidbar. Angenommen,
es wäre entscheidbar, was rede ich denn da?
Wir wollen zeigen, dass es unentscheidbar ist, angenommen,
es wäre entscheidbar. Dann gibt es so eine Touring-Maschine,
A, US, die das Problem entscheidet.
Und damit wollen wir jetzt das Halteproblem entscheiden. Das ist
das, was man üblicherweise tut. Also man arbeitet meistens
gar nicht mit dem Akzeptanzproblem, sondern mit dem Halteproblem.
Das wollen wir machen. Und das ist jetzt ziemlich tricky,
weil da muss man jetzt irgendwie die Touring-Maschinen wirklich anfassen und manipulieren.
Bei diesem Halteproblem kriegt er ja eine Touring-Maschine und ein Eingabewort.
Und ihr wollt wissen, Ob die Touring-Maschine anhält oder nicht.
Und diese Touring-Maschine M, die man da vorgelegt kriegt,
die kann man jetzt so manipulieren,
dass da ein Zustand drin ist, der benutzt wird,
dann und nur dann, wenn die eigentliche Touring-Maschine M anhält.
Wie könnt ihr das machen? Eine Touring-Maschine hält ja genau dann an,
wenn sie in irgendeinem Zustand ist und da keine Kanten mehr rausführen oder zumindest nicht kannten,
mit denen sie jetzt was machen kann.
All diese Kanten, die da jetzt fehlen,
die fügt ihr hinzu zu so einem neuen Zustand.
Das heißt, wenn die Touring-Maschine hier angehalten hat in diesem Zustand
, dann kann unsere neue Touring-Maschine noch diesen Schritt machen
Sprich, die hält genau dann an, wenn das hier
kein nutzloser Zustand ist. Das ist die Kernidee. Also,
zu einer gegebenen Türemaschine M mit Zustandsmenge Z und Bandalphabet Gamma
konstruieren wir uns eine neue Touring-Maschine am Strich.
Die kriegt diesen neuen Zustand Z neu.
Der soll nachher diese Geschichte mit nutzlos oder nicht sein.
Und jetzt kommt eben die Geschichte mit den neuen Kanten.
Wenn wir jetzt in irgendeinem Zustand Z sind,
in M und ein Symbol X lesen,
und für das gibt es jetzt aber keinen Übergang,
dann würde die Maschine anhalten.
Und dafür fügen wir uns jetzt
eine neue Kante hinzu
Die eigentlich nichts tut, aber einen Schritt nach rechts machen mit
dem Lese-Schreibkopf und eben in diesem Zustand Z neu geht und da anhält.
Die tut eigentlich nichts anderes, als noch diesen Schritt zu machen.
Insbesondere machen wir das für jedes Symbol, also auch hierfür das Schweinegatter,
falls ich gerade auf dem leeren Symbol bin.
Und jetzt ist es eben wichtig, wenn Am hält,
dann kann am Strich noch den Übergang zur Zeit neu machen und hält dann dort an.
Am hält also genau dann in irgendeinem Zustand,
wenn im Strich ein Z neu anhält.
So. Das ist immer eine Viertelstunde vor Schluss so so ein
langsamer Fluss aus dem Raum einsetzt.
Gibt das so fünf Minuten Vorschluss irgendwie in der Mensa,
was umsonst oder so? Ich stehe das gar nicht.
Was habt ihr noch? Ja, du musst dann Prioritäten setzen.
Ich kann das ja verstehen. Ich könnte das auch verstehen,
wenn ihr irgendwie in der Vorlesung alle weinend weggelaufen wärt oder so.
Es hätte mich zwar hart getroffen, aber das hätte ich
ja verstanden
Also, zu MW können wir außerdem noch so eine Türmaschine im Strichstrich konstruieren,
die bei jeder Eingabe einfach das Band löscht und dann wie auf einem Strich startet.
Sprich, die Tour im Maschine im Strichstrich ignoriert quasi ihre Bandentschrift,
das ist ihr egal, und konstruiert dann aus M
diese Touring-Maschine im Strich und startet im Strich auf weh.
Das sind die beiden Ideen, wenn M auf weh hält,
dann hält am Strichstrich bei jeder Eingabe in Set neu,
wenn M nicht auf weh hält,
dann besucht er im Strichstrich Z
neu niemals
Welche Worte im Strichstrich akzeptiert, ist relativ egal,
aber im Strichstrich würde eben alle Worte, würde auf allen Worten anhalten,
wenn M auf W hält und sonst eben auf gar keinem.
So, und bei Eingabe MW,
konstriere aus MW die Touring-Maschine im Strichstrich,
starte die angenommene Touring-Maschine für dieses Use-Lestate auf M-Strich-Z neu.
Und jetzt war ja die Idee, Z9 wird genau dann
besucht, wenn M auf W anhält.
Sprich, wenn AOS akzeptiert,
dann ist Z9er
nutzloser Zustand
Und dann hält M eben nicht auf weh. Und wir lehnen ab.
Lehnt es aber ab, dann ist Z9 nicht nutzlos.
Was bedeutet, dass MFW anhält? Und wir akzeptieren.
Dann entscheiden wir über das Halteproblem, kann nicht sein,
also existiert diese Touring-Maschine. AUS nicht, also existiert keine Touring-Maschine,
die Use-Lass Date entscheidet, also ist das Problem.
Unentscheidbar. So, der war anstrengender.
Was wir jetzt gemacht haben die ganze Zeit,
war uns über diese Hierarchie von Sprachfamiliengedanken zu machen.
Und im Moment insbesondere über entscheidbar oder nicht.
Also ist ein Problem lösbar,
ja oder nein
Das, was in der Praxis sehr wichtig ist,
ist eben nicht nur zu wissen,
ist das Problem entscheidbar ja oder nein,
sondern eben auch die Kosten von so einem Problem.
Wie lange brauchen wir, also wie viel Zeit oder wie
viele Schritte und wie viel Speicherbedarf haben wir da?
Und weniger ist in beiden Fällen natürlich gut.
Gucken wir uns morgen an, kann man auch erst mal
wieder auf Turing-Maschinen einführen und dann eben verallgemeinern für Rechnermodelle.
Hatte die O-Notation schon mal gehört, Landau-Notation, O-Notation.
Landau-O-O-O-O-Fon-End-Quadrat, O von End-My Login und sowas.
Da spielt da nachher noch eine Rolle.
Da gucken dann so zwei Turing-Wort-Preisträger um die Ecke.
So, das haben wir heute gemacht. Entscheidbar,
aufzählbar und eben hier jeweils gesehen, dass die Sprachfamilien echt ineinander enthalten sind,
wobei wir den Schritt hier von CF nach entscheidbar.
Das haben wir streng, da haben wir streng genommen nur
die Teilmengenbeziehung gezeigt. Nicht, dass die echt ist,
aber man kann eben zeigen, dass das Problem A,
hoch in B, hoch in C, hoch enden,
was eben nicht kontextfrei ist, dass das eben entscheidbar ist.
Und auf dem Aufgabenzettel sollte ja zumindest zeigen, dass es,
man kann sein, das Entscheidbar sind auf dem Aufgabenzell,
sollte zumindest zeigen, dass es aufzählbar ist.
Ja, das war's.
Dann sehen wir uns morgen