L'essenza di questa risposta è che le macchine di Turing possono imitare tutto ciò che possiamo programmare, e programmiamo calcoli su, con e di oggetti infiniti.
Questa è una seconda risposta che si concentra più sulla domanda specifica che sul quadro teorico generale che giustifica la risposta e sarebbe definitivamente necessario per rispondere al titolo più generale della domanda. È pienamente compatibile con le mie precedenti risposte alle domande del PO, sia Cos'è esattamente un algoritmo? e le macchine turing assumono qualcosa di infinito ad un certo punto? , risposte in cui ho sviluppato maggiormente il contesto teorico. Questo può essere visto come rispondere a entrambe le domande.
Le macchine di Turing hanno la capacità di gestire l'infinito , così come tutti i Turing possono completare modelli computazionali, sebbene solo con infinito infinito. Il nostro problema è che possiamo osservare solo una parte di questo infinito, ma dobbiamo considerare il tutto poiché la parte che possiamo osservare è illimitata.
L'altro problema è che possiamo occuparci solo di entità finemente specificate. In realtà, l'intera struttura della scienza così come la conosciamo cade se consideriamo entità che non sono specificate in modo finito, poiché diventa impossibile controllare la coerenza delle definizioni, persino sapere quali sono le definizioni, poiché possiamo accedervi solo in parte in un tempo finito.
C'è forse un'altra questione fondamentale che è in qualche modo simile al fatto che la chiusura sotto l'unione infinita definisce qualsiasi insieme desiderato, a meno che tu non possa limitare in modo appropriato ciò che è permesso in tale unione. Ma non sono sicuro di aver compreso appieno questo problema.
Come ho detto, le macchine di Turing hanno la capacità di gestire l'infinito . Sto contraddicendo altre risposte ben votate di alcuni utenti di alto livello, che dovrebbero sapere di cosa parlano su un argomento così elementare.
Il problema è che Turing ha scelto un modello di calcolo molto elementare per raggiungere il suo scopo teorico. Più semplice, meglio è. Si tratta di modelli di calcolo più avanzati / sofisticati praticamente di ciò che il linguaggio macchina è per la programmazione: qualcosa di molto oscuro in cui non è possibile riconoscere nessuno dei concetti che hanno senso nella programmazione di alto livello. Il fatto è che, come il linguaggio macchina, la TM può imitare molto più di quanto possa esprimere direttamente.
Inoltre, nessuno crede davvero a questi limiti della Turing Machine e sono state ideate molte varietà di TM, con caratteristiche più o meno esotiche. Se alcuni insiemi infiniti sono chiamati enumerabili in modo ricorsivo , è perché TM può effettivamente enumerare (rappresentazioni di) i loro membri, il che richiede un calcolo infinito (vedere Turing Machines come enumeratori in Hopcroft-Ullman 1979, pagina 167 ). Naturalmente, possiamo sempre codificarlo come calcoli finiti che risponderebbero a domande come: qual è il23 r d
membro del set secondo la tua enumerazione di loro? Ma sarebbe comunque spesso implementato come un calcolo infinito che viene artificialmente fermato quando viene raggiunta la risposta giusta.
In realtà, tutti gli utenti che affermano che tutto è finito ma non limitato in una TM sono abbastanza attenti da aggiungere che considerano Turing Machines nella loro definizione standard . Il problema è che la definizione standard è solo un dispositivo per semplificare la teoria, ma è praticamente irrilevante quando si cerca di comprendere le strutture computazionali.
In realtà, l'unica cosa che conta nel calcolo è che ogni cosa deve essere specificata in modo definitivo in modo calcolabile, non che sia finita .
Partiamo dal presupposto che una macchina turing deve essere un oggetto finito. Ma non è vero. È possibile definire un modello di macchina di Turing utilizzando un secondo nastro di sola lettura e contenente una funzione tabulata per tutti i valori interi, senza alcun limite. Questo è infinito. Ma non ti offre alcuna potenza di calcolo aggiuntiva fintanto che il contenuto di quel nastro è specificato in modo computazionale (la calcolabilità implica che è specificato in modo definitivo). Il nastro aggiuntivo potrebbe essere sostituito da una macchina TM incorporata nell'altro e fornirebbe le risposte, invece di cercarle sul nastro aggiuntivo. Da un livello superiore, la differenza non è visibile.
Da un punto di vista della realizzazione pratica, potremmo avere una fact
macchina di turing che calcola i fattoriali e li tabula sul nastro aggiuntivo, mentre un'altra TM userebbe il fattoriale tabulato dal nastro extra, aspettando la prima TM ogni volta che la tabulazione manca ancora iscrizione. Ma la seconda macchina presuppone che il contenuto del nastro sia in definitiva infinito. La tabulazione non deve nemmeno funzionare tutto il tempo, ma deve riprendere il calcolo ogni volta che i dati vengono richiesti dalla tabella e non vengono trovati lì.
Tornando alla domanda, la differenza principale tra numeri interi senza limiti e la tabella infinita è solo che i numeri interi sono finiti, senza limiti ma completamente calcolati in tempo finito. Il tavolo infinito è calcolato indefinitamente, finito ma continua a crescere all'infinito. Questo non è un problema, ma è una differenza. Gli oggetti infiniti sono accessibili solo attraverso approssimazioni finite, ... ma sono infiniti. I numeri irrazionali calcolabili sono, in questo senso, oggetti infiniti, almeno per la loro rappresentazione come numeri binari.
Tutti gli algoritmi sono definiti nel contesto di una teoria matematica. E una tabella di ricerca insieme a una tabella infinita è un algoritmo. Ma è un algoritmo in una teoria matematica che ha un insieme infinito di assiomi finemente definito che specifica ampiamente (piuttosto che intensamente) i valori di una funzione che assioma per ogni argomento intero. (vedi la mia risposta alla tua domanda precedente ). Quindi è sempre legittimo farlo, in quanto è sempre possibile aggiungere affermazioni realmente vere agli assiomi di una teoria.
Le dichiarazioni Usul, come riprodotte nella tua domanda attuale, sono a mio avviso errate (anche se tutto è anche una questione di definizione). La sua conclusione nella sua risposta , che non hai riprodotto, è che l'uso di una tabella infinita non può essere considerato un algoritmo perché può essere implementato solo da un modello di calcolo non uniforme, da una raccolta di macchine diverse, e quindi tale usa " non hanno una descrizione limitata che può essere implementata per risolvere il problema" intero "per qualsiasi dimensione di input". Questo è sbagliato. Il suo partizionamento in macchine disgiunte che hanno domini di definizione separati è solo un modo sbagliato di fare le cose. Il modo giusto è avere una sequenza infinita di macchine coerenti con domini di definizione sempre più grandi, che possono convergere in modo appropriato alla macchina infinita che risponde alla domanda. Questo è uno scopo essenziale della teoria matematica della semantica del calcolo definita da Dana Scott. Con un adeguato apparato matematico, definisce precisamente macchine infinite, valori con rappresentazioni infinite (come e oπ) o infinite strutture di dati, tutte calcolabili. (vedi la mia prima risposta a questa domanda).
Il modo in cui tali entità infinite vengono calcolate nella pratica è mediante una valutazione pigra , calcolando qualsiasi parte sia necessaria in qualsiasi momento e riprendendo il calcolo per alcune delle altre parti ogni volta che ne diventa più necessario. Questo è esattamente ciò che viene proposto sopra con la
fact
macchina che calcola pigramente il fattoriale da archiviare in una tabella, ogni volta che sono necessari più dati dalla tabella.
In un certo senso, ciò sembra giustificare l'affermazione (nella risposta di Daniel V ) secondo cui lo spazio dei codici deve essere finito, poiché la valutazione pigra si baserà effettivamente su un codice finito. Ma la calcolabilità è un gioco pervasivo di codifica, in modo che, tra le altre cose, distinguere il codice dai dati sia sempre praticamente agli occhi di chi guarda. In effetti, molti linguaggi di programmazione moderni non fanno molta differenza tra la specificazione di valori intenzionale
ed estensiva e la semantica denotazionale non distingue realmente "2 + 2" da "4". La semantica è davvero ciò di cui stiamo parlando quando facciamo una domanda come " Cos'è X ? ".
Questa visione della finezza del codice, anche vista come statica, è un altro motivo per cui una tabella infinita (considerata come parte del codice) non è vista su un piano di parità con numeri interi senza limiti usati come dati. Ma questa è un'altra illusione che non sopravvive alla pratica di programmazione nota nella metaprogrammazione , nei linguaggi riflessivi e nell'uso della eval
funzione. In queste lingue, il codice può essere esteso senza limiti dal programma in esecuzione stesso, purché il computer sia in esecuzione. In effetti si potrebbero considerare le macchine di Turing che modificano le proprie regole di transizione, aumentando il loro numero senza limiti. Questo è abbastanza vicino al modo in cui funzionano le macchine Universal Turing.
Quando si progettano quadri teorici, c'è sempre una tensione tra semplicità e perspicuità o espressività. La semplicità rende spesso più semplice l'analisi del framework, specialmente quando si tratta di dimostrare proprietà specifiche o ridurlo ad altri framework. Ma è spesso scomodo per esprimere concetti di alto livello che devono quindi essere codificati. Non programmiamo con Turing Machines, ma con linguaggi di alto livello che sono molto più espressivi e chiari, e allo stesso tempo possono cancellare alcune barriere come la distinzione tra codice e dati, sulla base dell'equivalenza semantica. Le macchine di Turing sembrano semplici, ma possono andare ben oltre la loro definizione elementare.