Warum sind funktionale Sprachen vollständig?

22

Vielleicht ist mein begrenztes Verständnis des Themas falsch, aber das ist, was ich bis jetzt verstehe:

  • Die funktionale Programmierung basiert auf Lambda-Kalkül, das von Alonzo Church formuliert wurde.

  • Die imperative Programmierung basiert auf dem Turing-Maschinenmodell, das von Alan Turing, dem Studenten der Kirche, erstellt wurde.

  • Lambda-Kalkül ist so leistungsfähig und fähig wie die Turing-Maschine,
    was bedeutet , dass sie hinsichtlich der Rechenleistung äquivalent sind.

Wenn die Funktionsprogrammierung auf Lambda Calculus und nicht auf der Turing-Maschine basiert, warum werden dann einige (oder alle) als Turing vollständig und nicht als Lambda vollständig oder so ähnlich beschrieben? Ist der Begriff "Turing-Vollständigkeit" in irgendeiner Weise etwas Besonderes für Turing-Maschinen, oder ist er nur ein Wort?

Wenn zwingende Sprachen auf der Turing-Maschine basieren und Computer im Grunde genommen Turing-Maschinen ohne unendlichen Speicher sind, bedeutet das dann, dass sie auf unseren modernen PCs eine bessere Leistung als funktionale Programmiersprachen erbringen?

Wenn dies der Fall ist, was entspricht dann einer Lambda-Rechenmaschine?

Ich weiß, dass dies drei verschiedene Fragen zu sein scheinen, aber sie sind alle eng miteinander verwandt, und jede hängt davon ab, dass die vorherige Frage zunächst eine gültige Frage ist.

Abdul
quelle
6
Keine Antwort, aber Sie haben erwähnt, dass nicht alle Versionen des Lambda-Kalküls Turing Complete sind. Der Simply Typed Lambda Calculus und die stärkeren Versionen von Coq und Agda, die auf Terminierungsprüfungen basieren, sind nicht Turing Complete (da sie entscheidbare Probleme beim Anhalten haben). Stark typisierte Sprachen wie Haskell und SML umgehen dies, indem sie eine willkürliche Rekursion mit einem Fixpunktkombinator ermöglichen, einem Begriff mit Typ (a -> a) -> a.
Jmite
Es ist einfach so falsch zu sagen, dass "als vollständig definiert" ist. Können wir bitte den Titel ändern?
Andrej Bauer
@AndrejBauer Danke für die Bearbeitung des Titels, aber ich bin gespannt, warum es falsch ist ( definiert als Turning Complete )? Ist es, weil es ein Adjektiv ist? Wäre beschrieben ein besseres Wort als definieren?
Abdul
1
@Abdul Nun, das Problem ist das Wort "definiert". Wenn Sie sagen, dass "funktionale Sprachen als Turing vollständig definiert sind", dann besagen Sie, dass entweder die Definition von "funktionale Sprache" oder die Definition von "Turing vollständig" besagt, dass funktionale Sprachen Turing vollständig sind. Tatsächlich sagt keine Definition das aus.
Tanner Swett

Antworten:

20

Kurz gesagt :

Was zwingende Programmiersprachen als nahe an Turing-Maschinen und an gewöhnlichen Computern wie PCs (selbst näher an RAM-Maschinen als an Turing-Maschinen) auszeichnet, ist das Konzept eines expliziten Speichers , der zum Speichern geändert werden kann (Zwischenergebnisse) ). Hierbei handelt es sich um eine automatische Ansicht der Berechnung mit einem Konzept eines Zustands (das sowohl die Steuerung des endlichen Zustands als auch den Speicherinhalt umfasst), das sich im Verlauf der Berechnung ändern kann.

Die meisten anderen Modelle sind abstrakter. Obwohl sie die Berechnung als Folge von Transformationsschritten einer ursprünglichen Struktur ausdrücken können, werden diese Transformationen in einer Art intemporalem Universum mathematischer Bedeutungen angewendet. Dadurch bleiben möglicherweise Eigenschaften wie die referenzielle Transparenz erhalten, die die mathematische Analyse vereinfachen können. Es ist jedoch weit entfernt von natürlichen physischen Modellen, die sich auf das Gedächtnis konzentrieren.

Somit gibt es keine natürlichen Funktionsmaschinen, außer im weiter unten erläuterten Sinne, da Software nicht wirklich von Hardware trennbar ist.

Der Hinweis auf Turing als Maßstab für die Berechenbarkeit ergibt sich wahrscheinlich aus der Tatsache, dass sein Modell, die Turing-Maschine, dieser physikalischen Realisierbarkeitsbeschränkung am nächsten kam, was sie zu einem intuitiveren Berechnungsmodell machte.

Weitere Überlegungen :

Es gibt viele Berechnungsmodelle, die entworfen wurden, um das Konzept einer Berechnung auf möglichst allgemeine Weise zu erfassen. Dazu gehören Turing-Maschinen, die eigentlich in vielen verschiedenen Geschmacksrichtungen erhältlich sind, Lambda-Kalkül (auch Geschmacksrichtungen), Semi-Thue-Umschreibungssysteme, teilweise rekursive Funktionen und kombinatorische Logik.

Sie alle erfassen einige Aspekte der verschiedenen Techniken, die von Mathematikern zum Ausdrücken oder Durchführen von Berechnungen verwendet werden. Und die meisten wurden in gewissem Umfang als Grundlage für das Design von Programmiersprachen verwendet (z. B. Snobol für Umschreibsysteme, APL für Kombinatoren, Lisp / Schema für Lambda-Kalkül) und können in modernen Programmiersprachen häufig auf verschiedene Arten kombiniert werden.

Ein wesentliches Ergebnis ist, dass alle diese Rechenmodelle als gleichwertig erwiesen wurden, was zu der These von Church-Turing führte, dass kein physikalisch realisierbares Rechenmodell mehr leisten kann als eines dieser Modelle. Ein Berechnungsmodell wird als vollständig bezeichnet, wenn nachgewiesen werden kann, dass es einem dieser Modelle und damit allen Modellen entspricht.

Der Name hätte anders sein können. Die Wahl der Turing-Maschine (TM) als Referenz beruht wahrscheinlich auf der Tatsache, dass es sich wahrscheinlich um das einfachste dieser Modelle handelt, das die Art und Weise, wie ein Mensch rechnet, genau nachahmt und relativ einfach zu implementieren ist (in einer begrenzten endlichen Form) ) als physisches Gerät, so dass Turing-Maschinen mit Lego-Sets gebaut wurden . Die Grundidee erfordert keine mathematische Raffinesse. Es ist wahrscheinlich die Einfachheit und Realisierbarkeit des Modells, die ihm diese Referenzposition gegeben hat.

Zum Zeitpunkt der Erstellung seines Computergeräts durch Alan Turing lagen weitere Vorschläge zur formalen Definition der Berechenbarkeit vor, die für die Grundlagen der Mathematik von entscheidender Bedeutung ist (siehe Entscheidungsproblem ). Der Turing-Vorschlag wurde von den damaligen Experten als die überzeugendste bekannte Arbeit zur Berechenbarkeit angesehen (siehe Computability and Recursion , RI Soare, 1996, siehe Abschnitt 3.2). Die verschiedenen Vorschläge erwiesen sich als gleichwertig, aber Turings überzeugender. [aus Kommentaren von Yuval Filmus]

Es ist zu beachten, dass unsere Computer aus Hardware-Sicht keine Turing-Maschinen sind, sondern sogenannte Random Access Machines (RAM) , die ebenfalls vollständig Turingen.

Rein imperative Sprache (was auch immer das bedeuten mag) sind wahrscheinlich die Formalismen, die für die grundlegendsten Modelle wie Turing-Maschinen verwendet werden, oder die Assemblersprache (Überspringen der binären Codierung) von Computern. Beide sind notorisch unlesbar und es ist sehr schwierig, mit ihnen signifikante Programme zu schreiben. Tatsächlich verfügt sogar die Assemblersprache über einige Funktionen höherer Ebenen, um die Programmierung ein wenig zu vereinfachen, verglichen mit der direkten Verwendung von Maschinenanweisungen. Grundlegende imperative Modelle sind den physikalischen Welten verschlossen, aber nicht sehr brauchbar.

Dies führte schnell zur Entwicklung übergeordneter Berechnungsmodelle, die eine Vielzahl von Rechentechniken, wie Unterprogramm- und Funktionsaufrufe, Benennung des Speicherorts, Festlegung von Namen, Quantifizierung und Dummy-Variablen, die bereits in irgendeiner Form verwendet wurden, einmischten in Mathematik und Logik und sogar sehr abstrakte Konzepte wie Reflexion ( Lisp 1958).

Die Einteilung von Programmiersprachen in Programmierparadigmen wie imperative, funktionale, logische, objektorientierte basiert auf dem Vorrang einiger dieser Techniken beim Entwurf der Sprache und dem Vorhandensein oder Nichtvorhandensein einiger Rechenfunktionen, die bestimmte Eigenschaften für Programme erzwingen oder Programmfragmente in der Sprache geschrieben.

Einige Modelle eignen sich für physische Maschinen. Einige andere eignen sich besser für eine allgemeine Beschreibung von Algorithmen, die von der Art des zu beschreibenden Algorithmus abhängen kann. Einige Theoretiker verwenden sogar nicht deterministische Spezifikationen von Algorithmen, und sogar diese können in konventionellere Programmierbegriffe übersetzt werden. Es gibt jedoch kein Mismatch-Problem, da wir eine ausgeklügelte Compiler / Interpreter-Technologie entwickelt haben, mit der jedes Modell nach Bedarf in ein anderes übersetzt werden kann (was auch die Grundlage der Church-Turing-These ist).

Nun sollten Sie Ihren Computer niemals als Rohhardware betrachten. Es enthält eine Boolesche Schaltung, die eine sehr elementare Verarbeitung durchführt. Aber ein Großteil davon wird von Mikroprogrammen im Computer gesteuert, von denen Sie nie etwas erfahren. Dann haben Sie das Betriebssystem, das Ihren Computer sogar anders aussehen lässt als die Hardware. Darüber hinaus verfügen Sie möglicherweise über einen virtuellen Computer, der Bytecode ausführt, und anschließend über eine Hochsprache wie Pyva und Jathon oder Haskell , oder OCaml, die in Bytecode kompiliert werden können.

Auf jeder Ebene sehen Sie ein anderes Berechnungsmodell. Es ist sehr schwierig, die Hardware-Ebene von der Software-Ebene zu trennen, um einer Maschine ein bestimmtes Rechenmodell zuzuweisen. Und da sie alle unübersetzbar sind, ist die Idee eines ultimativen Hardware-Berechnungsmodells so ziemlich eine Illusion.

Die Lambda-Kalkül-Maschine existiert tatsächlich: Es ist ein Computer, der Lambda-Kalkül-Ausdrücke reduzieren kann. Anzeige, die leicht gemacht wird.

Über spezialisierte Maschinenarchitekturen

Als Ergänzung zu Peter Taylors Antwort und nach der Verflechtung von Hardware und Software wurden spezielle Maschinen entwickelt, die besser an ein bestimmtes Paradigma angepasst sind, und deren Basissoftware in einer auf diesem Paradigma basierenden Programmiersprache geschrieben wurde.

Diese schließen ein

Grundsätzlich sind dies auch zwingende Hardwarestrukturen, die jedoch durch spezielle Hardware-Funktionen oder mikroprogrammierte Interpreter gemildert werden, um sich besser an das beabsichtigte Paradigma anzupassen.

Tatsächlich scheint Hardware, die auf bestimmte Paradigmen spezialisiert ist, auf lange Sicht nie erfolgreich gewesen zu sein. Der Grund dafür ist, dass die Kompilierungstechnologie zur Implementierung eines Paradigmas auf Vanille-Hardware immer effektiver wurde, sodass keine spezielle Hardware mehr benötigt wurde. Darüber hinaus verbesserte sich die Leistung der Harware schnell, aber die Kosten für Verbesserungen (einschließlich der Weiterentwicklung der Basissoftware) konnten auf Vanille-Hardware leichter amortisiert werden als auf Spezialhardware. Spezialisierte Hardware konnte auf Dauer nicht mithalten.

Trotzdem und obwohl ich keine genauen Daten dazu habe, würde ich vermuten, dass diese Unternehmungen einige Ideen hinterlassen haben, die die Entwicklung der Architektur von Maschinen, Erinnerungen und Befehlssätzen beeinflusst haben.

babou
quelle
Die Wahl der Turing-Maschine als Referenz ist, soweit sie tatsächlich hergestellt wird, zum größten Teil historisch motiviert: Turing war der erste, der eine zufriedenstellende Definition der Berechenbarkeit fand.
Yuval Filmus
@YuvalFilmus Und warum war es eher eine "befriedigende Definition der Berechenbarkeit"?
Babou
Das hat Gödel gedacht. Bob Soare hat dazu ein paar Worte zu sagen: cs.uchicago.edu/~soare/Publications/compute.ps .
Yuval Filmus
@YuvalFilmus Dies ist 46 Seiten. Ich meine, ich gebe einige Gründe an, warum es befriedigender sein sollte. Sie mögen naiv sein. Wenn es überzeugendere gibt, die den Erfolg erklären, ist dies ausdrücklich zu erwähnen.
Babou
Siehe Abschnitt 3.2. Es gab frühere Definitionen der Berechenbarkeit, aber sie überzeugten nicht. Turings war das erste, das überzeugte, zumindest für einige Schlüsselpersonen.
Yuval Filmus
21

Turing-Complete ist nur ein Name. Sie können es Abdul-komplett nennen, wenn Sie wollen. Namen werden historisch entschieden und oft nach "falschen" Personen benannt. Es ist ein soziologischer Prozess, der keine klaren Kriterien hat. Der Name hat über die offizielle Semantik hinaus keine Bedeutung.

Imperative Sprachen basieren nicht auf Turing-Maschinen. Sie basieren auf RAM-Maschinen. Ihr Computer ist ein RAM-Computer. Turing-Maschinen sind ein schönes theoretisches Modell, aber sie sind kein sehr gutes Modell für tatsächliche Computer.

Programmiersprachen, die auf anderen Paradigmen basieren, können sehr erfolgreich sein, auch wenn die zugrunde liegende CPU sie nicht von Haus aus unterstützt. Drucker führen beispielsweise eine Stapelsprache aus. Programmierung ist mehr als nur Maschinencode.

Yuval Filmus
quelle
"Turing-Maschinen sind ein schönes theoretisches Modell, aber sie sind kein sehr gutes Modell für tatsächliche Computer." Abgesehen von dem Mangel an unendlichem Speicher, was sind andere Gründe, warum es kein gutes Modell für tatsächliche Computer ist? Habe ich auch richtig gedacht, dass funktionale Sprachen auf Lambda basieren?
Abdul
5
λ
11
Imperative Sprachen neigen dazu, Array-Zugriffe in konstanter Zeit in C zuzulassen A[x]. Turingmaschinen können dies nicht in konstanter Zeit tun. Deshalb wird auch in der theoretischen Informatik die Laufzeit von Algorithmen eher am RAM-Maschinenmodell als am Turing-Maschinenmodell analysiert.
Yuval Filmus
14
Eigentlich Turingmaschinen sind ein gute tatsächlichen Computer ... außer , dass , wenn Turing seine Zeitung schrieb : „Computer“ war eine Stellenbeschreibung für einen Menschen mit Stift und Papier arbeiten. Der Lese- / Schreibkopf ist ein Modell eines Stifts, das Klebeband ist ein Modell eines unendlichen Stapels von Papierbögen (schneiden Sie sie einfach in kleine Streifen und kleben Sie sie zusammen), das Alphabet ist ein Modell unseres Alphabets und die endlichen Übergänge sind ein Modell für die begrenzte Anzahl von Regeln, die man im Kopf behalten kann.
Jörg W Mittag
3
Das war die beste Einsicht, die ich je hatte, warum zum Teufel die Turing-Maschine gewählt hat. Ich habe mich immer gefragt, "warum er so ein beschissenes Rechenmodell gewählt hat". Ich habe immer gedacht, wenn mir die Erfindung der Berechnungstheorie überlassen worden wäre (Gott helfe uns, wir wären nicht weit davon entfernt), hätte ich wahrscheinlich immer noch ein besseres Rechenmodell gewählt. Jetzt komme ich dahin, wo er herkommt und es macht so viel mehr Sinn.
Jake
10

Weil "Turing-komplett" nur "es kann berechnen, was eine Turing-Maschine berechnen kann" bedeutet.

David Richerby
quelle
Turing-complete könnte auch zu Ehren von Turing (der Person) benannt werden, die die erste philosophisch befriedigende Definition von Berechenbarkeit gefunden hat; oder es könnte zu Ehren von Turings Artikel benannt werden, in dem er dieses Konzept beschreibt.
Yuval Filmus
1
@YuvalFilmus: Es könnte nach Alan Turings Mutter benannt sein, aber die Behauptung hier ist, dass es nicht so ist ;-)
Steve Jessop
@YuvalFilmus Könnte sein (ist es aber meines Wissens nicht). Aber woher der Begriff kommt, ist nur von untergeordneter Bedeutung. Was hier zählt, ist was der Begriff bedeutet .
David Richerby
2
Das ist kurz und süß, aber vielleicht ein bisschen zu kurz. Was "macht" eine Turingmaschine? Nun, unter den Dingen, die sie "tun", ist das Lesen und Schreiben von Bändern, was Lambda-Ausdrücke nicht tun.
Theodore Norvell
@TheodoreNorvell Ich denke, Ihr Kommentar ist ähnlich zu dem, was ich gedacht habe. Ich wusste, dass Lambda-Kalkül und die Turing-Maschine in der Leistung gleichwertig sind, aber im Mechanismus unterschiedlich (und jetzt habe ich erfahren, dass es andere gibt), aber ich fragte mich, ob der Begriff "Turing-Vollständigkeit" in irgendeiner Weise speziell für die Turing-Maschine war oder wenn es nur ein Name wäre.
Abdul
6

Eine Ihrer Fragen scheint noch nicht beantwortet worden zu sein:

Wenn dies der Fall ist, was entspricht dann einer Lambda-Rechenmaschine?

Eine Lisp-Maschine . Hardware, die speziell für das LISP-Berechnungsmodell entwickelt wurde. Der Wikipedia-Artikel handelt von kommerziellen Produkten, aber mein Studienleiter an der Universität hatte ein handgefertigtes in seinem Büro.

Peter Taylor
quelle
0

Die von Church erfundenen funktionalen Sprachen in Form von Lambda-Kalkül erwiesen sich als vollständig. Dies ist ein tatsächlicher mathematischer Beweis, der in veröffentlichten wissenschaftlichen Arbeiten gefunden werden kann, indem die Lambda-Rechnung auf Operationen / Berechnungen auf Turing-Maschinen "reduziert" wird. Um die Zeit von Turings Paper 1936 und später wurden verschiedene "umfassende" Berechnungsmodelle vorgeschlagen / zirkuliert. es wurde nicht sofort erkannt, dass alle gleichwertig waren. Die Beweise, dass sie gleichwertig sind, wurden ungefähr in den späten 1930er und 1940er Jahren nach Turings Papier veröffentlicht.

Die Turing-Maschine ist konzeptionell (aber nicht funktional) einfacher als die anderen Modelle. Dies ist wahrscheinlich ein wesentlicher Grund dafür, dass die Turing-Vollständigkeit nach ihm benannt wurde. Andere Ideen wie die Lambda-Rechnung sind abstrakter und haben ihren Ursprung hauptsächlich in der Mathematik / Logik-Theorie. Turing schlug eine theoretische Maschine vor . Eine "Maschine" ist buchstäblich ein "physisches Gerät".. Es ist ein bemerkenswertes konzeptuelles Objekt / eine bemerkenswerte Konstruktion, die zwei verschiedene Welten verbindet, die angewandte und die theoretische. es verleiht physikalischen Entitäten eine neue abstrakte Bedeutung, zB "Zeit und Raum". Es ist kein Zufall, dass Mathematiker manchmal von "Technologie", "Maschinen" oder "Geräten" für Beweise sprechen. Turing ist es gelungen, all dies in seiner konzeptuellen Erfindung genial zu verschmelzen. Die Definition ist recht einfach, aber die Analyse zeigt einige der außergewöhnlichsten neuen Verhaltensweisen, die jemals in der Geschichte des wissenschaftlichen / mathematischen Denkens beobachtet wurden. Turing war der erste Wissenschaftler / Mathematiker, der viel von dieser Bedeutung / Kraft / Potenzial begriff.

vzn
quelle
mit anderen Worten könnte man sagen, dass Turing das erste war, das die Bedeutung des Phänomens der Vollständigkeit von Turing identifizierte / "erkannte", und CS "erkannte" ihn für diese monumentale Leistung durch die Verwendung des Begriffs.
vzn
X