Estou tentando atacar o TAOCP mais uma vez, dado o peso literal dos volumes que tenho problemas em comprometer seriamente. No TAOCP 1, Knuth escreve, página 8, conceitos básicos:
Seja um conjunto finito de letras. Seja o conjunto de todas as seqüências de caracteres em (o conjunto de todas as seqüências ordenadas ... que e estão em para ). A idéia é codificar os estados da computação para que eles sejam representados por seqüências de caracteres . Agora seja um número inteiro não negativo e Q (o estado) seja o conjunto de todos , onde está em e j é um número inteiro ; deixe (entrada) ser o subconjunto de Q com e deixar (a saída) ser o subconjunto com . Se e são cadeias de caracteres em , dizemos que ocorre em se tiver a forma para cadeias e . Para concluir nossa definição, seja uma função do seguinte tipo, definido pelas cadeias , e os números inteiros , para :
- se não ocorrer em
- se for a string mais curta possível para a qual
Não sendo um cientista da computação, tenho problemas para entender toda a passagem. Eu meio que entendo a ideia que está por trás de um sistema de códigos de operação, mas não progredi efetivamente no entendimento. Penso que o principal problema é que não sei como lê-lo de forma eficaz.
Seria possível explicar a passagem acima para que eu possa entendê-la e me dar uma estratégia para entrar na lógica na interpretação dessas afirmações?
fonte
Respostas:
Estamos perdendo algum contexto, então não tenho idéia do ponto que Knuth está tentando fazer, mas aqui está como interpretar uma máquina de Turing dessa maneira. Talvez isso ajude você a entender o que está acontecendo. Em geral, uma boa maneira de entender um conceito é brincar com ele. No caso de paradigmas de programação, isso significa escrever um programa. Neste caso, mostrarei como escrever qualquer programa.
Suponha que a fita da máquina de Turing tenha símbolos{0,1,ϵ} (Onde ϵ significa "vazio") e adicione mais um símbolo que representa a localização da cabeça H . Seus estados serão pares da forma(q,α) , Onde q é um estado da máquina de Turing e α∈{0,…,14} . Também identificamos(F,0) com N para qualquer estado final.
Entrada (não vazia)x , seu ponto de partida será (Hx,(s,0)) , Onde s is the starting state. The difficult part is to encode states. Suppose that at state q , upon reading input x , you replace it with a(q,x) , move in direction D(q,x)∈{L,R} , and switch to state σ(q,x) . For the θ s, we have
Now applyf repeatedly until you get stuck. If you follow the construction, you will see that we have simulated the running of the Turing machine.
fonte
Let us break it down bit by bit. First of all, remember what Knuth wrote on page 7:
This is the outline. You have to read "represent" as "contain";Q is going to contain states (some of which are in I , some are in Ω ) and f is going to be a transition function between states; think of it as a program.
This is just a reiteration of whatA∗ is. See also here.
This is probably the key sentence. We are talking about computations, that is execution sequences of some (programming language) statements which manipulate some state, which can be thought of as values in memory cells, or valuations of variables. Knuth says here that he wants to encode these states in an abstract way, namely as word over some alphabet.
Example: Consider a program that uses (at most)k variables, each of which stores an integer. That is, a state is given by the tuple of values (x1,…,xk) where xk is the (current) value of the k -th variable. In order to encode states of this form in a formal language, we can choose A={0,1,#} with # a separator. Now model such a state by #x1¯¯¯¯¯#⋯#xk¯¯¯¯¯# where xi¯¯¯¯¯ is the binary encoding of xi .
Specifically,(3,5,0) would be #11#101#0# .
You misquoted there (bad Stefano!); the parentheses are not in the original text, and they were misleading (see above). Knuth definesQ here as the set of all possible states (σ∈A∗ ) at all possible places in the computation (j can be understood as program counter). Therefore, Q contains all statement-indexed states any computation of the algorithm given by f can assume. By definition, we start with program counter 0 and end in N , thus states indexed 0 are input states and those indexed N are output states.
I hope that this is clear; it is just a (re)definition of substrings.
This is a a small programming language; if you fixθj,ψj,aj,bj , you have a program. On program counter j , f replaces the left-most occurrence θj in the state with ψj and goes to statement bj . If there is no θj in the current state, it goes to statement aj . The program loops if statement N is reached, modelling termination.
On the upper half of page 8, there is a more concrete example of a "program"f . Keep in mind that Knuth is going to use assembly language later on; this informs how he looks at programs (atomic statements connected by jumps).
fonte
That text describes the following (Python) pseudocode:
The function f is presumably going to be applied repeatedly.
The last three bullet points is all you really need once you understand the notations. All that comes before is a bit analogous to explaining how Python works before giving the Python code.
fonte