Quali sono i limiti della programmazione funzionale totale?


19

Quali sono i limiti della programmazione funzionale totale? Non è completo di Turing, ma supporta ancora un ampio sottoinsieme dei programmi possibili. Ci sono costrutti importanti che potresti scrivere in un linguaggio completo di Turing, ma non in un linguaggio funzionale totale?

Ed è corretto affermare che i programmi scritti in linguaggi funzionali totali possono essere completamente analizzati staticamente, mentre l'analisi statica nei linguaggi completi di Turing è limitata da cose come l'arresto del problema? Con ciò non intendo che nei linguaggi funzionali totali tutto può essere determinato staticamente, perché alcune cose sono note solo in fase di esecuzione, ma intendo che in teoria, i programmi scritti in un linguaggio di programmazione funzionale totale ideale, possono essere analizzati in modo che tutto ciò che potrebbe in teoria essere determinato staticamente può essere determinato staticamente. O ci sono ancora problemi indecidibili ereditati in linguaggi funzionali totali che rendono incompleta l'analisi statica? Alcuni problemi saranno sempre indecidibili, indipendentemente dalla lingua in cui sono scritti, ma sono interessato a tali problemi che sono ereditari della lingua,

Risposte:


16

Dipende dal linguaggio funzionale totale .

Questa risposta sembra un cop-out, ma non si può dire nulla di più specifico. Dopo tutto, considera qualsiasi importante programma decidibile che ti interessa. Scrivi un programma nella tua lingua preferita di Turing per risolverlo. Poiché il problema è decidibile, il programma si arresterà su tutti gli input.

(Probabilmente, un problema non decidibile potrebbe avere programmi interessanti, ma non tali che le persone possano usare, perché non saranno mai in grado di aspettare abbastanza a lungo per conoscere la risposta.)

Ora, definisci una nuova lingua in modo tale che abbia un solo programma di input valido: il programma che hai appena scritto, con la stessa semantica di prima. È sicuramente totale, poiché tutti gli input per tutti i programmi scritti (di cui ce n'è solo uno) terminano sempre.

Questo trucco economico è in realtà utile: il linguaggio Coq , ad esempio, è un linguaggio funzionale totale in quanto nessun programma viene controllato a meno che non ci sia una prova che termina. (Se dovessi rinunciare a tale requisito, sarebbe Turing completo, quindi l'unico ostacolo è trovare una prova della risoluzione.)

Non sono sicuro di cosa intendi per "tutto ciò che potrebbe in teoria essere determinato staticamente può essere determinato staticamente"; sembra tautologicamente vero. Tuttavia, le lingue totali non sono intrinsecamente facili da analizzare; sai che nulla differisce, il che è un fatto utile, ma la relazione tra input e output è ancora complessa. (In particolare, ci sono ancora infiniti possibili input, quindi non puoi provarli esaurientemente, anche in teoria.)


Grazie per la tua risposta. Quindi essere totale aiuta in qualche modo, ma rimane un problema molto difficile. Ciò che intendevo con "tutto ciò che poteva in teoria essere determinato staticamente può essere determinato staticamente" era che sarebbe possibile, estremamente difficile o no, analizzare tutte le relazioni tra input e output, se si avessero abbastanza risorse per farlo . O sono le ragioni fondamentali per cui questo è limitato? Come il teorema di Rice dimostra che questo è il caso delle funzioni parziali. O sto fraintendendo il teorema di Rice?
Matthijs Steen,

Penso che possa dipendere da cosa intendi per "relazione". In particolare, se intendi semplicemente "l'ingresso A va all'uscita B", ciò è banalmente determinabile in un linguaggio funzionale totale; basta eseguire il programma. Ma probabilmente sei interessato ad analisi che dicono qualcosa su una classe infinita di input.
Paul Stansifer,

(oops; premi invio per sbaglio) ... ma questo apre un altro trucco sciocco, perché posso fare domande indecidibili sulla funzione di identità se voglio: "Per alcuni X, è (identity X)una macchina di Turing che si ferma?" Certo, questo non sembra riguardare identity , ma come si definisce "about"?
Paul Stansifer,

Sì, voglio sapere se vale per tutti i possibili valori di input di alcune definizioni, non per i singoli input. Quindi, se ti capisco correttamente, vuoi dire che ci saranno sempre alcune domande indecidibili, indipendentemente dal tipo di linguaggio di programmazione utilizzato? Sebbene alcune di queste domande indecidibili possano essere eluse prevenendo in primo luogo il problema, come i linguaggi funzionali totali per il problema dell'arresto? Perché la tua domanda sulla funzione identità non sarebbe decidibile in un linguaggio funzionale totale?
Matthijs Steen,

Sì; una versione modificata del problema, in cui "Turing Machine" è sostituita da "Guasti dopo la scadenza della garanzia Turing Machine" è banalmente risolvibile. È un po 'problematico per questi scopi che il problema dell'arresto sia l'esempio principale di un problema indecidibile quando l'esame dei programmi è pieno zeppo di indecidibilità.
Paul Stansifer,

16

Quali sono i limiti della programmazione funzionale totale? Non è completo di Turing, ma supporta ancora un ampio sottoinsieme dei programmi possibili. Ci sono costrutti importanti che potresti scrivere in un linguaggio completo di Turing, ma non in un linguaggio funzionale totale?

LLL

  1. LLLLè consistente. Questo è esattamente ciò che esclude il teorema di Goedel, supponendo che tu possa fare l'aritmetica. Quindi sappiamo che non possiamo scrivere auto-interpreti in linguaggi funzionali totali.

  2. Il rovescio della medaglia, tuttavia, è che i limiti del potere espressivo dei linguaggi totali sono essenzialmente i limiti del potere espressivo della matematica stessa . Ad esempio, le funzioni definibili in Coq (un assistente di prova) sono quelle che possono essere dimostrate calcolabili usando ZFC, con numerosissimi cardinali inaccessibili. Quindi, in sostanza, qualsiasi funzione che potresti dimostrare totalmente soddisfacente per un matematico che lavora è definibile in Coq.

  3. Il rovescio della medaglia è che la matematica è difficile! Quindi non ha alcun senso in quale lingua totale sia "completamente analizzabile" - anche se sai che una funzione termina, potresti comunque dover fare molto lavoro creativo per dimostrare che ha una proprietà che desideri. Ad esempio, il solo fatto di sapere che una funzione dagli elenchi agli elenchi è totale, non ti spinge molto a dimostrare che si tratta di una funzione di ordinamento ....


Grazie per la tua risposta. Ho letto il post su questo problema nel blog di Lambda the Ultimate , ma alcune persone nei commenti affermano che sebbene non sia possibile avere il proprio valutatore come un termine esplicitamente costruibile, sarebbe possibile creare un lavoro autonomo valutatore con alcuni trucchi. Quindi mi chiedo, ci sono problemi che non possono essere risolti (o approssimati) in un linguaggio funzionale totale con alcuni trucchi di deviazioni?
Matthijs Steen,

Direi che l'autovalutazione non conta come un problema, perché varia a seconda della lingua. Il problema "valuta un programma in lingua X" è lo stesso problema, indipendentemente dal fatto che tu provi a risolverlo in lingua X o Y. In particolare, se la lingua X è un linguaggio funzionale totale, il problema è risolvibile in un linguaggio funzionale totale , usando lo stesso trucco sciocco che ho usato prima.
Paul Stansifer,

Neel, sembra che dovrebbe essere notevolmente più facile di quello per dimostrare che una lingua totale non può supportare il proprio interprete. Ti sto fraintendendo? Con una semplice diagonalizzazione, qualsiasi lingua con una funzione senza punti fissi non può supportare il proprio interprete (che supporti l'aritmetica o meno). L'argomento è elaborato da Conor McBride qui: mail.haskell.org/pipermail/haskell-cafe/2003-May/004343.html
Tom Ellis

@TomEllis: la mia tesi è essenzialmente la stessa di Conor. In effetti, il suo post fa già questa osservazione (con l'arguzia caratteristica di Conor) quando lo chiama "l'argomento Epimenides / Cantor / Russell / Quine / Godel / Turing".
Neel Krishnaswami,
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.