Esiste una chiara definizione di "calcolabile" per i modelli di calcolo che non sono completi?


9

Questo è il seguito di un'altra domanda qui , e spero che non sia troppo filosofico. Come ha sottolineato Raphael in un commento sulla mia domanda precedente, non capisco davvero la definizione di "calcolabile", ma secondo alcuni articoli che leggo, la definizione non è anche molto chiara quando si tratta di modelli di calcolo più deboli di turing macchine a causa della codifica di input e output.

La definizione tipica di turing calcolabile è la seguente:

Definizione 1: Una funzione è chiamata turing calcolabile se esiste una turing machine che calcola usando una codifica adeguata dei numeri naturali come stringhe.f:NKNMf

Le definizioni differiscono in ciò che è esattamente una codifica adatta , ma la maggior parte si riferisce alla codifica binaria , codifica unaria o codifica decimale come quella codifica fissa e adatta. È anche possibile dimostrare che è necessario correggere una codifica per la definizione della calcolabilità del turing. Ma cosa rende speciale, per esempio, la codifica binaria dei numeri naturali in modo che possiamo assiomatizzarla come l'unica codifica adatta? Probabilmente perché si adatta alla nozione intuitiva di cosa significhi coincidenza la calcolabilità .

E se osservassimo i modelli di calcolo più deboli delle macchine di turing? Ad esempio, consideriamo l'insieme delle macchine da "paralizzate" con l'alfabeto che può spostarsi solo a destra, e una definizione di macchina da paralizzare calcolabile che è coerente con quella della calcolatrice da banco: { 0 , 1 }Mc{0,1}

Definizione 2: Una funzione è chiamata turing paralizzato calcolabile o calcolabile in se esiste una turing paralizzata che calcola usando una codifica adeguata dei numeri naturali come una stringa.M c M ff:NKNMcMf

Se definiamo "codifica adatta" come "codifica binaria", la funzione non è calcolabile in . Se assiomatizziamo la "codifica adatta" come "codifica unaria", allora è calcolabile in . Questo sembra imbarazzante dato il fatto che tutti possono correggere una delle infinite e intuitive codifiche a volontà. Dovrebbe essere chiaro se un modello di calcolo può calcolare o meno senza fare riferimento a una codifica specifica - almeno non ho mai visto nessuno menzionare quale codifica viene utilizzata quando si afferma "i programmi di loop sono più deboli delle macchine di turing".M c f M c ff:NN,nn+1Mcf Mcf


Dopo questa introduzione posso finalmente formulare la mia domanda: come definirebbe "codifiche adatte" e "calcolabilità" per modelli arbitrari di calcolo che non coincidono con la nozione intuitiva di calcolabilità? Questo è possibile nell'ambito della computabilità del turing?

Modifica: ho abbreviato l'introduzione, non ha aggiunto alla domanda.

Risposte:


6

Un dato di base che ti manca qui è che tutte le codifiche che menzioni sono equivalenti dal punto di vista della computabilità: esiste una funzione calcolabile che mappa la codifica binaria di un numero alla sua codifica unaria o viceversa. Pertanto, ai fini della definizione della calcolabilità, non importa quale di queste codifiche si scelga per i numeri. Basta correggere la tua codifica preferita.

La calcolabilità è al centro una proprietà delle funzioni stringa . Quando si definisce la calcolabilità in qualsiasi altro dominio, è necessario correggere una codifica. In pratica, tutte le codifiche "ragionevoli" sono equivalenti ai sensi del paragrafo precedente, quindi la codifica esatta non ha importanza.f:ΣΣ

La codifica, tuttavia, è importante nei modelli di calcolo ristretti. Per fare un esempio estremo, supponiamo che tu consideri le macchine di Turing a tempo limitato: supponi di voler terminare la tua macchina nel tempo per qualche c , dove n è la lunghezza dell'input (come una stringa). Non possiamo più passare dalla codifica binaria alla codifica unaria, poiché la codifica binaria è molto più compatta. Quando parliamo di una funzione calcolabile nel tempo polinomiale di numeri interi , specifichiamo che i numeri interi sono codificati in binario. Anche questa è una scelta un po 'arbitraria, poiché la codifica decimale porterebbe alla stessa nozione di calcolabilità temporale polinomiale.O(nc)cn

Quindi, per rispondere alla tua domanda, la codifica viene specificata come parte della definizione del modello limitato.


"Un fatto di base che ti manca qui è che tutte le codifiche che menzioni sono equivalenti dal punto di vista della calcolabilità: esiste una funzione calcolabile che mappa la codifica binaria di un numero alla sua codifica unaria o viceversa" - sì, io nella versione originale della mia domanda, ma non riesco a vedere come sia rilevante per la domanda sui modelli più deboli. È anche chiaro che la codifica deve essere specificata come parte della definizione del modello, ma la domanda è come si può arrivare a una definizione così ragionevole.
Stefan Lutz,

1
Si estrae questa definizione dal cappello. Poiché diverse definizioni tendono ad essere equivalenti, la definizione esatta non ha importanza. Quando lo fa, ci saranno diverse nozioni di complessità. Ad esempio, per alcuni algoritmi grafici fa la differenza se ti viene data una matrice di adiacenza o un elenco di spigoli.
Yuval Filmus

Quindi per riassumere: a) La definizione di ogni singolo modello di calcolo deve includere la sua sintassi, semantica E una codifica adatta. b) La definizione di "codifica adatta" è completamente indipendente dalla sintassi e dalla semantica del modello. c) Non è possibile fornire una definizione di "codifica adeguata" valida per tutti i modelli di calcolo. È corretto?
Stefan Lutz,

Concordo con a) eb), ma con c) solo parzialmente. È possibile definire una codifica adatta che funge da "codifica standard", utilizzata a meno che non venga fatta una menzione esplicita del fatto. Nel caso dei numeri, esiste una tale codifica standard: codifica binaria.
Yuval Filmus

M

4

Prima di tutto, non è possibile correggere la "codifica adatta" come stringhe binarie o qualsiasi altra codifica. Questo perché perderai troppi modelli di calcolo, perché diversi modelli di calcolo potrebbero avere modelli di input e output molto diversi. In altre parole, potrebbero non "parlare" stringhe.

Ad esempio, i termini del calcolo lambda non tipizzato sono variabili o l'applicazione di un termine a un altro o un'astrazione di un termine lambda. Input e output sono termini, stringhe arbitrarie. Tuttavia, il calcolo lambda non tipizzato è completo di Turing perché esiste una "codifica adatta" che codifica i numeri naturali come termini lambda di una determinata forma, e sotto questa codifica per ciascuna funzione calcolabile esiste un termine lambda che lo calcola.

Puoi formalizzare la "codifica adatta" se fissi le macchine di Turing come modello di calcolo di riferimento e quindi richiedi che la codifica e la decodifica da e verso le stringhe binarie debbano essere eseguite da una macchina di Turing che si ferma sempre. Ad esempio, una macchina di Turing sarebbe in grado di tradurre un numero naturale come stringa binaria in un termine Lambda che esprime questo numero, simulare la riduzione nel calcolo lambda e tradurre il risultato in una stringa binaria.

Per i modelli di calcolo più semplici mi aspetterei lo stesso approccio: prendere un modello di riferimento di calcolo e fissare una codifica dei numeri naturali, quindi assicurarsi che la codifica e la decodifica siano eseguite da istanze di quel modello semplice. Come hai notato, per le macchine di Turing paralizzate, l'uso di numeri codificati unari e binari non produrrebbe un modello equivalente di calcolo.


È possibile che le cose siano state capovolte nell'ultimo paragrafo? Scrivi che la codifica viene eseguita dal modello semplice, non dal modello di riferimento: nel paragrafo precedente si desidera che la codifica venga eseguita dal modello di riferimento, non dall'altro modello (calcolo lambda).
Stefan Lutz,

Se stai studiando modelli di calcolo più deboli, non vuoi usare le macchine di Turing da nessuna parte, nemmeno nella fase di codifica / decodifica. Quindi potresti semplicemente eseguire tutti i calcoli nella fase di codifica e su qualsiasi modello di calcolo sarebbe Turing completo. Quindi è necessario utilizzare il modello di riferimento più semplice per la codifica / decodifica.
Hoopje,

1
Quindi non vedo come possiamo dimostrare la completezza turing del calcolo lambda con i numeri di chiesa se ripariamo le macchine turing. Dobbiamo presumere che LC sia più debole di TM, quindi ad alcune istanze del modello "più debole" lambda calc viene assegnato un numero usando la sua codifica c h u r c h : Nl a r y : l a m b d a t e r m l anNchurch:Nlun'mBdun'termchurch(n)toBionun'ry:lun'mBdun'termlun'mBdun'termwΣ*
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.