Linguaggi di programmazione per un calcolo efficiente


32

È impossibile scrivere un linguaggio di programmazione che consenta a tutte le macchine che si fermano su tutti gli input e nessun altro. Tuttavia, sembra facile definire un tale linguaggio di programmazione per qualsiasi classe di complessità standard. In particolare, possiamo definire un linguaggio in cui possiamo esprimere tutti i calcoli efficienti e solo i calcoli efficienti.

Ad esempio, per qualcosa come : prendi il tuo linguaggio di programmazione preferito e dopo aver scritto il tuo programma (corrispondente a Turing Machine ), aggiungi tre valori all'intestazione: un numero intero un numero intero , e un output predefinito . Quando il programma viene compilato, emettere una macchina di Turing che ha dato input di dimensione esegue su per passi . Se non si interrompe prima che i passaggi di siano attivi, emette l'output predefinitoPMckdMxnMxcnkMcnkd. A meno che non mi sbagli, questo linguaggio di programmazione ci permetterà di esprimere tutti i calcoli in e niente di più. Tuttavia, questa lingua proposta è intrinsecamente non interessante.P

La mia domanda: ci sono linguaggi di programmazione che catturano sottoinsiemi di funzioni calcolabili (come tutte le funzioni calcolabili in modo efficiente) in modo non banale? Se non ci sono, c'è una ragione per questo?


7
Alcuni semplici esempi di linguaggi di programmazione che catturano sottoinsiemi di funzioni calcolabili: espressioni regolari e grammatiche senza contesto.
Jukka Suomela,

2
In realtà i linguaggi che catturano la classe di complessità come (che è definita in modo simile alle primitive funzioni ricorsive con ricorsione sostituita da ricorsione limitata) sono piuttosto interessanti (almeno dal punto di vista teorico). :)PPV
Kaveh,

La programmazione lineare e intera acquisisce sottoinsiemi interessanti di funzioni calcolabili.
Diego de Estrada,

Il datalog può solo esprimere algoritmi temporali polinomiali, ma non so se può esprimere tutti gli algoritmi temporali polinomiali.
Jules,

Il noto documento "Programmazione funzionale totale" fa l'argomento che i linguaggi di programmazione che non hanno un problema irreversibile di arresto sono in realtà pratici e utili. jucs.org/jucs_10_7/total_functional_programming
nessuno

Risposte:


32

Un linguaggio che tenta di esprimere solo calcoli temporali polinomiali è il calcolo lambda morbido . Il suo sistema di tipi è radicato nella logica lineare. Una recente tesi affronta i calcoli del tempo polinomiale e fornisce un buon riassunto dei recenti sviluppi basati su questo approccio. Martin Hofmann ha lavorato sull'argomento per un po 'di tempo. Un vecchio elenco di documenti pertinenti può essere trovato qui ; Molti dei suoi lavori continuano in questa direzione.

Altri lavori adottano l'approccio per verificare che il programma utilizzi una determinata quantità di risorse, utilizzando Tipi dipendenti o Linguaggio di assemblaggio tipizzato .

Tuttavia, altri approcci si basano su calcoli formali limitati alle risorse , come le varianti del calcolo ambientale.

Questi approcci hanno la proprietà che programmi ben tipizzati soddisfano alcuni limiti di risorse predefiniti. Il limite di risorse potrebbe essere il tempo o lo spazio e generalmente può dipendere dalla dimensione degli input.

I primi lavori in questo settore riguardano la normalizzazione dei calcoli, il che significa che tutti i programmi ben scritti si fermano. Il sistema F , noto anche come calcolo polimorfo di lambda, si sta fortemente normalizzando. Non ha un operatore a virgola fissa, ma è comunque piuttosto espressivo, anche se non credo sia noto a quale classe di complessità corrisponda. Per definizione, qualsiasi calcolo fortemente normalizzante esprime una classe di calcoli terminanti.

Il linguaggio di programmazione Charity è un linguaggio funzionale abbastanza espressivo che si ferma su tutti gli input. Non so quale classe di complessità possa esprimere, ma la funzione di Ackermann può essere scritta in Beneficenza.


Cosa intendi con "almeno" qui?
nponeccop,

'Almeno' qui significa 'alcuni'. Cambierò la mia risposta per renderla un po 'più precisa.
Dave Clarke,

Sono abbastanza sicuro che la complessità delle funzioni definibili nel sistema F sia la classe di funzioni che terminano nel tempo "una funzione dimostrabilmente totale dell'aritmetica del 2 ° ordine" dell'ingresso. Non una classe di complessità molto convenzionale, ma comunque ...
cody

cody: secondo i "Teoremi di Wadler gratis", il Sistema F può esprimere "ogni funzione ricorsiva che può essere dimostrata totale nell'aritmetica di Peano del secondo ordine", e che "include la funzione [...] di Ackermann". Non sono sicuro che sia lo stesso che stai descrivendo. La caratteristica principale di Charity è il suo supporto per i codata, mentre penso che il controllo di terminazione di Agda consenta una maggiore espressività sia di Coq che di System F garantendo allo stesso tempo la risoluzione.
Blaisorblade,


8

Vorrei anche menzionare la teoria della complessità implicita come approccio a questo, dal momento che l'ho vista emergere in diverse domande in qualche modo correlate. Per citare questa risposta di Neel Krishnaswami :

La tecnica di base consiste nel mettere in relazione le classi di complessità con i sottosistemi della logica lineare (le cosiddette "logiche lineari leggere"), con l'idea che l'eliminazione del taglio per il sistema logico dovrebbe essere completa per la classe di complessità data (come LOGSPACE, PTIME, ecc.). Quindi tramite Curry-Howard si ottiene un linguaggio di programmazione in cui sono espressibili esattamente i programmi di una determinata classe.


5

Sono sorpreso che nessuno abbia menzionato la ricorsione primitiva. Limitando i loop limitati (ovvero il numero di iterazioni per ciascun loop deve essere calcolato prima dell'inizio del loop), il programma risultante è ricorsivo primitivo, e quindi totale. Douglas Hofstadter ha proposto un linguaggio di programmazione, BLOOP, che ha permesso tutte e solo le funzioni ricorsive primitive.


1
È una sottoclasse corretta di tutte le funzioni, ma chiamarla una classe di funzioni "efficienti" potrebbe essere un po 'allungata.
Raffaello,

Suppongo che tu possa modificarlo per catturare usando la caratterizzazione di Cobham come ricorsione polinomialmente limitata. PP
Kaveh,

Altri hanno menzionato il Sistema F e altri linguaggi fortemente normalizzanti, che in un certo senso supportano solo la "ricorsione primitiva". Tuttavia, poiché supportano funzioni di prima classe, consentono di scrivere più programmi (come la funzione Ackermann).
Blaisorblade,

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.