Ich möchte nur einige Beispiele für die Funktionen kennen, die mit dem untypisierten Lambda-Kalkül berechnet werden können, aber nicht mit typisierten Lambda-Kalkülen.
Da ich ein Anfänger bin, wäre eine Wiederholung der Hintergrundinformationen wünschenswert.
Vielen Dank.
Edit: Mit getippten Lambda-Kalkülen wollte ich etwas über System F und die einfach getippten Lambda-Kalküle wissen. Mit Funktion meine ich jede Turing-berechenbare Funktion.
pl.programming-languages
type-theory
lambda-calculus
computable-analysis
Timothy Zacchari
quelle
quelle
Antworten:
Ein gutes Beispiel ist Godelization: In der Lambda-Rechnung können Sie eine Funktion nur anwenden. Infolgedessen gibt es keine Möglichkeit, eine geschlossene Funktion vom Typ zu schreiben , die ein Funktionsargument akzeptiert und einen Godel-Code dafür zurückgibt.(N→N)→N
Wenn man dies als Axiom zur Heyting-Arithmetik hinzufügt, spricht man gewöhnlich von der "konstruktiven Kirchenlehre" und ist ein stark antiklassisches Axiom. Es ist nämlich konsequent, es zu HA hinzuzufügen, aber nicht zu Peano Arithmetic! (Grundsätzlich ist es eine klassische Tatsache, dass jede Turing-Maschine anhält oder nicht, und es gibt keine berechenbare Funktion, die diese Tatsache bezeugen kann.)
quelle
Die einfachste Antwort ergibt sich aus der Tatsache, dass typisierte Lambda-Kalküle Logiken entsprechen (einfach typisierte Lambda-Kalküle -> Prädikatenlogik; System f -> Logik zweiter Ordnung) und konsistente Logiken ihre eigene Konsistenz nicht nachweisen können.
Nehmen wir also an, Sie haben natürliche Zahlen (oder eine Church-Kodierung natürlicher Zahlen) in Ihrem typisierten Lambda-Kalkül. Es ist möglich, eine Gödel-Nummerierung vorzunehmen, die jedem Begriff in System F eine eindeutige natürliche Nummer zuweist. Dann gibt es eine Funktion , die jede natürliche Zahl (die einem gut typisierten Term in System F entspricht) zu einer anderen natürlichen Zahl (die der normalen Form dieses gut typisierten Terms in System F entspricht) nimmt und für etwas anderes sorgt Jede natürliche Zahl, die keinem gut typisierten Begriff in System F entspricht (dh, sie gibt Null zurück). Die Funktion f ist berechenbar, sie kann also mit dem nicht typisierten Lambda-Kalkül berechnet werden, nicht aber mit dem typisierten Lambda-Kalkül (da letzteres ein Beweis für die Konsistenz der Logik zweiter Ordnung inf f Logik zweiter Ordnung, was implizieren würde, dass Logik zweiter Ordnung inkonsistent ist).
Caveat 1: Wenn zweite Ordnung Logik ist inkonsequent, es könnte zu schreiben möglich sein , im System F ... und / oder es könnte zu schreiben nicht möglich sein , f in der nicht typisierten Lambda - Kalkül - man etwas schreiben könnte, aber es könnte nicht immer beenden, was ein Kriterium für "berechenbar" ist.f f
Vorsichtsmaßnahme 2: Manchmal bedeutet "einfach eingegebene Lambda-Rechnung" "einfach eingegebene Lambda-Rechnung mit einem Festkomma-Operator oder rekursiven Funktionen". Dies wäre mehr oder weniger PCF , das jede berechenbare Funktion berechnen kann, genau wie der untypisierte Lambda-Kalkül.
quelle
Der untypisierte Kalkül besitzt eine allgemeine Rekursion in Form des Y- Kombinators. Einfach eingegebener λ- Kalkulus nicht. Somit ist jede Funktion, die eine allgemeine Rekursion erfordert, ein Kandidat, zum Beispiel die Ackermann-Funktion. (Ich überspringe einige Details darüber, wie genau wir die natürlichen Zahlen in jedem System darstellen, aber im Grunde genügt jeder sinnvolle Ansatz.)λ Y. λ
Natürlich können Sie den einfach eingegebenen Kalkül immer so erweitern , dass er der Potenz von Y entspricht , aber dann ändern Sie die Spielregeln.λ Y.
quelle
Der einfach getippte Lambda-Kalkül ist eigentlich überraschend schwach. Beispielsweise kann es die reguläre Sprache nicht erkennen . Ich habe jedoch noch nie eine genaue Beschreibung der Sprachen gefunden, die STLC erkennen kann.a∗
quelle
Eine Vision der Grenzen stark normalisierender Kalküle, die ich mag, ist der Berechenbarkeitswinkel. In einem stark normalisierenden typisierten Kalkül, wie dem einfach typisierten Lambda-Kernkalkül, System F oder Konstruktionskalkül, haben Sie den Beweis, dass alle Terme schließlich enden.
Wenn dieser Beweis konstruktiv ist, erhalten Sie einen festen Algorithmus zum Auswerten aller Terme mit einer garantierten Obergrenze für die Berechnungszeit. Oder Sie können auch studieren den (nicht unbedingt konstruktiven) Beweis und extrahieren ein ober gebundene von ihm - was wahrscheinlich zu sein ist riesig , weil diese Kalküle ausdruck ist.
Diese Schranken geben Ihnen "natürliche" Beispiele für Funktionen, die in dieser festen Lambda-Rechnung nicht typisiert werden können: alle arithmetischen Funktionen, die dieser Schranke asymptotisch überlegen sind.
Wenn ich mich richtig erinnere, getippt Begriffe in dem einfach typisierten Lambda-Kalkül können in Turm der exponentiellen ausgewertet werden:
O(2^(2^(...(2^n)..)
; Eine Funktion, die schneller wächst als alle diese Türme, ist in diesen Kalkülen nicht auszudrücken. Das System F entspricht einer intuitiven Logik zweiter Ordnung, daher ist die Rechenleistung einfach enorm. Um die Berechenbarkeitsstärke noch leistungsfähigerer Theorien zu nutzen, argumentieren wir normalerweise mit Mengen- und Modelltheorie (z. B. welche Ordnungszahlen gebaut werden können) anstelle der Berechenbarkeitstheorie.quelle
quelle
A
solcher TypA \ident A \rightarrow A
nicht seltsam? Es klingt für mich absurd, was übersehen ich?