Es ist allgemein bekannt, dass die Entscheidung, ob eine Turing-Maschine anhält, unentscheidbar ist. Dies gilt jedoch nicht unbedingt für einfachere Maschinen.
Eine Foo-Maschine ist eine Maschine mit einem endlichen Band, bei der jede Zelle auf dem Band eine Ganzzahl oder ein Haltesymbol aufweist h
, z
2 h 1 -1
Der Anweisungszeiger zeigt zunächst auf die erste Zelle:
2 h 1 -1
^
Bei jedem Schritt bewegt sich der Befehlszeiger um die Nummer vorwärts, auf die er zeigt, und negiert dann diese Nummer. So würde es nach einem Schritt vorwärts 2
Zellen bewegen und das 2
in ein verwandeln -2
:
-2 h 1 -1
^
Die Foo-Maschine tut dies so lange, bis der Anweisungszeiger auf das Stoppsymbol ( h
) zeigt. Hier ist die vollständige Ausführung dieses Programms:
2 h 1 -1
^
-2 h 1 -1
^
-2 h -1 -1
^
-2 h -1 1
^
-2 h 1 1
^
Das Band ist ebenfalls kreisförmig. Bewegt sich der Befehlszeiger von einer Seite des Bandes weg, bewegt er sich zur anderen Seite, z.
3 h 1 3
^
-3 h 1 3
^
-3 h 1 -3
^
-3 h -1 -3
^
-3 h -1 3
^
3 h -1 3
^
Eine interessante Sache an diesen Foo-Maschinen ist, dass einige nicht anhalten, zB:
1 2 h 2
^
-1 2 h 2
^
-1 -2 h 2
^
-1 -2 h -2
^
-1 2 h -2
^
-1 2 h 2
^
Dieses Programm wird in den letzten vier Zuständen für immer weitergeschleift.
Schreiben Sie also ein Programm, das feststellt, ob eine Foo-Maschine anhält oder nicht! Sie können für die Foo-Maschinen jedes (angemessene) Eingabeformat verwenden, das Sie möchten, und Sie können wählen, ob Sie das Stoppsymbol verwenden 0
möchten. Sie können zwei unterschiedliche Ausgaben für den Fall verwenden, dass es anhält und für den Fall, dass es nicht anhält. Ihr Programm muss natürlich für alle gültigen Eingaben eine Antwort in endlicher Zeit ausgeben.
Das ist Code-Golf , also versuchen Sie, Ihr Programm so kurz wie möglich zu halten!
Testfälle
2 h 1 -1
Halts
3 h 1 3
Halts
h
Halts
1 1 1 1 h
Halts
2 1 3 2 1 2 h
Halts
3 2 1 1 4 h
Halts
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
Halts
2 h
Does not halt
1 2 h 2
Does not halt
8 1 2 3 3 4 8 4 3 2 h
Does not halt
1 2 4 3 h 2 4 5 3
Does not halt
3 1 h 3 1 1
Does not halt
1 2 h 42
Does not halt
1 2 h 42
(hält nicht an)
3 2 1 1 4 h
. Dieser hält an, erfordert jedoch mehr Iterationen als die doppelte Anzahl von Elementen.
1 -1 -2 -3 -4 -5 -6 -7 -8 -9 -10 -11 -12 -13 -14 -15 -16 -17 -18 h -20 -21 -22 -23 -24 -25 -26 -27 -28 -29 -30 -31 -32 -33 -34 -35 -36
:, der nach 786430 Schritten anhält.