Perché i linguaggi funzionali di Turing sono completi?


22

Forse la mia comprensione limitata dell'argomento non è corretta, ma questo è quello che ho capito finora:

  • La programmazione funzionale si basa su Lambda Calculus, formulato da Alonzo Church.

  • La programmazione imperativa si basa sul modello della macchina di Turing, realizzato da Alan Turing, studente della Chiesa.

  • Il calcolo Lambda è potente e capace come la Macchina di Turing, nel
    senso che sono equivalenti in potenza computazionale.

Se la programmazione funzionale si basa su Lambda Calculus e non sulla macchina di Turing, allora perché alcuni (o tutti) di loro sono descritti come Turing completi, e non Lambda completi o qualcosa del genere? Il termine "completezza di Turing" è speciale in qualche modo per le macchine di Turing o è solo una parola?

Infine, se i linguaggi imperativi si basano su Turing Machine e i computer sono fondamentalmente macchine Turing, senza memoria infinita, significa che funzionano meglio dei linguaggi di programmazione funzionale sui nostri moderni PC?

In tal caso, quale sarebbe l'equivalente di una macchina per il calcolo lambda?

So che sembra che ci siano 3 domande separate, ma sono tutte strettamente correlate e ognuna dipende dalla domanda precedente essendo una domanda valida per cominciare.


6
Non è una risposta, ma hai detto che non tutte le versioni del calcolo lambda sono Turing complete. Il calcolo Lambda tipicamente semplice e le versioni più potenti di Coq e Agda basate sul controllo di terminazione, non sono Turing Complete (perché hanno problemi di arresto decidibili). Linguaggi fortemente tipizzati come Haskell e SML riescono a ovviare a questo consentendo una ricorsione arbitraria con un combinatore di punti fissi, un termine con tipo (a -> a) -> a.
jmite,

È così sbagliato dire "definito come Turing completo". Possiamo per favore cambiare il titolo?
Andrej Bauer,

@AndrejBauer Grazie per la modifica del titolo, ma sono curioso di sapere perché ( definito come Turning Complete ) sbagliato? È perché è un aggettivo? Descritto sarebbe una parola migliore di definire?
Abdul,

1
@Abdul Bene, il problema è la parola "definita". Se dici che "i linguaggi funzionali sono definiti come Turing completi", stai dicendo che la definizione di "linguaggio funzionale" o la definizione di "Turing completo" afferma che i linguaggi funzionali sono Turing completi. È un dato di fatto, nessuna definizione lo dice.
Tanner Swett,

Risposte:


20

In breve :

Ciò che caratterizza i linguaggi di programmazione imperativa vicini alle macchine di Turing e ai normali computer come i PC (più vicini alle macchine ad accesso casuale (RAM) piuttosto che alle macchine di Turing) è il concetto di memoria esplicita che può essere modificata per memorizzare (risultati intermedi ). È una vista automatica del calcolo, con un concetto di uno stato (comprendente sia il controllo dello stato finito che il contenuto della memoria) che può cambiare man mano che il calcolo procede.

La maggior parte degli altri modelli sono più astratti. Sebbene possano esprimere il calcolo come una successione di fasi di trasformazione di una struttura originale, queste trasformazioni sono applicate in una sorta di universo intemporale di significati matematici. Ciò può preservare proprietà, come la trasparenza referenziale, che possono semplificare l'analisi matematica. Ma è più remoto dai modelli fisici naturali che si basano sul concpet della memoria.

Pertanto non esistono macchine funzionali naturali, se non in un senso più ampio, come spiegato di seguito, poiché il software non è realmente separabile dall'hardware.

Il riferimento a Turing come parametro di computabilità deriva probabilmente dal fatto che il suo modello, la macchina di Turing, era il più vicino a questo vincolo di realizzabilità fisica, che lo rendeva un modello di calcolo più intuitivo.

Ulteriori considerazioni :

Esistono molti modelli di calcolo, progettati per catturare nel modo più generale possibile il concetto di calcolo. Includono macchine di Turing, in realtà in molti gusti diversi, il calcolo lambda (anche sapori), sistemi di riscrittura semi-Thue, funzione ricorsiva parziale, logica combinatoria.

Tutti catturano alcuni aspetti delle varie tecniche utilizzate dai matematici per esprimere o condurre calcoli. E la maggior parte sono stati usati in una certa misura come base per la progettazione di alcuni linguaggi di programmazione (ad es. Snobol per sistemi di riscrittura, APL per combinatori, Lisp / Scheme per calcolo lambda) e spesso possono essere combinati in diversi modi nei moderni linguaggi di programmazione.

Un risultato importante è che tutti questi modelli di calcolo sono stati dimostrati equivalenti, il che porta alla tesi Church-Turing secondo cui nessun modello di calcolo fisicamente realizzabile può fare di più di qualsiasi di questi modelli. Un modello di calcolo è detto Turing completo se si può dimostrare di essere equivalente a uno di questi modelli, quindi equivalente a tutti loro.

Il nome avrebbe potuto essere diverso. La scelta della macchina di Turing (TM) come riferimento è probabilmente dovuta al fatto che è probabilmente il più semplice di questi modelli, imitando da vicino (anche se semplicisticamente) il modo in cui un essere umano calcola e abbastanza facile da implementare (in una forma limitata limitata ) come dispositivo fisico, a tal punto che le macchine Turing sono state costruite con set Lego . L'idea di base non richiede sofisticazione matematica. È probabilmente la semplicità e la realizzabilità del modello a dargli questa posizione di riferimento.

Al momento in cui Alan Turing ha creato il suo dispositivo di elaborazione, altre proposte erano sul tavolo per servire come definizione formale di calcolabilità, una questione cruciale per le basi della matematica (vedi il problema di Entscheidungs ). La proposta di Turing è stata considerata dagli esperti dell'epoca come il lavoro più convincente che comprende in modo convincente quale dovrebbe essere la calcolabilità (vedi Computabilità e ricorsione , RI Soare, 1996, vedere la sezione 3.2). Le varie proposte si sono dimostrate equivalenti, ma quelle di Turing sono state più convincenti. [dai commenti di Yuval Filmus]

Va notato che, da un punto di vista hardware, i nostri computer non sono macchine Turing, ma piuttosto ciò che viene chiamato Random Access Machines (RAM) , che sono anche Turing completi.

Il linguaggio puramente imperativo (qualunque cosa ciò possa significare) sono probabilmente i formalismi utilizzati per i modelli più elementari, come le macchine di Turing, o il linguaggio assembly (saltando la sua codifica binaria) dei computer. Entrambi sono notoriamente illeggibili e con cui è molto difficile scrivere programmi significativi. In realtà, anche il linguaggio assembly ha alcune funzionalità di livello superiore per facilitare un po 'la programmazione, rispetto all'uso diretto delle istruzioni della macchina. I modelli imperativi di base sono chiusi ai mondi fisici, ma non molto utilizzabili.

Ciò ha portato rapidamente allo sviluppo di modelli di calcolo di livello superiore, che hanno iniziato a mescolarvi una varietà di tecniche computazionali, come sottoprogrammi e chiamate di funzione, denominazione della posizione della memoria, ambito di nomi, quantificazione e variabili fittizie, già utilizzate in qualche forma in matematica e logica, e anche concetti molto astratti come la riflessione ( Lisp 1958).

La classificazione dei linguaggi di programmazione in paradigma di programmazione come imperativo, funzionale, logico, orientato agli oggetti si basa sulla preminenza di alcune di queste tecniche nella progettazione del linguaggio e sulla presenza o assenza di alcune funzionalità di elaborazione che impongono alcune proprietà per i programmi o frammenti di programma scritti nella lingua.

Alcuni modelli sono convenienti per macchine fisiche. Alcuni altri sono più convenienti per una descrizione di alto livello degli algoritmi, che può dipendere dal tipo di algoritmo che deve essere descritto. Alcuni teorici usano persino specifiche non deterministiche degli algoritmi, e persino questo può essere tradotto in termini di programmazione più convenzionali. Ma non vi è alcun problema di discrepanza, perché abbiamo sviluppato una sofisticata tecnologia di compilatore / interprete che può tradurre ogni modello in un altro secondo necessità (che è anche la base della tesi di Church-Turing).

Ora, non dovresti mai guardare il tuo computer come hardware grezzo. Contiene circuiti booleani che elaborano in modo molto elementare. Ma gran parte di esso è guidato da micro-programmi all'interno del computer di cui non si arriva mai a conoscenza. Quindi hai il sistema operativo che fa apparire la tua macchina anche diversa da quella dell'hardware, inoltre potresti avere una macchina virtuale che esegue il codice byte e quindi un linguaggio di alto livello come Pyva e Jathon o Haskell o OCaml, che può essere compilato in codice byte.

Ad ogni livello viene visualizzato un modello di calcolo diverso. È molto difficile separare il livello hardware dal livello software, quindi assegnare un modello computazionale specifico a una macchina. E poiché sono tutti intercambiabili, l'idea di un modello di calcolo hardware definitivo è praticamente un'illusione.

La macchina per il calcolo lambda esiste: è un computer in grado di ridurre le espressioni del calcolo lambda. Annuncio che è facile da fare.

Informazioni su architetture di macchine specializzate

In realtà, integrando la risposta di Peter Taylor e dando seguito all'intreccio hardware / software, sono state prodotte macchine specializzate per adattarsi meglio a un paradigma specifico e il loro software di base è stato scritto in un linguaggio di programmazione basato su quel paradigma.

Questi includono

Fondamentalmente, queste sono anche strutture hardware imperative, ma mitigate con speciali funzioni hardware o interpreti microprogrammati per adattarsi meglio al paradigma desiderato.

In realtà, l'hardware specializzato per paradigmi specifici non sembra aver mai avuto successo nel lungo periodo. Il motivo è che la tecnologia di compilazione per implementare qualsiasi paradigma sull'hardware vanilla è diventata sempre più efficace, quindi l'hardware specializzato non era tanto necessario. Inoltre, le prestazioni dell'hardware sono state in rapido miglioramento, ma il costo del miglioramento (inclusa l'evoluzione del software di base) è stato più facilmente ammortizzato sull'hardware vanilla che sull'hardware specializzato. L'hardware specializzato non potrebbe competere a lungo termine.

Tuttavia, e anche se non ho dati precisi su questo, sospetterei che queste iniziative abbiano lasciato alcune idee che hanno influenzato l'evoluzione delle macchine, dei ricordi e dell'architettura dei set di istruzioni.


La scelta della macchina di Turing come riferimento, nella misura in cui è effettivamente fatta, è motivata principalmente dal punto di vista storico: Turing è stata la prima a trovare una definizione soddisfacente di calcolabilità.
Yuval Filmus,

@YuvalFilmus E perché era più una "definizione soddisfacente di calcolabilità"?
babou,

Questo è quello che pensava Gödel. Bob Soare ha alcune parole da dire sull'argomento qui: cs.uchicago.edu/~soare/Publications/compute.ps .
Yuval Filmus,

@YuvalFilmus Queste sono 46 pagine. Voglio dire, sto dando alcuni motivi per cui dovrebbe essere più soddisfacente. Possono essere ingenui. Se ce ne sono di più convincenti che spiegano il successo, è menzionato esplicitamente.
babou

Guarda la sezione 3.2. C'erano precedenti definizioni di calcolabilità ma non erano convincenti. Quello di Turing è stato il primo ad essere convincente, almeno per alcune persone chiave.
Yuval Filmus,

21

Turing-complete è solo un nome. Puoi chiamarlo Abdul-complete se vuoi. I nomi sono decisi storicamente e spesso prendono il nome da persone "sbagliate". È un processo sociologico che non ha criteri chiari. Il nome non ha alcun significato oltre la sua semantica ufficiale.

Le lingue imperative non si basano su macchine di Turing. Si basano su macchine RAM. Il tuo computer è una macchina RAM. Le macchine di Turing sono un bel modello teorico, ma non sono un ottimo modello di computer reali.

I linguaggi di programmazione basati su altri paradigmi possono avere molto successo, anche se la CPU sottostante non li supporta in modo nativo; ad esempio, le stampanti eseguono un linguaggio stack. C'è di più nella programmazione oltre al codice macchina.


"Le macchine di Turing sono un bel modello teorico, ma non sono un ottimo modello di computer reali." Tranne la mancanza di memoria infinita, quali altri motivi non è un buon modello per i computer reali? Inoltre, avevo ragione nel pensare che i linguaggi funzionali fossero basati sul calcolo lambda?
Abdul,

5
λ

11
Linguaggi imperativi tendono a consentire accessi matrice in tempo costante, in C A[x]. Le macchine di Turing non possono farlo in tempo costante. Ecco perché anche nell'informatica teorica, il tempo di esecuzione degli algoritmi viene analizzato sul modello di macchina RAM piuttosto che sul modello di macchina di Turing.
Yuval Filmus,

14
In realtà, le macchine di Turing sono un buon computer vero ... tranne che quando Turing ha scritto il suo documento, "computer" era una descrizione del lavoro per un essere umano che lavora con carta e penna. La testina di lettura / scrittura è un modello di penna, il nastro è un modello di una pila infinita di fogli di carta (basta tagliarli in piccole strisce e incollarli insieme), l'alfabeto è un modello del nostro alfabeto e le transizioni finite sono un modello della quantità limitata di regole che si possono tenere in testa.
Jörg W Mittag,

3
Questa è stata la migliore intuizione che io abbia mai avuto sul perché l'inferno Turing abbia scelto la macchina Turing. Mi sono sempre chiesto "perché ha scelto un modello di calcolo così schifoso". Ho sempre pensato che se mi fosse stata lasciata l'invenzione della teoria del calcolo (dio ci aiuti; non saremmo molto lontani) probabilmente avrei ancora scelto un modello di calcolo migliore. Ora capisco da dove viene e ha molto più senso.
Jake,

10

Perché "Turing-complete" significa semplicemente "può calcolare tutto ciò che una macchina Turing può calcolare".


Turing-complete potrebbe anche essere nominato in onore di Turing (la persona), che ebbe la prima definizione filosoficamente soddisfacente di calcolabilità; oppure potrebbe essere nominato in onore del documento di Turing in cui descrive questo concetto.
Yuval Filmus,

1
@YuvalFilmus: potrebbe prendere il nome dalla mamma di Alan Turing, ma l'affermazione qui è che non lo è ;-)
Steve Jessop

@YuvalFilmus Potrebbe essere (anche se, per quanto ne so, non lo è). Ma la provenienza del termine è di secondaria importanza. Ciò che conta qui è ciò che significa il termine .
David Richerby,

2
Questo è breve e dolce, ma forse un po 'troppo corto. Cosa "fa" una macchina Turing? Bene tra le cose che "fanno" è leggere e scrivere nastri, cosa che le espressioni lambda non fanno, Meglio sarebbe "I modelli di calcolo completi di Turing consentono di calcolare tutte le funzioni calcolabili".
Theodore Norvell,

@TheodoreNorvell Penso che il tuo commento sia simile a quello che stavo pensando. Sapevo che il calcolo lambda e la macchina di Turing sono equivalenti in potenza, ma diversi nel meccanismo (e ora ho imparato che ce ne sono altri), ma mi chiedevo se il termine "completezza di Turing" fosse in qualche modo speciale per la macchina di Turing, o se fosse solo un nome.
Abdul,

6

Una delle tue domande non sembra aver ancora ricevuto risposta:

In tal caso, quale sarebbe l'equivalente di una macchina per il calcolo lambda?

Una macchina Lisp . Hardware progettato specificamente per adattarsi al modello di calcolo LISP. L'articolo di Wikipedia parla di prodotti commerciali, ma il mio direttore degli studi all'università ne aveva costruito uno a mano nel suo ufficio.


0

i linguaggi funzionali sotto forma di calcolo lambda inventati dalla Chiesa furono dimostrati completi da Turing. questa è una vera prova matematica che può essere trovata in articoli scientifici pubblicati "riducendo" il calcolo lambda a operazioni / calcoli su macchine di Turing. intorno al tempo del documento di Turings del 1936 e successivi, furono proposti / diffusi diversi modelli di calcolo "completi". è stato non immediatamente reso conto che tutti fossero equivalenti. le prove della loro equivalenza furono pubblicate approssimativamente alla fine degli anni '30 e '40 dopo il documento di Turings.

la macchina di Turing è concettualmente (ma non funzionalmente) più semplice degli altri modelli e questa è probabilmente una parte significativa della ragione per cui la completezza di Turing prende il suo nome. altre idee come il calcolo lambda sono più astratte e sono iniziate / originate principalmente dalla teoria matematica / logica. Turing ha proposto una macchina teorica . una "macchina" è letteralmente un "dispositivo fisico". è un oggetto / costruzione concettuale notevole che lega / unifica due mondi diversi, quello applicato e quello teorico. dà un nuovo significato astratto alle entità fisiche, ad esempio "tempo e spazio". non è una semplice coincidenza che i matematici talvolta facciano riferimento a "tecnologia", "macchinari" o "dispositivi" di prove. Turing è riuscito a fondere ingegnosamente tutto ciò nella sua invenzione concettuale. la suala definizione è abbastanza semplice ma l'analisi mostra alcuni dei comportamenti emergenti più straordinari mai visti nella storia del pensiero scientifico / matematico. Turing è stato il primo scienziato / matematico a cogliere gran parte di questo significato / potere / potenziale.


in altre parole si potrebbe dire che Turing è stato il primo a identificare / "riconoscere" il significato del fenomeno della completezza di Turing e, a sua volta, CS lo "riconosce" per questo monumentale risultato attraverso l'uso del termine.
vzn,

La tua riduzione è al contrario. Per dimostrare la completezza di Turing di alcuni sistemi,X, è necessario ridurre il calcolo della macchina di Turing su quel sistema.
David Richerby, l'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.