Perché possiamo supporre che un algoritmo possa essere rappresentato come una stringa di bit?


17

Sto iniziando a leggere un libro sulla complessità computazionale e le macchine di Turing. Ecco la citazione:

Un algoritmo (cioè una macchina) può essere rappresentato come una stringa di bit una volta che decidiamo su una codifica canonica.

Questa affermazione è fornita come un semplice fatto, ma non riesco a capirlo.

Ad esempio, se ho un algoritmo che accetta come input e calcola oppure:( x + 1 ) 2x(x+1)2

int function (int x){
   x = x + 1; 
   return x**2; 
}

Come può essere rappresentato come stringa usando l'alfabeto ?{0,1}*


38
Non conosci le conoscenze minime richieste per capire come viene codificato il testo. Oggi è un grande giorno per imparare! joelonsoftware.com/2003/10/08/…
Eric Lippert

1
Penso che OP potrebbe arrivare da questo punto di vista in base a un'ambiguità nel testo citato. Immagino che OP significhi "come si può costruire l'intera macchina e l'algoritmo come una stringa di bit", non l'input alla stessa macchina di Turing. Il testo citato implica che l'intero algoritmo può essere auto-eseguito, ma un bit codificato in utf del linguaggio c non dice nulla su come una macchina potrebbe effettivamente agire su quella stringa.
Sentinella

3
... Penso che tutti qui stiano fraintendendo la fonte e spingendo troppo la barzelletta, a spese dell'inesperienza della Roma. La maggior parte di questi commenti e risposte parla della codifica del testo per la trasmissione arbitraria, mentre la citazione parla della codifica dell'algoritmo per il consumo da parte di una macchina di turing. La risposta (attualmente) accettata la tocca almeno nella seconda frase.
Izkata,

2
@Izkata Non sono sicuro che tu sia consapevole che, a causa dell'universalità, queste due affermazioni sono equivalenti.
Konrad Rudolph,

15
La cosa divertente è che per poter leggere il tuo algoritmo codificato, è stato necessario trasformarlo in una sequenza di bit non appena lo hai digitato. Non è mai stato rappresentato in modo diverso, dalla tastiera al monitor. Aveva una rappresentazione non binaria solo nelle nostre menti; e a livello fisiologico, quando si guardano le sinapsi, anche quello è discutibile.
Peter - Ripristina Monica il

Risposte:


45

La risposta più ingenua e semplice alla tua domanda è che il codice fornito (e il codice macchina compilato) sono in realtà rappresentati come stringhe sintattiche di {0,1} *. Inoltre, poiché stai parlando di macchine turing, i programmi che eseguono sono un elenco lineare di operazioni / istruzioni, non vi è alcun motivo per cui questi non possano essere rappresentati come bit / byte.


Come rappresenti esattamente la macchina di Turing come un elenco di istruzioni? La solita definizione è qualcosa del genere .
svick

@svick Come menzionato nella mia risposta di seguito, usi una TM universale, che accetta la descrizione di una TM come input (codificata in modo adeguato)
dseuss

@svick Un linguaggio di programmazione con semplici istruzioni per spostare un puntatore su un nastro? Credo che un esempio di questo potrebbe essere il linguaggio di programmazione esoterico Brainfuck . Codice di esempio
LukStorms

@LukStorms Non penso che tu possa più chiamarla "macchina di Turing".
svick

52

Hai già una rappresentazione di quella funzione come testo. Converti ogni carattere in un valore a un byte usando la codifica ASCII. Quindi il risultato è una sequenza di byte, cioè una sequenza di bit, ovvero una stringa sopra l'alfabeto . Questo è un esempio di codifica.{0,1}*


Esattamente. E come ho detto sopra, è successo mentre la Roma lo scriveva. Anche i glifi che vedo sul mio monitor sono pixel in bianco e nero, ovvero informazioni binarie, inviati su una connessione dati binaria da una memoria binaria collegata a una rete binaria tramite controller binari. È possibile rappresentare ogni algoritmo come una stringa di bit? Più di questo: è inevitabile a meno che non ti limiti ai media analogici e alla comunicazione faccia a faccia.
Peter - Ripristina Monica il

@ PeterA.Schneider L'uso di supporti analogici o faccia a faccia non implica necessariamente che non vi sia alcuna codifica discreta incorporata. L'uso di un linguaggio naturale non è lontano dall'uso di una codifica discreta, non è vero?
Jean-Baptiste Yunès

32

Non posso resistere ...

⡂⡀⣀⢀⣄⡀⣰⡉⡀⠀⡀⡀⣀⠀⢀⣀⢀⣄⡀⡂⢀⣀⡀⢀⢀⡀⠀⡰⣀⠀⣀⠀⡂⡀⣀⢀⣄⡰⡀⢠⠂
⡇⡏⠀⡇⡇⠀⢸⠀⡇⢀⡇⡏⠀⡇⣏⠀⠀⡇⠀⡇⣏⠀⣹⢸⠁⢸⠀⡇⢈⠷⡁⠀⡇⡏⠀⡇⡇⠀⡇⢼⠀
⠁⠁⠀⠁⠈⠁⠈⠀⠈⠁⠁⠁⠀⠁⠈⠉⠀⠈⠁⠁⠈⠉⠁⠈⠀⠈⠀⠱⠉⠀⠉⠀⠁⠁⠀⠁⠈⠱⠁⠘⠄
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⢤⡀⡤⠀⣀⣀⣀⠀⢤⡀⡤⠀⠀⢰⠀⠀⢹⠠⠀
⠀⠀⠀⣠⠛⣄⠀⠒⠒⠒⠀⣠⠛⣄⠀⠉⢹⠉⠁⢸⢀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠀
⠀⠀⠀⣄⢄⠤⢄⢴⠤⢠⠀⢠⢠⡠⢠⡠⢄⠀⢤⡀⡤⢺⡖⠐⣷⠂⠊⢉⡆
⠀⠀⠀⡇⠸⣍⣉⠸⣀⠸⣀⢼⢸⠀⢸⠀⢸⠀⣠⠛⣄⠀⠀⠀⠀⠀⣴⣋⡀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

⢱⠀
⢸⠁
⠊

(I punti sopra rappresentano quelli, gli zero degli spazi).


5
Divertente (+1) ma serve a sottolineare la natura essenzialmente arbitraria della codifica.
John Coleman,

4
Divertiti a scrivere il compilatore per questo :)
Barmar


1
@Barmar Sembra una sfida per codegolf.stackexchange.com
IMSoP

1
@RomaKarageorgievich ecco la funzione che esegue il rendering dei personaggi Braille. Ecco un semplice wrapper che consente di chiamarlo dalla riga di comando.
lasciato circa il

13

Il tuo computer memorizza tutto come sequenze di 0e 1, inclusa la domanda che hai digitato per chiederti come lo fa. Ad esempio, ogni lettera e simbolo è rappresentato da 8 bit (sto parlando di come erano le cose, oggi è a 16 bit e più complicato). Puoi vederli qui . Bene, non stanno mostrando i bit, ma piuttosto i codici esadecimali e ottali. Sai come convertire un numero nella sua rappresentazione digitale?


6
Sono 16 byte solo su Windows e in alcune librerie come Qt o ICU, che usano UTF-16. E nemmeno tutte le lettere prendono una singola unità di codice in generale, anche in UTF-32, quindi potrebbero essere più lunghe. Quindi penso che sia meglio attenersi all'ASCII in questa discussione, portare Unicode qui porterà a una vera complicazione.
Ruslan,

8

L'ipotesi fondamentale alla base di questo concetto è la tesi di Church-Turing . Può essere difficile vedere che qualsiasi algoritmo può essere rappresentato come una stringa di bit, perché il termine "algoritmo" può essere pensato in termini molto informali. Nella tesi di Church-Turing, usano un concetto molto rigorosamente definito di cosa sia un algoritmo (e anche allora ci sono state alcune domande sulle parole). Tuttavia, la loro terminologia ha ottenuto così tanto influenza che a volte si sostiene che queste definizioni per parole come "algoritmo" sono così efficaci che abbiamo semplicemente li accettiamo come la definizione.

Church-Turing afferma che ogni algoritmo può essere implementato come un calcolo su una macchina di Turing. Dato che la descrizione di una macchina di Turing è un insieme finito di valori, è banale vedere come mappare questa descrizione in una sequenza di numeri e quindi in una sequenza di 0 e 1.

Come hanno già detto le altre risposte, è banale rappresentare l'algoritmo di esempio usando la codifica ASCII o altre codifiche.

Penso che il motivo per cui il tuo libro fornisca questa affermazione come un fatto derivi dal fatto che molti usano semplicemente la tesi di Church-Turing come base per la loro definizione di un algoritmo. Se usi una definizione del genere, è ovvio un fatto come "5 è un numero" perché l'hai definita sostanzialmente come tale.


9
La tesi di Church-Turing non è un teorema e non comporta alcuna definizione per il concetto di algoritmo, che è informale. Non vedo nemmeno la necessità di invocare la tesi di Church-Turing per questo. Il motivo "profondo" per cui alcuni oggetti possono essere rappresentati come stringhe finite e altri no è che alcuni insiemi sono numerabili e altri no.
quicksort

Sto vedendo "un algoritmo può essere codificato come una stringa se specifichiamo un'iniezione tra i componenti delle specifiche della macchina e l'insieme di stringhe in una lingua". OP fa questo nel suo esempio, prendendo la macchina rappresentata da " $ (x + 1) ^ 2 $ " e rappresentandola nuovamente come una stringa nel linguaggio delle funzioni C (o BCPL, C ++, et al.) Ben formate .
Eric Towers,

1
@EricTowers Che richiede la tesi di Church-Turing. Altrimenti non si può essere certi che esiste una specifica macchina di un algoritmo per tutti gli algoritmi.
Cort Ammon - Ripristina Monica il

1
Affermo che un "algoritmo [che] richiede un numero infinito infinito di simboli per esprimere" non può essere espresso. Una tale espressione deve usare innumerevoli simboli, altrimenti può essere espressa in una sublingua più piccola. Inoltre, qualsiasi espressione (non sciocca) sopra un alfabeto infinito ha una quantità infinita di entropia in quasi tutti i suoi simboli, quindi sfida l'espressione (cioè, non può effettivamente comunicare con un destinatario). Tutte le logiche finitarie si rifiutano di operare su stringhe così infinite e non sono a conoscenza di una logica infinita che permetterà di lavorare su stringhe non numerabili.
Eric Towers,

1
I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
DW

4

Questa affermazione si basa sull'esistenza di TM universali . Si tratta fondamentalmente di TM programmabili che possono simulare qualsiasi altra TM con un massimo di overhead poli. Pertanto, il programma fa semplicemente parte dell'input codificato come zero e uno.


1
@Discretelizard, non ti seguo. Qualsiasi algoritmo è espressibile come input per una TM universale. Le lingue possono essere calcolabili o non calcolabili; Non ho familiarità con nessuna nozione standard di calcolabilità per algoritmi, quindi non sono sicuro di cosa stai arrivando. Cosa significherebbe avere un algoritmo incontestabile? Forse stai pensando ad algoritmi che non terminano necessariamente? Ma una TM universale può ancora eseguire tali algoritmi.
DW

@Discretelizard Neanche io ti seguo. Essere eseguibili su una macchina di Turing è essenzialmente la definizione di un algoritmo. Suppongo che potresti parlare di un "algoritmo" per, per esempio, una macchina di Turing con un oracolo per il problema di arresto ma, normalmente, "algoritmo" significa "cosa che puoi fare su una macchina di Turing".
David Richerby,

@DavidRicherby Vero, suppongo che l'attuale definizione di algoritmo sia più rigorosa. Ma questa domanda riguarda il motivo per cui imponiamo una restrizione molto più indulgente e dire che esiste una restrizione ancora più forte non è molto istruttivo, secondo me.
Lucertola discreta

4

Bene, parliamo di algoritmi che non possono essere rappresentati come una stringa di bit finita per qualsiasi tipo di codifica.

Lascia che ti scriva un simile algoritmo per te ... Ah, ma se lo faccio, posso rappresentare quell'algoritmo con la codifica del mio testo digitato.

Che ne dici di rappresentare il mio algoritmo usando alcuni "mezzi analogici", diciamo con la posizione di alcune monete sulla mia scrivania. Sebbene la posizione di quelle monete possa essere modellata da alcuni numeri reali (che in alcune codifiche potrebbero essere impossibili da rappresentare in modo definitivo), l'intera descrizione può essere nuovamente considerata una rappresentazione del mio algoritmo e può essere nuovamente codificata in una stringa di bit!

Spero che questi esempi chiariscano che se un algoritmo non può essere rappresentato da una stringa di bit finita non abbiamo alcun modo di descriverlo affatto!

Quindi, perché dovremmo considerare l'esistenza di qualcosa di cui non possiamo parlare? Forse interessante per la filosofia, ma non per la scienza. Quindi, definiamo la nozione di algoritmo in modo tale che possa essere rappresentata da una stringa di bit, in quanto almeno sappiamo che siamo in grado di parlare di tutti gli algoritmi.


Sebbene la risposta sopra alla domanda posta, penso che la confusione sull'esempio dato sia dovuta principalmente al fatto che una rappresentazione deve solo rappresentare in modo univoco un algoritmo. Il modo di rappresentazione non deve necessariamente implicare i calcoli effettivi invocati dall'algoritmo! Questo è molto utile, in quanto significa che possiamo anche rappresentare algoritmi incontestabili !


rUNr

1
ArR


r

@Raphael Sì, e? Non dovrebbe sorprendere che non sia possibile scrivere un numero infinito di algoritmi. E ancora, affermi di "esprimere" alcuni algoritmi che non possono essere scritti. Non capisco cosa intendi con "espresso", ma sembra implicare almeno una rappresentazione. Poiché la mia affermazione inizia con l'assunto che un algoritmo non viene rappresentato, non riesco a vedere come ciò contraddica la mia affermazione.
Lucertola discreta

2

Un altro modo di vedere questo è attraverso la teoria dell'informazione. Tutte le codifiche di informazioni / domande significative / utili possono essere trasformate in "sequenze" binarie.

Gran parte del campo va alla domanda "qual è il modo di porre il minor numero medio di domande per comunicare un'informazione significativa?" In pratica, questo equivale a "qual è l'approccio ottimale per porre il minor numero di domande sì / no per capire cosa è stato comunicato o detto?"

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.