Vorgänger mittels Turing-Maschine berechnen
2007-09-23 22:58
Fred
Beim Lösen einer recht simplen Aufgabe bin ich auf ein paar Fragen gestoßen. Zunächst die Aufgabe: Es soll eine Turing-Maschine beschrieben werden, die zu einer unär kodierten Zahl (n wird als 0^(n+1) kodiert) den Vorgänger liefert bzw. 0, falls die Eingabe 0 ist. Meine erste Lösung sah so aus:
[img]http://img442.imageshack.us/img442/5626/predyr6.jpg[/img]
s ist der Startzustand, das habe ich vergessen zu markieren.
Ich gehe also einfach mit dem Lesekopf eine Position nach rechts. Falls ich am Ende des Bands angekommen ist, war die Zahl bereits 0, und ich gehe wieder eine Position nach links.
Ist das so in Ordnung? Sprich: kann das Ergebniswort irgendwo auf dem Arbeitsband anfangen? Meine eigene Vermutung ist nein, denn q_0 w -*-> q_e v bedeutet ja, dass links vom Lesekopf nichts stehen darf. Richtig?
Darf ich dann einfach das erste Zeichen mit einem Schweinegatter ersetzen? Dann muss ich die 0 natürlich ggf. neu erzeugen, weil ich sie ja kaputt gemacht habe. Also so:
(|s) –0#R–> (p|) –##L–> (q) –#0R–> (o) –##L–> (0|)
Ich könnte mir einen Schritt sparen, wenn ich die 0 eine Position weiter rechts schreibe:
(|s) –0#R–> (p|) –#0L–> (q) –##R–> (0|)
Ist das in Ordnung, wenn ich am Anfang etwas vom Arbeitsband lösche? Oder muss ich erst ganz nach hinten gehen, um dann die letzte 0 zu löschen?
Ich bin mir nicht ganz sicher, ob die letzte Turing-Maschine (die mit den vier Zuständen) linear beschränkt ist. Ich denke nicht.
Pro: Das Ergebnis ist nicht größer als die Eingabe.
Kontra: Ich schreibe an Stellen, die vorher ungenutzt waren.
Wäre nett, wenn jemand meine Zweifel aus dem Weg räumen könnte. Georg? [25]
[img]http://img442.imageshack.us/img442/5626/predyr6.jpg[/img]
s ist der Startzustand, das habe ich vergessen zu markieren.
Ich gehe also einfach mit dem Lesekopf eine Position nach rechts. Falls ich am Ende des Bands angekommen ist, war die Zahl bereits 0, und ich gehe wieder eine Position nach links.
Ist das so in Ordnung? Sprich: kann das Ergebniswort irgendwo auf dem Arbeitsband anfangen? Meine eigene Vermutung ist nein, denn q_0 w -*-> q_e v bedeutet ja, dass links vom Lesekopf nichts stehen darf. Richtig?
Darf ich dann einfach das erste Zeichen mit einem Schweinegatter ersetzen? Dann muss ich die 0 natürlich ggf. neu erzeugen, weil ich sie ja kaputt gemacht habe. Also so:
(|s) –0#R–> (p|) –##L–> (q) –#0R–> (o) –##L–> (0|)
Ich könnte mir einen Schritt sparen, wenn ich die 0 eine Position weiter rechts schreibe:
(|s) –0#R–> (p|) –#0L–> (q) –##R–> (0|)
Ist das in Ordnung, wenn ich am Anfang etwas vom Arbeitsband lösche? Oder muss ich erst ganz nach hinten gehen, um dann die letzte 0 zu löschen?
Ich bin mir nicht ganz sicher, ob die letzte Turing-Maschine (die mit den vier Zuständen) linear beschränkt ist. Ich denke nicht.
Pro: Das Ergebnis ist nicht größer als die Eingabe.
Kontra: Ich schreibe an Stellen, die vorher ungenutzt waren.
Wäre nett, wenn jemand meine Zweifel aus dem Weg räumen könnte. Georg? [25]