In diesem Wikipedia-Artikel zu Turing Completeness heißt es:
Der untypisierte Lambda-Kalkül ist vollständig, viele typisierte Lambda-Kalküle, einschließlich System F, jedoch nicht. Der Wert typisierter Systeme beruht auf ihrer Fähigkeit, die meisten typischen Computerprogramme darzustellen und gleichzeitig mehr Fehler zu erkennen.
Was ist ein Beispiel für eine vollständig berechenbare Funktion, die von System F nicht berechenbar ist ?
Da hindley-milner außerdem ist:
Eine Einschränkung von System F
aufgrund der Tatsache, dass:
Die Typprüfung ist für eine Curry-artige Variante von System F unentscheidbar, dh für eine Variante, der explizite Typanmerkungen fehlen.
Bedeutet dies, dass der Lambda-Kalkül, der den Systemen vom Hindley-Milner-Typ zugrunde liegt, nicht vollständig ist?
Wenn dies zutrifft, werden die Merkmale, die in der Lambda-Rechnung nicht vorhanden sind, hinzugefügt, um die Hashkell-Rechnung zu vervollständigen , da die Hashkell-Rechnung eindeutig vollständig ist und wir wissen, dass sie auf der Lambda-Rechnung und dem Hindley-Milner-System basiert.
quelle
system T vs. system F
fand ich etwas , das meine letzte Teilfrage beantwortet , die wie hier neu formuliert wird: Wie Haskell Turing-Vollständigkeit zu System F hat hinzufügenAntworten:
System ist sehr ausdrucksstark. Wie hier von Girard bewiesen , sind die Funktionen vom Typ (wobei definiert ist als ) sind genau die definierbaren Funktionen ( ) in Heyting Arithmetic zweiter Ordnung . Beachten Sie, dass dies mit den Funktionen identisch ist, die in der Peano-Arithmetik zweiter Ordnung definiert werden können .F N→N N ∀X. X→(X→X)→X N→N HA2
Wahrscheinlich möchten Sie Proofs und Typen als besser lesbare Referenz überprüfen . Beachten Sie, dass dies bedeutet , dass eine Menge von Programmen kann in System F geschrieben wird, von der Ackermann - Funktion Dolmetscher für Gödels System . Wie für jede Programmiersprache (mit einigen milden Bedingungen) kann System keinen Selbstinterpreter implementieren , dh eine Funktion die als Eingabe einen Code für einen Term verwendet von System und gibt eine (Code für a) normale Form fürT F eval:N→N t F t . Der Beweis beinhaltet eine Variante des Diagonalisierungstricks, der für die Unentscheidbarkeit des Halteproblems verwendet wird. Andrej erklärt es hier wunderschön .
Um Ihre anderen Fragen zu beantworten: Die -calculus zugrunde liegenden Hindley-Milner (HM) -Sprachen sind ebenfalls nicht vollständig. Tatsächlich ist es signifikant schwächer als System weist eine geringere Aussagekraft auf als der einfach typisierte Kalkulus.λ F λ
Haskell ist in der Tat Turing vollständig. Das auffälligste Merkmal, das dies ermöglicht (obwohl es andere gibt), ist das Vorhandensein einer uneingeschränkten Rekursion : Die Definition eines Programms (einer Funktion) kann sich auf das Programm selbst beziehen. Dies ist vergleichbar mit der Hinzufügung eines Kombinators, wie er in der Definition von PCF vorgenommen wird, der einfach eingegeben wird, aber die Turing-Vollständigkeit des Kombinators beibehält .Y Y
Beachten Sie, dass es andere Funktionen gibt, die Haskell Turing vervollständigen, die jedoch normalerweise nicht als Teil der Kernsprache betrachtet werden, z. B. Verweise auf Funktionen, uneingeschränkte Datentypen usw.
quelle
Es ist etwas irreführend zu sagen, dass Haskells Typisierungssystem "das Hinley-Milner-Typisierungssystem" ist. Haskells Typen sind viel leistungsfähiger, darunter auch Typen höherer Klassen. Tatsächlich ist das Schreibsystem so leistungsfähig, dass Sie Turing-vollständige Programmiersprachen in das Schreibsystem einbetten können, siehe hier . Dies ist nicht der einzige Grund für Haskells Macht, Cody hat einige andere erwähnt.
quelle