Warum sind die Gesamtfunktionen nicht aufzählbar?

29

Wir haben etwas über das Konzept der Aufzählung von Funktionen gelernt. In der Praxis entsprechen sie Programmiersprachen.

In einer Bemerkung erwähnte der Professor, dass die Klasse aller Gesamtfunktionen (dh die Funktionen, die immer für jede Eingabe enden) nicht aufzählbar ist. Das würde bedeuten, dass wir keine Programmiersprache entwickeln können, die es uns erlaubt, alle Gesamtfunktionen zu schreiben, aber keine anderen - was schön wäre!

Wie kommt es also, dass wir (anscheinend) das Potenzial der Nichtbeendigung akzeptieren müssen, wenn wir eine angemessene Rechenleistung wünschen?

Raphael
quelle

Antworten:

24

Wegen der Diagonalisierung. Wenn eine berechenbare Aufzählung aller berechenbaren Funktionen von bis , so dass jedes total war, dann wäre ebenfalls eine vollständig berechenbare Funktion, würde aber nicht in der Aufzählung enthalten sein. Das würde den Annahmen über die Reihenfolge widersprechen. Somit kann keine berechenbare Aufzählung von Funktionen aus genau den gesamten berechenbaren Funktionen bestehen.N N F E g ( i ) = f i ( i ) + 1(fe:eN)NNfeg(i)=fi(i)+1

Angenommen, wir denken an eine universelle berechenbare Funktion , wobei "universell" eine berechenbare Binärfunktion bedeutet und für jede insgesamt berechenbare unäre Funktion einige so dass für alle . Dann muss es auch ein so dass aufgrund des vorherigen Absatzes keine Gesamtfunktion ist. Andernfalls würde eine berechenbare Aufzählung von insgesamt berechenbaren unären Funktionen ergeben, die alle insgesamt berechenbaren unären Funktionen enthält.h f ( n ) e f ( i ) = h ( e , i ) , i e g ( n ) = h ( e , n ) hh(e,i)hf(n)ef(i)=h(e,i)ieg(n)=h(e,n)h

Das Erfordernis, dass jede Funktion ein System von Funktionen ist, ist daher nicht mit der Existenz einer universellen Funktion in diesem System vereinbar. Für einige schwache Systeme, wie die primitiven rekursiven Funktionen, ist jede Funktion total, aber es gibt keine universellen Funktionen. Stärkere Systeme, die universelle Funktionen haben, wie beispielsweise die Berechenbarkeit von Turing, müssen einfach Teilfunktionen haben, damit die universelle Funktion existieren kann.

Carl Mummert
quelle
Ich wollte nur hinzufügen, dass jemand eine Lücke in der Diagonalisierung gefunden hat. Wenn Sie für das Programm eine typisierte Darstellung verwenden, können Sie mit dem Typensystem die Diagonalisierung verhindern und einen vollständigen Selbstinterpreter erstellen. Weitere Informationen finden Sie unter Durchbrechen der Normalisierungsbarriere: Ein Selbstinterpreter für F-Omega .
hatch22
Natürlich ist System F kein Turing-Komplettsystem. Das von Ihnen verlinkte Papier ist interessant. es scheint, dass sie es schaffen, die Nicht-Turing-Vollständigkeit auf interessante Weise zu nutzen.
Carl Mummert
Ich verstehe nicht, warum "dann wäre auch eine vollständig berechenbare Funktion". Wenn eine vollständig berechenbare Funktion ist, dann , dann erfordert die Auswertung von die Auswertung von : Widerspruch. So scheint es , dass , wenn es eine Aufzählung der Gesamt berechenbaren Funktionen ist, können wir nicht einmal bauen , so dass wir einen Widerspruch nicht erreichen kann die anfängliche Hypothese zu widerlegen (wir können einen Widerspruch erreichen, aber es widerlegt gerade ist total berechenbar). g(i)=fi(i)+1gk,fk=gg(k)g(k)=fk(k)+1=g(k)+1gg
agemO
Und selbst die Verwendung einer verschobenen Diagonale zur Vermeidung dieses Problems scheint zu Widersprüchen zu führen.
agemO
10

Um klar zu sein, müssen wir mathematische Funktionen (ich werde sie Funktionen nennen und es gibt oft unzählige davon, so dass sie überhaupt nicht aufzählbar sind) und Funktionen, die Sie schreiben können, unterscheiden: Ich werde sie Programme oder auch berechenbare Funktionen nennen .

Eine Teilmenge einer zählbaren Menge heißt berechenbar, wenn es ein Programm gibt, das bei gegebenem Element von "ja", wenn und "nein", wenn . (Und er muss immer etwas antworten.) Eine Menge wird als rekursiv aufzählbar bezeichnet, wenn das Programm berechtigt ist, nicht zu antworten, anstatt "nein" zu sagen. (Es ist gleichbedeutend damit, dass das Programm alle Elemente von in beliebiger Reihenfolge drucken muss.)E x E x S x S SSExExSxSS

Die Menge aller Programme, die sich insgesamt auf einer endlichen Menge befinden, ist aufzählbar, da Sie einen Interpreter schreiben können, der das Programm nur auf allen Elementen der endlichen Menge ausführt und "yes" zurückgibt, wenn alle beendet werden. (Aber kann nicht sehen, ob einer von ihnen nicht)

Ihr Professor sagte, dass die Menge aller Programme, die sich auf einer unendlichen Menge befinden, nicht aufzählbar ist, da Sie Ihr Programm nicht einfach auf einer unendlichen Anzahl von Elementen ausführen können.

Das heißt aber nicht, dass das schlecht ist:

  1. Zum Beispiel ist die Menge, wenn alle Programme nachweislich vollständig sind, auflistbar, da Sie alle Beweise auflisten und mechanisch prüfen können, ob sie beweisen, dass Ihr Programm vollständig ist.

  2. Selbst eine Aufzählung wäre nicht praktikabel, da Sie möglicherweise ewig warten müssen, ohne sicher zu sein, ob der Vorgang eines Tages beendet wird. Ich verstehe nicht, wie man Programme verwendet, die alle Gesamtfunktionen auflisten ...

Es gibt einige Programmiersprachen, in denen alles, was Sie schreiben, garantiert nur mit statischer Eingabe endet! Es gibt sogar einige, die Ihnen eine polynomielle Bindung garantieren. Momentan sind sie größtenteils akademisch. Wenn Sie in diesen Sprachen schreiben, werden Sie wahrscheinlich eher die Einschränkungen spüren, die das Schreiben in Python mit sich bringt, aber es arbeiten viele Forscher daran.

Um Ihre Frage zu beantworten: in gewissem Sinne ja. Eine mögliche Nichtbeendigung ist erforderlich, um vollständig zu sein (derzeit höchste Rechenleistung). Aber ich finde das nicht direkt relevant für die Tatsache, dass Gesamtfunktionen aufzählbar sind oder nicht. Sie können noch alle Gesamtprogramme schreiben!

jmad
quelle
2
„weil Sie nicht nur Ihr Programm kann auf einer unbegrenzten Anzahl von Elementen laufen“ - das ist ein schwaches Argument , da ich nicht vielleicht müssen dies tun , wenn ich alle Informationen retten kann ich aus dem Programm selbst braucht. Sehen Sie hier eine Frage , welche die Gefahr von Ihrer Argumentation.
Raphael
Tatsächlich. Ich habe nicht behauptet, es sei ein Beweis (wie immer muss man ein diagonales Argument bilden) und vielleicht hätte ich das Wort "weil" nicht verwenden sollen. Ich habe versucht, Ihre Frage zu beantworten, bei der es (wie ich dachte) nicht um einen Beweis für die Aussage Ihres Professors ging, sondern darum, warum die Beendigung mit der Rechenkraft in Konflikt steht.
Jmad