Alcuni linguaggi di programmazione usano come base le funzioni ricorsive generali?


23

Questa è una domanda ingenua e, quindi, probabilmente malformata, quindi scusa in anticipo!

La mia opinione è che una macchina di Turing può essere vista come la base computazionale per linguaggi di programmazione procedurali / imperativi. Allo stesso modo, il calcolo lambda è la base per linguaggi di programmazione funzionale.

Di recente ho appreso che la tesi Church-Turing mostra anche una equivalenza reciproca con un terzo modello di calcolo: funzioni ricorsive generali . Esistono linguaggi di programmazione che usano questo come modello di calcolo? In caso contrario, c'è un motivo tecnico per cui; vale a dire, oltre a "Nessuno ha ancora provato"?


1
Direi che le macchine di Turing o le macchine a registro universale sono alla base dei PL dei processori (Assembly PL). Non hanno funzioni. funzioni ricorsive sono una base di PL imperativi. Non hanno funzioni di ordine superiore. μ
Beroal,

1
Consiglierei anche di esaminare la logica del primo ordine e Prolog.
Beroal,

1
Prima dei C ++ 11 era constexprpossibile (/ dovevano) usare i 'template' per fare eseguire i calcoli in fase di compilazione dal compilatore. Le restrizioni sui modelli non consentono i loop, ma è possibile utilizzare la ricorsione per emulare qualsiasi loop, in modo da finire con una funzione Turing-complete (meta-programmazione) come parte dello standard del linguaggio C ++, vedere ad esempio stackoverflow.com/questions / 189172 / c-templates-turing-complete
JimmyB

Risposte:


45

Risposta diretta alla domanda: sì, ci sono PL esoterici e altamente poco pratici basati su funzioni ricorsive (pensa a Whitespace), ma nessun linguaggio pratico di programmazione si basa su funzioni recursive a causa di validi motivi.μμμ

Le funzioni generali ricorsive (cioè, -recursive) sono significativamente meno espressive dei calcoli lambda. Pertanto, costituiscono una base insufficiente per i linguaggi di programmazione. Inoltre, non hai ragione nel ritenere che la TM sia la base dei PL imperativi: in realtà, i linguaggi di programmazione imperativi buoni sono molto più vicini a -calculus che a quelli di Turing.λμλ

In termini di calcolabilità, le funzioni ricorsive , la macchina di Turing e il non tipizzato -sono tutti equivalenti. Tuttavia, il LC non tipizzato ha buone proprietà che nessuno degli altri due ha. È molto semplice (solo 3 forme sintattiche e 2 regole computazionali), è altamente compositivo e può esprimere relativamente facilmente costrutti di programmazione. Inoltre, dotato di un sistema di tipo semplice (ad esempio, System esteso con ), il -calculus può essere estremamente espressivo in quanto può esprimere molti costrutti di programmazione complessi in modo facile, corretto e compositivo. Puoi anche estendereλ F ω f i x λ λμλFωfixλλ-calcolo facilmente per includere costrutti che non sono lambda. Nessuno degli altri modelli computazionali menzionati sopra ti dà queste belle proprietà.

La macchina di Turing non è né compositiva né universale (è necessario disporre di una TM per ogni problema). Non ci sono concetti di "funzioni", "variabili" o "composizione". Inoltre, non è esattamente vero che le TM sono la base dei PL imperativi - FWIW, i PL imperativi sono molto, molto più vicini ai calcoli lambda con gli operatori di controllo che alle macchine di Turing. Vedi "Una corrispondenza tra ALGOL 60 e Lambda-Notation di Peter J. Landin " per una spiegazione dettagliata. Se hai programmato in Brainf ** k (che in realtà implementa una macchina Turing piuttosto semplice), saprai che le macchine Turing non sono una buona idea per la programmazione.

μ μ Nμ funzioni ricorsive sono simili alle TM in questo senso. Sono compositivi, ma non altrettanto compositivi come LC. Inoltre, non è possibile codificare utili costrutti di programmazione in funzioni -recursive. Inoltre, le funzioni ricorsive di calcolano solo su e per calcolare qualsiasi altra cosa dovresti codificare i tuoi dati in numeri naturali usando una sorta di numerazione di Gödel, il che è doloroso.μμN

Quindi, non è una coincidenza che la maggior parte dei linguaggi di programmazione siano in qualche modo basati sul -calculus! Il -calculus ha buone proprietà: espressività, composizionalità ed estensibilità, che mancano ad altri sistemi. Tuttavia, le macchine di Turing sono utili per lo studio della complessità computazionale e le funzioni ricorsive sono utili per lo studio della nozione logica di calcolabilità. Entrambi hanno proprietà eccezionali che mancano al -calculus, ma nel campo della programmazione -calculus vince chiaramente.λ μ λ λλλμλλ

In effetti, ci sono molti, molti più sistemi completi di Turing là fuori, ma mancano di qualsiasi proprietà eccezionale. Conway's Game of Life, macro LaTeX e persino (alcuni sostengono) il DNA sono tutti Turing completi, ma nessuno dei programmi (ovvero esegue una programmazione seria) con Conway o studia la complessità computazionale usando le macro LaTeX. Mancano semplicemente buone proprietà. Il turing completo di per sé è quasi insignificante quando si tratta di programmazione.

Inoltre, molti sistemi computazionali completi senza Turing sono molto utili quando si tratta di programmazione. Le espressioni regolari e lo yacc non sono completi di Turing, ma sono estremamente potenti nel risolvere una certa classe di problemi. Anche Coq non è completo di Turing, ma è incredibilmente potente (in realtà è considerato molto più espressivo del suo cugino completo di Turing, OCaml). Quando si tratta di programmazione, la completezza di Turing non è la chiave, poiché molti sistemi (quasi) inutili sono senza interesse Turing completi. Non affermerai che Brainf ** k o Whitespace sono linguaggi di programmazione più potenti di Coq, vero? Una base espressiva è la chiave per potenti linguaggi di programmazione, ed è per questo che i moderni linguaggi di programmazione sono quasi sempre basati su λ-calcolo.


7
"nessuno programma con Conway" ... alcuni costruiscono un gioco funzionante di Tetris nel gioco della vita di Conway ... inoltre è anche pratico come gli spazi bianchi :)
Alexei Levenkov

λλ

@AlexeiLevenkov È assolutamente falso. Lo spazio bianco è essenzialmente un linguaggio (semplice) imperativo, sebbene con una strana sintassi. Esso dispone di strutture per l'aritmetica, flusso di base di controllo, stack e heap manipolazione, e di I / O . Il progetto QFT, d'altra parte, ha richiesto la progettazione di un compilatore da un linguaggio molto semplice fino a un assieme RISC creato per una CPU costruita all'interno di un automa cellulare simile a Wireworld emulato utilizzando Metapixels OTCA .
Ortografia non contestuale

@AlexeiLevenkov Il compilatore Cogol → CGoL definitivo ha richiesto il lavoro di molte persone nell'arco di quattro anni, mentre esiste un progetto chiamato HaPyLi , che redige un linguaggio molto più complesso in Whitespace, che è stato scritto da una persona nel tempo libero.
Ortografia non contestuale

4

Digitare µ-recursive function programming languageGoogle mi ha portato a questo repository GitHub , quindi la risposta alla tua domanda è:

Sì, e si chiama miopia

A proposito, è scritto in Haskell.


μ

2
Ovviamente. Ho solo pensato che OP volesse trovare un linguaggio del genere per studiare la teoria o qualcosa del genere, non per conquistare effettivamente il mondo con esso ;-)
Kapol
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.