Spiegare questa definizione formale di calcolo


7

Sto provando ad attaccare ancora una volta TAOCP, data la pesantezza letterale dei volumi che ho difficoltà a impegnarmi seriamente. In TAOCP 1 Knuth scrive, pagina 8, concetti di base:

Permettere Aessere un insieme finito di lettere. Sia l'insieme di tutte le stringhe in (l'insieme di tutte le sequenze ordinate ... dove e è in per ). L'idea è di codificare gli stati del calcolo in modo che siano rappresentati da stringhe di . Ora sia un numero intero non negativo e Q (lo stato) sia l'insieme di tutti , dove è in e j è un numero intero ; lascia cheAAx1 x2xnn0xjA1jnAN(σ,j)σA0jNI(input) il sottoinsieme di Q con e lasciare (uscita) il sottoinsieme con . Se e sono stringhe in , diciamo che presenta in se ha la forma per le stringhe e . Per completare la nostra definizione, sia una funzione del seguente tipo, definita dalle stringhe , e dagli interi , perj=0Ωj=NθσAθσσαθωαωfθjϕjajbj0jN :

  • f((σ,j))=(σ,aj) se non si verifica inθjσ
  • f((σ,j))=(αψjω,bj) se è la stringa più corta possibile per la qualeασ=αθjω
  • f((σ,N))=(σ,N)

Non essendo un informatico, ho difficoltà a cogliere l'intero passaggio. Mi viene in mente l'idea che sta dietro un sistema di codici operativi, ma non ho progredito efficacemente nella comprensione. Penso che il problema principale sia che non so come leggerlo in modo efficace.

Sarebbe possibile spiegare il passaggio sopra in modo che io possa capirlo e darmi una strategia per entrare nella logica nell'interpretazione di queste affermazioni?


Quindi non dovresti includere il tuo commento nella presunta citazione, confondendo chiunque non abbia il libro a portata di mano. -.- Spero che la mia risposta aiuti ...
Raffaello

@Raphael: la citazione è testualmente tratta dal libro. Ho appena aggiunto una spiegazione tra parentesi dei simboli per I e Omega
Stefano Borini,

@SteanoBorini: Ma non è "spiegazione", è sbagliata. Vedo come puoi leggere il testo originale per giungere alla stessa conclusione che hai fatto, ma non è ancora utile. Se dici di citare qualcosa e di aggiungere un commento, per favore contrassegnalo come tale in modo che le persone possano prenderlo con un granello di sale.
Raffaello

Qui manca un contesto: quale calcolo e quali stati?
reinierpost,

Risposte:


8

Ci manca un po 'di contesto, quindi non ho idea del punto che Knuth sta cercando di chiarire, ma ecco come interpretare una macchina di Turing in questo modo. Forse ti aiuterà a capire cosa sta succedendo. In generale, un buon modo per afferrare un concetto è giocarci. Nel caso dei paradigmi di programmazione, ciò significa scrivere un programma. In questo caso, mostrerò come scrivere qualsiasi programma.

Supponiamo che il nastro della macchina di Turing abbia dei simboli {0,1,ϵ} (dove ϵ sta per "vuoto") e aggiungi un altro simbolo che rappresenta la posizione della testa H. I tuoi stati saranno coppie della forma(q,α), dove q è uno stato della macchina di Turing e α{0,,14}. Ci identifichiamo anche(F,0) con N per qualsiasi stato finale.

Ingresso (non vuoto) x, sarà il tuo punto di partenza (Hx,(s,0)), dove sè lo stato iniziale. La parte difficile è codificare gli stati. Supponiamo che allo statoq, dopo aver letto l'input x, lo sostituisci con a(q,x), muoviti in direzione D(q,x){L,R}e passa allo stato σ(q,x). Per ilθs, abbiamo

θq,0=0H0,θq,1=0H1,θq,2=0Hϵ,θq,3=1H0,θq,4=1H1,θq,5=1Hϵ,θq,6=ϵH0θq,7=ϵH1,θq,8=ϵHϵ,θq,9=H0,θq,10=H1,θq,11=Hϵ,θq,12=0H,θq,13=1H,θq,14=ϵH.
Per il as, abbiamo aq,i=(q,i+1) per i<14, e aq,14=(q,14), anche se non dovremmo mai arrivare così lontano. Per ilbs, abbiamo
bq,0=bq,3=bq,6=bq,9=(σ(q,0),0),bq,1=bq,4=bq,7=bq,10=(σ(q,1),0),bq,2=bq,5=bq,8=bq,11=bq,12=bq,13=bq,14=(σ(q,ϵ),0).
Ora resta da determinare il ψS. Permetterea0=a(q,0). SeD(q,0)=L poi
ψq,0=H0a0,ψq,3=H1a0,ψq,6=ψq,9=Hϵa0.
Se D(q,0)=R poi
ψq,0=0a0H,ψq,3=1a0H,ψq,6=ϵa0H,ψq,9=a0Hϵ.
Quindi, lascia a1=a(q,1). SeD(q,1)=L poi
ψq,1=H0a1,ψq,4=H1a1,ψq,7=ψq,10=Hϵa1.
Se D(q,1)=R poi
ψq,1=0a1H,ψq,4=1a1H,ψq,7=ϵa1H,ψq,10=a1Hϵ.
Infine, lascia aϵ=a(q,ϵ). SeD(q,ϵ)=L poi
ψq,2=H0aϵ,ψq,5=H1aϵ,ψq,8=ψq,11=Hϵaϵ,ψq,12=H0aϵ,ψq,13=H1aϵ,ψq,14=Hϵaϵ.
Se D(q,ϵ)=R poi
ψq,2=0aϵH,ψq,5=1aϵH,ψq,8=ϵaϵH,ψq,11=aϵHϵ,ψq,12=0aϵH,ψq,13=1aϵH,ψq,14=ϵaϵH.

Ora applica fripetutamente fino a quando non rimani bloccato. Se segui la costruzione, vedrai che abbiamo simulato il funzionamento della macchina di Turing.


capito: niente. Non è colpa tua. Grazie comunque :(

3
"Ci manca un po 'di contesto." È: dovremmo avere una descrizione precisa di ciò che intendiamo per "metodo di calcolo"; eccone uno dato da AA Markov; ce ne sono altri equivalenti, come le macchine di Turing.
rgrig,

6

Proviamo a scomporlo poco a poco. Prima di tutto, ricorda cosa ha scritto Knuth a pagina 7:

Definiamo formalmente un metodo computazionale come quadruplo(Q,I,Ω,f), in quale Q è un set contenente sottoinsiemi I e Ω, e f è una funzione di Qin se stesso. [...] Le quattro quantitàQ, I, Ω, f hanno lo scopo di rappresentare ripetutamente lo stato del calcolo, l'input, l'output e la regola computazionale.

Questo è il contorno. Devi leggere "rappresentare" come "contenere";Q conterrà stati (alcuni dei quali sono in I, alcuni sono dentro Ω) e fsarà una funzione di transizione tra stati; pensalo come un programma.

Permettere Aessere un insieme finito di lettere. PermettereA essere l'insieme di tutte le stringhe in A (l'insieme di tutte le sequenze ordinate x1 x2 ... xn dove n0 e xj è dentro A per 1jn).

Questa è solo una reiterazione di cosa Aè. Vedi anche qui .

L'idea è di codificare gli stati del calcolo in modo che siano rappresentati da stringhe di A.

Questa è probabilmente la frase chiave. Stiamo parlando di calcoli , ovvero sequenze di esecuzione di alcune istruzioni (linguaggio di programmazione) che manipolano alcuni stati , che possono essere considerati valori nelle celle di memoria o valutazioni di variabili. Knuth dice qui che vuole codificare questi stati in modo astratto, vale a dire come parola su un certo alfabeto.

Esempio: considera un programma che utilizza (al massimo)kvariabili, ognuna delle quali memorizza un numero intero. Cioè, uno stato è dato dalla tupla di valori(x1,,xk) dove xk è il valore (attuale) di k-th variabile. Per codificare gli stati di questo modulo in un linguaggio formale, possiamo scegliereA={0,1,#} con #un separatore. Ora modella un tale stato di#x1¯##xk¯# dove xi¯ è la codifica binaria di xi.

In particolare, (3,5,0) sarebbe #11#101#0#.

Adesso molla N essere un numero intero non negativo e Q essere l'insieme di tutti (σ,j), dove σ è dentro A e j è un numero intero 0jN; permettereI essere il sottoinsieme di Q con j=0 e lascia Ω essere il sottoinsieme con j=N.

Hai citato male (cattivo Stefano!); le parentesi non sono nel testo originale ed erano fuorvianti (vedi sopra). Knuth definisceQqui come l'insieme di tutti gli stati possibili (σA) in tutti i punti possibili nel calcolo (jpuò essere inteso come contatore di programmi). Perciò,Q contiene tutti gli stati indicizzati da istruzioni qualsiasi calcolo dell'algoritmo fornito da fposso presumere. Per definizione, iniziamo con il contatore dei programmi0 e finire in N, quindi dichiara indicizzato 0 sono stati di input e quelli indicizzati N sono stati di uscita.

Se θ e σ sono stringhe dentro A, lo diciamo θ Si verifica σ Se σ ha la forma αθω per archi α e ω.

Spero che questo sia chiaro; è solo una (ri) definizione di sottostringhe.

Per completare la nostra definizione, lascia f essere una funzione del seguente tipo, definita dalle stringhe θj, ϕj e gli interi aj, bj per 0jN:

  • f((σ,j))=(σ,aj) Se θj non si verifica in σ
  • f((σ,j))=(αψjω,bj) Se α è la stringa più corta possibile per la quale σ=αθjω
  • f((σ,N))=(σ,N)

Questo è un piccolo linguaggio di programmazione; se aggiustiθj,ψj,aj,bj, hai un programma. Sul contatore programmij, f sostituisce l'occorrenza più a sinistra θj nello stato con ψj e va alla dichiarazione bj. Se non c'èθj nello stato attuale, va a dichiarazione aj. Il programma esegue un'istruzione ifN viene raggiunto, terminando la modellazione.

Nella metà superiore della pagina 8, c'è un esempio più concreto di un "programma" f. Tieni presente che Knuth utilizzerà il linguaggio assembly in seguito; questo informa come guarda i programmi (dichiarazioni atomiche collegate da salti).


1
Ora ho capito meglio cosa sta succedendo. Tuttavia, due cose non sono ancora chiare e apprezzerei molto se tu potessi espandere la tua risposta. Innanzitutto, θj, ψj, aj, bj - quali sono queste stringhe e numeri? Cosa rappresentano? Se ho capito bene, aj e bj rappresentano il numero del passo o il contatore dei comandi per lo stato j + 1. Ma non sono sicuro di cosa significhino le stringhe θj, ψj. Puoi spiegarci cosa intendi con "se aggiusti θj, ψj, aj, bj, hai un programma"? O meglio, come lo riparerei per qualche esempio?
Georgy Bolyuba,

@GeorgyBolyuba: hai ragione aj e bj. Lo stato del programma è una stringaσ e un "contatore di programmi" j. θj e ψj sono usati per modificare quello stato (vedi secondo caso di f). Possono avere tutti i tipi di forme; dipende davvero da come si codifica lo stato come stringa. Vedi il libro per un esempio.
Raffaello

5

Quel testo descrive il seguente pseudocodice (Python):

subs = a list of string pairs  
As = a list of integers  
Bs = a list of integers

def f(state, pc):  
  if pc == N: return (state, pc)  
  if state.find(subs[pc][0]) != -1:  
    return (state.replace(subs[pc][0],subs[pc][1],1), Bs[pc])  
  else:  
    return (state,As[pc])  

Presumibilmente la funzione f verrà applicata ripetutamente.

Gli ultimi tre punti elenco sono tutto ciò di cui hai veramente bisogno una volta comprese le notazioni. Tutto ciò che viene prima è un po 'analogo a spiegare come funziona Python prima di dare il codice Python.


Ah ok, è una macchina di Turing.
Stefano Borini,

1
Piuttosto, è un diverso modello di calcolo con la stessa potenza di una macchina di Turing.
Yuval Filmus,

Bene, tre righe sotto la tua citazione Knuth afferma che questo equivale alle macchine di Turing, quindi presumibilmente lo sapevi già quando le hai chiesto. Pensavo che avessi chiesto aiuto con la notazione. Ora non ho idea di cosa volessi chiedere.
rgrig,
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.