Zum Inhalt springen

Kurs:Einführung in die mathematische Logik (Osnabrück 2021)/Vorlesung 20/kontrolle

Aus Wikiversity



Arithmetische Repräsentierbarkeit

Wir möchten die Wirkungsweise von Registerprogrammen arithmetisch repräsentieren, um so aus der Unentscheidbarkeit des Halteproblems auf die Unentscheidbarkeit der Arithmetik zu schließen. Im Folgenden arbeiten wir mit dem arithmetischen Alphabet und der Standardinterpretation in .


Eine Abbildung

heißt arithmetisch repräsentierbar , wenn es einen -Ausdruck in freien Variablen derart gibt, dass für alle -Tupel die Äquivalenz genau dann, wenn gilt.


Eine Relation heißt arithmetisch repräsentierbar , wenn es einen -Ausdruck in freien Variablen derart gibt, dass für alle -Tupel die Äquivalenz genau dann, wenn gilt.

Die Schreibweise bedeutet, dass die nicht namentlich aufgeführten freien Variablen durch die ersetzt werden, wobei die natürlichen Zahlen als Terme durch die -fache Summe (streng genommen mit einer fixierten Klammerung) wiedergegeben werden. Da die repräsentierenden Ausdrücke genau bzw. freie Variablen besitzen, entsteht durch Substitution der freien Variablen durch die Terme eine Aussage ohne freie Variablen. Diese sind bei Interpretation über den natürlichen Zahlen wahr oder falsch. Aufgrund des Substitutionslemmas ist die Gültigkeit äquivalent zur Gültigkeit . Polynomfunktionen

mit natürlichzahligen Koeffizienten sind unmittelbar arithmetisch präsentierbar, siehe Aufgabe 20.6.

Wir wollen zeigen, dass Registerprogramme, oder besser gesagt die durch ein Registerprogramm festgelegte Programmabbildung, arithmetisch repräsentierbar sind.



Registerprogramme als Abbildungen

Wir möchten ein Registerprogramm , das aus Programmzeilen besteht und Register anspricht, als eine Abbildung auffassen. Die Wirkungsweise einer jeden Programmzeile hängt dabei nur von den Belegungen der Register zu dem Zeitpunkt ab, an dem diese Zeile aufgerufen wird. Sie ist geschichtsunabhängig, d.h. unabhängig von dem bisherigen Verlauf des Programmes. Man kann daher ein Programm vollständig durch die Abbildung

erfassen. Diese Abbildung nennen wir die Programmabbildung . Dabei steht für die Programmzeilennummer und steht für den Inhalt des Registers (von denen es ja Stück gibt). Dem Tupel wird dasjenige Tupel zugeordnet, das bei Abruf des in der -ten Programmzeile stehenden Befehls bei der Registerbelegung entsteht. Die Abbildung besteht dabei aus den Komponentenfunktionen , wobei die Wirkungsweise auf die Programmzeilennummer und die , , die Wirkungsweise auf das -te Register beschreibt. Die Wirkung der einzelnen Befehle sieht folgendermaßen aus.

Bei ist

Bei ist

bei und

bei . Bei ist

Bei (also bei ) ist

die Abbildung wirkt dort also wie die Identität. Der Druckbefehl ist für den Programmablauf nicht relevant und wird hier ignoriert.

In manchen Situationen möchte man eine auf ganz definierte Programmabbildung haben. Um dies zu erreichen setzt man für einfach



Repräsentierbarkeit der Registerbefehle

Ein Registerprogramm kann also in eine Abbildung übersetzt werden, die die Wirkungsweise des Programms widerspiegelt. Die dabei auftretenden Abbildungen sind prinzipiell einfach beschreibbar, auch wenn dafür eine lange Abbildungsdefinition und tief verschachtelte Fallunterscheidungen nötig sind.

Der Ablauf eines Programms zur Anfangseingabe (Anfangskonfiguration) (die Anfangszeile besitzt die Zeilennummer !) wird durch die Hintereinanderschaltung der Programmabbildung mit sich selbst beschrieben. Nach dem ersten Programmschritt, bei dem der Befehl in der ersten Programmzeile aufgerufen wird, erhält man die Folgekonfiguration . Die nullte Komponente von gibt an, mit welcher Programmzeile weitergearbeitet wird. Dies ist aber alles in kodiert, so dass das Ergebnis nach dem nächsten Schritt einfach ist. Das Ergebnis nach dem -ten Rechenschritt (Befehlszeilenwechsel) ist also

wobei -mal angewendet wird. Dafür schreiben wir auch . Die aktuelle Zeilennummer ist dabei stets als nullte Komponente von ablesbar, wofür wir schreiben.

Wie wirkt sich nun die Eigenschaft eines Programms, anzuhalten oder nicht, auf diese Iterationen von aus? Das Programm hält genau dann an, wenn es bei Eingabe von ein mit gibt.

Wir möchten die Wirkungsweise von Programmen in der Sprache der Arithmetik selbst repräsentieren, um dort das Halteproblem (und seine Unentscheidbarkeit) nachbilden zu können. Dafür müssen wir zunächst die einzelnen Programmschritte arithmetisch erfassen.


Definition  Definition 20.3 ändern

Den Programmzeilen eines Registerprogramms mit Registern werden die folgenden arithmetischen Ausdrücke in den freien Variablen zugeordnet.

  1. Bei setzt man
  2. Bei setzt man
  3. Bei setzt man
  4. Bei setzt man

Hierbei werden die natürlichen Zahlen und in den arithmetischen Ausdrücken durch die entsprechenden Summen repräsentiert, die Abfrage am -ten Register schlägt sich in der Variablenbezeichnung nieder.

Wie bei der Programmabbildung ist es sinnvoll, für alle Programmzeilennummern (also auch für ) einen arithmetischen Ausdruck zu haben. Dazu setzen wir

(wobei eine Abkürzung ist). Zu einem gegebenen Programm bestehend aus den Programmzeilen betrachtet man die Konjunktion der soeben eingeführten zugehörigen arithmetischen Repräsentierungen, also . Dieser Ausdruck repräsentiert die Programmabbildung.


Lemma  Lemma 20.4 ändern

Es sei ein Registerprogramm mit den Programmzeilen und Registern mit den zugehörigen arithmetischen Ausdrücken in den freien Variablen . Es sei .

Dann ist eine arithmetische Repräsentierung der Programmabbildung .

Die Variablen seien durch die natürlichen Zahlen belegt. Wir müssen zeigen, dass die Gleichheit

genau dann gilt, wenn

gilt. Der Ausdruck gilt genau dann, wenn sämtliche Ausdrücke gelten. Es sei fixiert. Dann gelten sämtliche , , automatisch, da für diese Ausdrücke der Vordersatz nicht gilt. Die Gültigkeit von bei dieser Belegung bedeutet also, dass der Nachsatz in gelten muss. Sowohl als auch der Nachsatz von drücken die Wirkungsweise des Befehls aus, daher gilt die Abbildungsgleichheit genau dann, wenn wahr ist.



Die -Funktion

Das Halteproblem führte zu der Existenzaussage, dass es eine Iteration der Programmabbildung gibt, für die die -te Komponente gleich der Haltezeilennummer ist. Die arithmetische Repräsentierung dieser Existenzaussage bedarf einiger Vorbereitungen.

Eine natürliche Zahl lässt sich bekanntlich im Zehnersystem als

schreiben, wobei die zwischen und liegen. Umgekehrt definiert eine endliche Ziffernfolge (bzw. in alltäglicher Schreibweise ) eine natürliche Zahl. Anstatt der Basis kann man jede natürliche Zahl als Basis nehmen (für viele Zwecke ist auch die Basis erlaubt, eine Zahl wird dann einfach durch das -fache Hintereinanderschreiben der repräsentiert). Man spricht dann von der -adischen Entwicklung (oder Darstellung) der Zahl. Die -adische Entwicklung einer natürlichen Zahl ist eindeutig.

Sei fixiert. Wie berechnet man die Ziffernfolge einer gegebenen Zahl ? Zuerst betrachten wir die Ziffer (die Einerziffer) . Es gilt die rekursive Beziehung

Dies beruht einfach darauf, dass bei das Abziehen von die Ziffer zu nicht ändert. Man beachte, dass sowohl die Abfrage, die die Fallunterscheidung in dieser Definition konstituiert, als auch die Subtraktion im Fall mit einer Registermaschine durchführbar sind, und dass dadurch eine -berechenbare Funktion vorliegt.

Auch die Definition der anderen Ziffern geschieht rekursiv. Wenn man von die (schon berechnete) Ziffer zu abzieht, so erhält man eine durch teilbare Zahl. Zwischen der Ziffernentwicklung von und von besteht ein direkter Zusammenhang, die Ziffer von ist einfach die Ziffer von . Daher ist für

Damit ist die Berechnung der -ten Ziffer auf die Berechnung der -ten Ziffer einer kleineren Zahl rekursiv zurückgeführt. Die Bedingung in der Abfrage und die Subtraktion und die Division in der Definition sind durch eine Registermaschine durchführbar. Diese Funktionsvorschrift berechnet nicht nur die „benötigten“ Ziffern, sondern auch alle höheren, wobei natürlich für alle unbenötigten herauskommt.

Wir führen nun die -Funktion ein. Der Hauptzweck dieser Funktion soll sein, endliche Folgen von natürlichen Zahlen unterschiedlicher Länge durch drei Zahlen zu kodieren. Die Grundidee ist, dies über die -adische Entwicklung zu tun, wobei die drei Eingabezahlen einen Zahlwert, eine Basis und eine Ziffernstelle repräsentieren, und die Ausgabe die Ziffernfolge ist. Zugleich soll diese Funktion arithmetisch repräsentierbar sein, sodass die folgende Funktion etwas komplizierter aussieht. Wir folgen weitgehend dem Zugang von Ebbinghaus, Flum, Thomas.


Unter der Funktion versteht man die Abbildung

die folgendermaßen festgelegt ist. ist die kleinste Zahl , die die Bedingung erfüllt, dass es natürliche Zahlen gibt, die die folgenden Eigenschaften erfüllen:

  1. .
  2. .
  3. .
  4. ist eine Quadratzahl.
  5. Alle Teiler von sind ein Vielfaches von .

Wenn kein solches existiert, so ist .

Zunächst ist klar, dass diese Funktion arithmetisch repräsentierbar ist. Wenn eine Primzahl ist, so bedeutet Teil (5), dass eine Primzahlpotenz ist, und Teil (4), dass der Exponent geradzahlig ist. Das folgende Lemma sichert die gewünschte Eigenschaft der -Funktion, nämlich die Eigenschaft, endliche Folgen zu repräsentieren.


Zu jeder endlichen Folge aus

gibt es natürliche Zahlen derart, dass für ist.

Es sei die endliche Folge vorgegeben. Wir wählen eine Primzahl , die größer als alle und größer als ist. Es sei

Die vorgegebene Folge ist also die Folge der Ziffern der ungeraden Stellen in der -adischen Ziffernentwicklung von . Wir behaupten für . Zunächst erfüllt die in der Definition der -Funktion formulierten Eigenschaften, und zwar mit

Die erste Eigenschaft ergibt sich aus

die anderen sind klar. Wenn umgekehrt ein die Bedingungen erfüllt (mit ), wobei ist, so ist

Da die -adische Entwicklung von eindeutig ist, folgen daraus und aus den weiteren Bedingungen die Gleichheiten und .