Einfache Erklärung, warum bestimmte berechenbare Funktionen nicht durch einen typisierten Begriff dargestellt werden können?

8

Beim Lesen der Zeitung Eine Einführung in die Lambda-Rechnung stieß ich auf einen Absatz, den ich nicht wirklich verstand, auf Seite 34 (meine Kursivschrift):

Innerhalb jedes der beiden Paradigmen gibt es mehrere Versionen des typisierten Lambda-Kalküls. In vielen wichtigen Systemen, insbesondere in solchen a la Church, haben Begriffe, die einen Typ haben, immer eine normale Form. Durch die Unlösbarkeit des Stoppproblems impliziert dies, dass nicht alle berechenbaren Funktionen durch einen typisierten Begriff dargestellt werden können, siehe Barendregt (1990), Satz 4.2.15. Das ist nicht so schlimm, wie es sich anhört, denn um solche berechenbaren Funktionen zu finden, die nicht dargestellt werden können, muss man auf dem Kopf stehen. Zum Beispiel können in 2, dem Lambda-Kalkül zweiter Ordnung, nur die partiellen rekursiven Funktionen dargestellt werden, die zufällig total sind, aber in der mathematischen Analyse (Arithmetik zweiter Ordnung) nicht nachweisbar.

Ich kenne die meisten dieser Konzepte, aber weder das Konzept einer partiellen rekursiven Funktion noch das Konzept einer nachweislich vollständigen Funktion. Dies ist jedoch nicht das, was mich am Lernen interessiert.

Ich suche nach einer einfachen Erklärung, warum bestimmte berechenbare Funktionen nicht durch einen typisierten Begriff dargestellt werden können und warum solche Funktionen nur "auf dem Kopf stehend" gefunden werden können.

magnetar
quelle

Antworten:

9

Da Sie keine präzisen Konzepte lernen möchten, finden Sie hier eine intuitive Erklärung. In der folgenden Diskussion bezieht sich "Funktion" immer auf eine Funktion, die natürliche Zahlen natürlichen Zahlen zuordnet (möglicherweise bei einigen Argumenten undefiniert).

Jede Programmiersprache, die hat

  1. berechenbare Syntax und Bewertungsregeln und
  2. implementiert jede insgesamt berechenbare Funktion

implementiert notwendigerweise einige Teilfunktionen .

Um dies zu sehen, nehmen wir an, dass jede definierbare Funktion in dieser Sprache vollständig war. Da die Sprache eine berechenbare Syntax hat, können wir alle Definitionen von Funktionen auflisten (nur alle Zeichenfolgen auflisten und diejenigen herausfiltern, die syntaktische Fehler verursachen). Da die Bewertungsregeln berechenbar sind, lässt die zweite Annahme den Schluss zu, dass wir in unserer Sprache die Gesamtfunktion definieren können, die eval(n,m)die n-te definierbare Funktion bewertet m(im Wesentlichen handelt es sich hierbei um einen in der Sprache selbst geschriebenen Mini-Interpreter). Aber dann die Funktion

λ k . (1 + eval(k,k))

ist eine total definierbare Funktion, die sich von jeder total definierbaren Funktion unterscheidet, ein Widerspruch.

Der einfach typisierte Kalkül erfüllt die erste Bedingung und definiert nur Gesamtfunktionen. Daher erfüllt es die zweite Bedingung nicht.λ

Was "auf dem Kopf stehen" betrifft, so ist es für einen stark normalisierenden Kalkül ziemlich einfach, eine Gesamtfunktion bereitzustellen, die im Kalkül nicht definierbar ist, nämlich das Normalisierungsverfahren selbst. Es ist nicht sehr wichtig, wie ausgefallen Ihr stark normalisierender Kalkül ist, es könnte sich um den polymorphen λ- Kalkül, die Martin-Lof-Typentheorie oder den Konstruktionskalkül handeln. (Übung: Wenn Sie das Normalisierungsverfahren implementieren könnten, könnten Sie es oben implementieren .)λλeval

Andrej Bauer
quelle
Ich fürchte, ich kann Ihren zweiten erklärenden Satz nicht analysieren: Jede Programmiersprache mit 1. und 2. überprüft was? Ich nehme an, Sie wollten sagen, dass es keine solche Sprache geben kann ...
Cody
Entschuldigung, habe den Text durcheinander gebracht. Es sollte jetzt gut lesen.
Andrej Bauer
Cool, habe nicht daran gedacht. Sehen Sie hier für den Hintergrund dieser Antwort.
Raphael
4

Ich finde, dass Merijns Antwort den ersten Teil Ihrer Frage recht gut behandelt. Ich werde versuchen, den zweiten Teil zu beantworten: Warum das Finden von Funktionen, die berechenbar, aber im polymorphen Kalkül nicht darstellbar sind, "auf dem Kopf stehen" erfordert.λ

Ich fürchte, es bedarf einer Erklärung der Konzepte, an denen Sie nicht interessiert sind. Eine partielle rekusive Funktion ist ein Term, der eine Funktion von N bis N{ } darstellt . A λ -term an die repräsentativ für eine natürliche Zahl angewandt wird gesendet , wenn und nur wenn ist nicht eine normale Form. Wenn keine Nummer an gesendet wird, sagen wir, dass die Funktion total ist . Nun ist die Idee, dass keine logische Theorie beweisen kann, dass ein TermλNN{}λtnt nTtstellt eine Gesamtfunktion für jede Gesamtfunktion , es gibt immer "blinde Flecken", in denen an allen Eingaben endet , aber an der Anweisungttn

n,t n terminates

ist in unentscheidbar . Wenn die obige Aussage ist beweisbar in , sagen wir , dass die Funktion , die durch ist beweisbar insgesamt . Dass nicht alle Gesamt Funktionen in beweisbar sind insgesamt ist eine Folge (eine Variante) die Godel Unvollständigkeitssatzes für .TTtTT

Der Punkt ist nun, dass das überwiegende Mehrheitsprogramm , das wir konkret schreiben möchten (Listensortierung, Graph-Traversal, Betriebssysteme), nicht nur Gesamtfunktionen sind, sondern nachweislich in vernünftigen logischen Systemen wie Peano Arithmetic insgesamt.

Nun zum polymorphen Kalkül. Es kann gezeigt werden, dass die Begriffe, die man in diesen Kalkül eingeben kann, genau die Begriffe sind, die die Funktionen darstellen, die nachweislich in der Peano-Arithmetik zweiter Ordnung insgesamt sind. Peano-Arithmetik zweiter Ordnung ist viel, viel mächtiger als gewöhnliche Peano-Arithmetik.λ

Dies bedeutet durch die obigen Erklärungen, dass es Begriffe gibt, die total, aber nicht nachweislich total sind, aber solche Funktionen sind äußerst selten, da sie für Peano Arithmetic bereits selten sind (und in der Theorie zweiter Ordnung so viel seltener). Daher die Aussage "auf dem Kopf stehen".

Cody
quelle
2
Ihnen fehlen Bedingungen für Ihre Theorie , nämlich die Konsistenz und dass die Menge der Axiome rekursiv ist, andernfalls können wir als T eine Theorie nehmen, deren Menge der Axiome " f terminiert" für jedes f , das endet, enthält. TTff
Andrej Bauer
Danke für diese Präzision, Andrej. Eine vollständigere Erklärung würde wahrscheinlich auch detailliert beschreiben, was wir von unserer Theorie verlangen, nämlich dass die Theorie zumindest ausdrücken kann, was es bedeutet, zu beenden (Arithmetik mit Multiplikation ist ausreichend, aber ich tendiere dazu, etwas ausdrucksstärkere Systeme zu bevorzugen).
Cody
Richtig, ich denke, es ist nur fair, darauf hinzuweisen, dass einige technische Bedingungen fehlen, damit die interessierten Leser sie nachschlagen können.
Andrej Bauer
3

Ich finde es etwas schwierig, den Beweis präzise aufzuschreiben, aber ich hoffe, diese Erklärung bietet Ihnen genug Intuition, um zu verstehen, warum einfache typisierte Begriffe nicht alle untypisierten Begriffe darstellen können.

Der einfach getippte Lambda-Kalkül normalisiert sich stark. Jede Reduktion bringt uns der normalen Form näher. Wenn die Funktion f : : α & bgr; & ggr; wird auf einen Wert von Typ angewendet α wird es ß zu einer Funktion des Typs reduzieren & bgr; & ggr; . Bei einer endlichen Anzahl von Argumenten ist eine endliche Anzahl von Reduktionsschritten erforderlich, um eine β- normale Form zu erreichen , bei der es keine weiteren möglichen Reduktionen gibt.βf::αβγαββγβ

Um dies mit dem untypisierten Lambda-Kalkül zu kontrastieren. Einer der bekanntesten UTLC-Kombinatoren ist der Kombinator:Y

Y=λf.(λx.f(xx))(λx.f(xx))

Wenn wir versuchen, den Kombinator zu reduzieren, geschieht Folgendes:Y

( λ x . g

λf.(λx.f(xx))(λx.f(xx))g
g
(λx.g(xx))(λx.g(xx))
g
g((λx.g(xx))(λx.g(xx)))
g(g((λx.g(xx))(λx.g(xx))))

YY

merijn
quelle
λY
Y
λλ