O objetivo aqui é fazer um Autômato de Fila que consiga emular o funcionamento de uma Máquina de Turing. Assumindo o teorema de que Máquinas de Turing são capazes de realizar qualquer computação, a tarefa estaria completa. Porém, a primeira demonstração aqui será mostrando que existe um algoritmo que transforma um Autômato de Fila em uma Máquina de Turing.

Essa demonstração será feita em duas partes. Nesta primeira parte, iremos simular um autômato de fila através de uma máquina de Turing. Na segunda parte, iremos simular uma máquina de Turing através de um autômato de fila;

Antes de podermos prosseguir, precisamos antes estabelecer algumas definições do que é cada um desses autômatos, funções de transição e aceitação de entradas. Assim, daremos o fundamento necessário para as duas partes desta demonstração.

Definições

Transições

Uma transição é uma função que mapeia um estado em outro, recebendo outros argumentos eventualmente também.

Essa função pode ter dois ou mais mapeamentos distintos para a mesma entrada. Isso nos dá o seguinte, para o exemplo de uma Máquina de Turing:

(Q,Σ)↦(Q,Σ,{⇐,⇒}) (Q, \Sigma) \mapsto (Q, \Sigma, \left \{\Leftarrow, \Rightarrow\right\})

Pode gerar dois mapeamentos:

(q0,σ0)↦(q1,σ1,⇐)(q0,σ0)↦(q2,σ2,⇒)q0,q1,q2∈Q,σ0,σ1,σ2∈Σ (q_0, \sigma_0) \mapsto (q_1, \sigma_1, \Leftarrow)\\ (q_0, \sigma_0) \mapsto (q_2, \sigma_2, \Rightarrow)\\ q_0,q_1,q_2 \in Q, \sigma_0,\sigma_1,\sigma_2 \in \Sigma

E isso estaria certo. Podemos dizer então que a função de transição é um elemento dentro do conjunto δ\delta que seja do seguinte formato:

t0∈δ  ⟹  t0=(A,S⊂B+) t_0 \in \delta \implies t_0 = (A, S \subset B^+)

Onde, para b0,b1∈Bb_0, b_1 \in B, os seguintes elementos são equivalentes:

(A,Sb0b1E)=(A,βsb1b0βe),∀βs,βe∈S∪{σ} (A, S b_0 b_1 E) = (A, \beta_s b_1 b_0 \beta_e), \forall \beta_s, \beta_e \in S\cup \left\{ \sigma \right\}

Outro ponto importante é que todo elemento na palavra na segunda posição da tupla precisa ser distinto, e toda string string em BB com pelo menos um elemento é aceita em SS:

b∈B  ⟹  b∈S∀β0b0β1b1β3∈S  ⟹  b0,b1∈B,b0≠b1,β0,β1,β2∈S∪{σ} b \in B \implies b \in S\\ \forall \beta_0 b_0 \beta_1 b_1 \beta_3 \in S \implies b_0, b_1 \in B, b_0\neq b_1, \beta_0,\beta_1,\beta_2 \in S \cup \left\{ \sigma \right\}

Um elemento a∈Aa \in A qualquer só pode aparecer uma única vez no lado esquerdo da tupla.

Nesse sentido, as duas transições acima mencionadas da Máquina de Turing arbitrária seriam representadas assim:

((q0,σ0),((q1,σ1,⇐),(q2,σ2,⇒))) \Bigg( \bigg(q_0, \sigma_0\bigg), \bigg((q_1, \sigma_1, \Leftarrow), (q_2, \sigma_2, \Rightarrow)\bigg) \Bigg)

Ou, em outras palavras, A=Q×Γ;B=Q×Γ×{⇐,⇒}A = Q\times\Gamma ; B = Q\times\Gamma\times \left \{\Leftarrow, \Rightarrow\right\}

Isso nos permite montar um conjunto de tuplas (A,B)(A, B) que equivalam ao conjunto de tuplas (A,B+)(A, B^+); vamos chamar o mapemaento (A,B)(A, B) de mapeamento de transições, enquanto que o (A,B+)(A, B^+) é o mapeamento completo.

Os dois modelos são equivalentes.

Demonstração, mapeamento completo para mapeamento de transição

Tome um elemento do mapeamento de transição t∈δ,t:(a,bβ)t \in \delta, t: (a, b\beta), com a∈Aa \in A, b∈Bb \in B e β∈B∗\beta \in B^*.

Pela definição, ∀tx∈δ,tx[0]=a  ⟹  tx=t\forall t_x \in \delta, t_x[0] = a \implies t_x = t. Isso significa que tt é a única transição que tem como argumentos aa, produzindo um dos elementos dentro de bβb\beta.

Mapeemos para transições simples. Vamos aplicar um algoritmo recursivo para gerar um conjunto de transições (A,B)(A, B):

mapeamento_simples(a,bβ)↦{(a,b)}∪mapeamento_simples(a,β)mapeamento_simples(a,σ)↦∅ mapeamento\_simples\left(a, b\beta\right) \mapsto \{(a, b)\} \cup mapeamento\_simples\left(a, \beta\right)\\ mapeamento\_simples\left(a, \sigma\right) \mapsto \emptyset

No exemplo do mapeamento da máquina de Turing acima:

mapeamento_simples((q0,σ0),((q1,σ1,⇐),(q2,σ2,⇒)))↦{((q0,σ0),(q1,σ1,⇐))}∪mapeamento_simples((q0,σ0),((q2,σ2,⇒)))↦{((q0,σ0),(q1,σ1,⇐)),((q0,σ0),(q1,σ1,⇒))}∪mapeamento_simples((q0,σ0),σ)↦{((q0,σ0),(q1,σ1,⇐)),((q0,σ0),(q1,σ1,⇒))} mapeamento\_simples\Bigg( \bigg(q_0, \sigma_0\bigg), \bigg((q_1, \sigma_1, \Leftarrow), (q_2, \sigma_2, \Rightarrow)\bigg) \Bigg) \mapsto\\ \Big\{\big((q_0, \sigma_0), (q_1, \sigma_1, \Leftarrow)\big)\Big\} \cup mapeamento\_simples\Bigg( \bigg(q_0, \sigma_0\bigg), \bigg((q_2, \sigma_2, \Rightarrow)\bigg) \Bigg) \mapsto\\ \Big\{\big((q_0, \sigma_0), (q_1, \sigma_1, \Leftarrow)\big), \big((q_0, \sigma_0), (q_1, \sigma_1, \Rightarrow)\big)\Big\}\cup mapeamento\_simples\Bigg( \bigg(q_0, \sigma_0\bigg), \sigma \Bigg) \mapsto\\ \Big\{\big((q_0, \sigma_0), (q_1, \sigma_1, \Leftarrow)\big), \big((q_0, \sigma_0), (q_1, \sigma_1, \Rightarrow)\big)\Big\}

Demonstração, mapeamento de transição para mapeamento completo

Aqui, temos um conjunto de pares (A,B)(A, B) e gostaríamos de juntar tudo que tenha o mesmo LHS e gerar uma lista do RHS. Seria o equivalente Java a:

List<Par<A, B>> transicoes = ...;
Map<A, List<B>> mapemaentoCompleto = transicoes.stream()
  .collect(Collectors.groupingBy(Par::LHS,
           Collectors.mapping(Par::RHS, Collectors.toList())));

Máquina de Turing

Uma máquina de Turing é uma séptupla <Q,q0,F,Σ,b,Γ,δ>\left<Q, q_0, F, \Sigma, b, \Gamma, \delta \right> onde:

  • QQ é o conjunto de todos os estados
  • q0q_0 é o estado inicial, q0∈Qq_0 \in Q
  • FF é o conjunto de estados de aceitação, F⊆QF \subseteq Q
  • Σ\Sigma é o conjunto de elementos da entrada, Σ⊆Γ∖{b}\Sigma \subseteq \Gamma \setminus \{b\}
  • bb é o símbolo de espaço em branco, b∈Γb \in \Gamma
  • Γ\Gamma é o conjunto de todos os elementos de trabalho, os símbolos da fita
  • δ\delta são as transições, sempre mapeamento de um estado e um símbolo na cabeça de leitura para outro estado, o novo símbolo que ficará no lugar do símbolo lido e também se a cabeça de leitura seguiu para a esquerda ou para a direita, (Q∖F,Γ)↦(Q,Γ,{⇐,⇒})(Q\setminus F, \Gamma) \mapsto (Q, \Gamma, \{\Leftarrow, \Rightarrow\})

Ao alcançar um estado final qf∈Fq_f \in F, como não tem transição para esse estado, alcança-se a aceitação.

Caso se esteja em um estado não final q∈Q,q∉Fq \in Q, q \not\in F com um símbolo de fita γ\gamma e não seja possível disparar alguma transição, então a entrada foi rejeitada.

Autômato de fila

Um autômato de fila é uma sextupla <Q,q0,Σ,$,Γ,δ>\left<Q, q_0, \Sigma, $, \Gamma, \delta \right> onde:

  • QQ é o conjunto de todos os estados
  • q0q_0 é o estado inicial, q0∈Qq_0 \in Q
  • Σ\Sigma é o conjunto de elementos da entrada, Σ⊆Γ∖{$}\Sigma \subseteq \Gamma \setminus \{$\}
  • $$ é o símbolo que representa o final da palavra, $∈Γ$ \in \Gamma
  • Γ\Gamma é o conjunto de todos os elementos de trabalho
  • δ\delta são as transições, sempre mapeamento de um estado e um símbolo da fita para um novo estado e, evantualmente, a inserção de uma string Γ∗\Gamma^* no final da fila.

Diz-se que houve aceitação ao, no final do processamento, a fila estar vazia. Caso a fila não esteja vazia e não tenha mais transição para disparar, aconteceu a rejeição de uma palavra.

Simulando um autômato de fila em uma Máquina de Turing

Temos um autômato de fila <Q,q0,Σ,$,Γ,δ>\left<Q, q_0, \Sigma, $, \Gamma, \delta \right>. Precisamos de uma Máquina de Turing que se comporte exatamente como esse autômato de fila.

Vamos iniciar com a fita tendo apenas a palavra de entrada, sem o $$, pois estamos numa Máquina de Turing, correto? Aqui, o foco inicial será o autômato de fila que reconhece a palavra AnBnCnA^nB^nC^n. Vamos explorar esse exemplo sem perder generalidade:

qi
V
AAABBBCCC

Onde a seta para baixo mostra a cabeça de leitura da Máquina de Turing. O estado está indicado acima da cabeça de leitura, no caso, qiq_i. Símbolos em branco à esquerda ou à direita serão omitidos ou motrados conforme proveito. Por exemplo, a máquina está na estado qjq_j dois espaços em branco antes da entrada:

qj
V
  AAABBBCCC

Bem, na simulação da autômato de fila, apenas mantemos a fila e o estado da máquina, sem maiores indicações. Isso permite, por exemplo, colocar a evolução do autômato assim, com cada transição sendo uma linha:

q0: AAABBBCCC$
qa: AABBBCCC$
qa: ABBBCCC$A
qa: BBBCCC$AA
qb: BBCCC$AA
qb: BCCC$AAB
qb: CCC$AABB
qc: CC$AABB
qc: C$AABBC
qc: $AABBCC
q0: AABBCC$

Um autômato de fila para AnBnCnA^nB^nC^n

Como motivador para a transformação, vamos iniciar com o autômato de fila e então aplicar regras de conversão para Máquina de Turing. Então, como definir esse autômato? Vamos pelas informações conhecidas: começa em q0q_0, tem os símbolos de entrada Σ={A,B,C}\Sigma = \left\{A,B,C\right\}, e tem o símbolo terminal $$.

Um ponto importante é que ele precisa reconhecer a palavra gerada quando n=0n = 0, portanto ϵ\epsilon, a palavra vazia. Isso se dá usando a seguinte transformação:

(q0,$)↦(q0,ϵ) (q_0, $) \mapsto (q_0, \epsilon)

Executando o autômato apenas com essa regra passando a palavra vazia para ele:

q0: $
q0:

Como a única opção foi consumir o $$ sem produzir nada. A fila ficou vazia após esse consumo, portanto houve o aceite da entrada.

Agora, e para os outros casos? Meu pensamento aqui é simples:

  • seja Θ0,Θ1∈[ABC]∗\Theta_0, \Theta_1 \in [ABC]^*
  • seja a fila AAxΘ0$Θ1AA^x\Theta_0$\Theta_1
  • esteja o autômato em um estado qx≠qaq_x \neq q_a
  • então a transição (qx,A)↦(qa,ϵ)(q_x, A) \mapsto (q_a, \epsilon) existe
  • e a transição (qa,A)↦(qa,A)(q_a, A) \mapsto (q_a, A) também existe
  • portanto, após x+1x+1 transições, sairemos de qx:AAxΘ0$Θ1q_x: AA^x\Theta_0$\Theta_1 para qa:Θ0$Θ1Axq_a: \Theta_0$\Theta_1 A^x

Note que os estados qx,qaq_x, q_a e as duas transições descritas acima vão consumir exatamente um único elemento de uma sequência de AAs e jogar o resto da sequência para o final. Podemos fazer coisas equivalentes para BB e para CC. Detalhe que, no caso de CC, ao encontrar $$, podemos usar a estratégia de jogar $$ no final e voltar para q0q_0. Se chegou nesse ponto, então saímos de q0:AAxBBxCCx$q_0: AA^xBB^xCC^x$ para q0:AxBxCx$q_0: A^xB^xC^x$. Afinal, consumimos sempre um elemento de uma sequência de AA, BB ou CC e jogamos o resto para o final da fila. Basicamente reduzimos o problema com n=x+1n=x+1 para n=xn=x, até o ponto de encontrar n=0n=0 que já sabemos reconhecer.

Por questões de simplicidade, usemos qyq_y para BB o que o qxq_x é para o AA, e equivalentemente qzq_z para o CC. qbq_b e qcq_c são equivalentes ao qaq_a no sentido que são produzidos pelo qxq_x ou equivalente e jogam o resto da sequência no final da fila.

No caso das transições usando AA, temos que a primeira possibilidade para qxq_x é q0q_0, pois o sistema iniciará exatamente em q0q_0 e necessita consumir um AA ou aceitar a palavra vazia. Não descartemos, ainda, outras possibilidades para qxq_x.

Similarmente, chegaremos na sequência de BB através de qaq_a, então uma possibilidade para qyq_y seria justamente qaq_a. E para qcq_c, temos que chegará da sequência de BBs, portanto qbq_b é uma das possibilidades para qzq_z.

Assim, temos as seguintes transições definidas:

(q0,$)↦(q0,ϵ)(q0,A)↦(qa,ϵ)(qa,A)↦(qa,A)(qa,B)↦(qb,ϵ)(qb,B)↦(qb,B)(qb,C)↦(qc,ϵ)(qC,C)↦(qc,C)(qC,$)↦(q0,$) \begin{array}{lcl} (q_0, $)&\mapsto&(q_0, \epsilon)\\ (q_0, A)&\mapsto&(q_a, \epsilon)\\ (q_a, A)&\mapsto&(q_a, A)\\ (q_a, B)&\mapsto&(q_b, \epsilon)\\ (q_b, B)&\mapsto&(q_b, B)\\ (q_b, C)&\mapsto&(q_c, \epsilon)\\ (q_C, C)&\mapsto&(q_c, C)\\ (q_C, $)&\mapsto&(q_0, $) \end{array}

Ok, agora isso realmente reconhece o que desejamos? Vamos ver…

Se tivermos por acaso q0q_0 tentando consumir BB ou CC, não tem transição. O autômato de fila não consegue disparar nenhuma transição e não está vazio, portanto rejeitou a entrada. Logo, recusa entradas no formato [BC][ABC]∗[BC][ABC]^*.

Saindo de qaq_a, se for um CC, trava também. Logo, entradas do tipo A+C[ABC]∗A^+C[ABC]^* também são recusadas. Se chegar no final da palavra, também recusa, daí A+A^+ também é rejeitado. De modo semelhante, também se recusa quando em qbq_b encontrar um AA ou o final da palavra, ou quando em qcq_c encontrar um AA ou um BB. Logo, as únicas opções são um subconjunto de A+B+C+∣ϵA^+B^+C^+|\epsilon. Tomemos a forma genérica AxByCzA^xB^yC^z, com x,y,z≥0x,y,z \ge 0. Note que no caso x=y=z=0x = y = z = 0 temos ϵ\epsilon, que é aceito.

Esse autômato é de tal forma que sempre repete os mesmos estados nessa ordem: q0↦qa↦qb↦qc↦q0q_0 \mapsto q_a \mapsto q_b \mapsto q_c \mapsto q_0. Já vimos que para ocorrer essa transição toda de q0q_0 para q0q_0 novamente consumimos necessariamente 1 A, 1 B e 1 C. Portanto, do estado inicial q0:Ax+1By+1Cz+1$q_0: A^{x+1}B^{y+1}C^{z+1}$ iremos naturalmente para q0:AxByCz$q_0: A^xB^yC^z$.

Chamemos essa operação de “rodar um ciclo”. Suponha agora que x,z>yx,z > y. Isso significa que poderemos rodar no máximo yy ciclos. Após rodar yy ciclos, teremos que o autômato de fila estará q0:Ax−yCz−y$q_0: A^{x-y}C^{z-y}$. Porém A+C+A^+C^+ não é reconhecido, pois é um subconjunto de A+C[ABC]∗A^+C[ABC]^* e já vimos que esse conjunto não é reconhecido. Logo, não podemos ter x,z>yx,z > y. Agora, e se x>y≥zx > y \ge z? Isso ainda é possível… Então, após rodar zz ciclos, teremos q0:Ax−zBy−z$q_0: A^{x-z}B^{y-z}$. Isso é uam palavra em A+B∗A^+B^*. O autômato recusa A+A^+, portanto ainda tem A+B+A^+B^+, porém vimos já que ele não aceita esse tipo de entrada, portanto também recusa palavras em A+B+A^+B^+. Portanto, chegamos a conclusão que x≤yx \le y.

Usando raciocínio semelhante iremos encontrar que x≤zx \le z. Assim, podemos fazer a hipótese de y≠zy \ne z. Como x≤yx \le y e x≤zx \le z, temos que y−x≥0y-x \ge 0 e z−x≥0z-x \ge 0. Portanto, após rodar xx ciclos, teremos o autômato de fila assim: q0:By−xCz−xq_0: B^{y-x}C^{z-x}. Se y−x≠0y-x \ne 0, teremos um subconjunto de B+C∗B^+C^*, porém já vimos que entradas [BC][ABC]∗[BC][ABC]^* são rejeitadas. Portanto, y−x=0y-x = 0. Isso nos leva a crer que z−x>0z-x > 0, pois y≠zy \ne z. Com isso, teremos C+C^+, que também é uma entrada rejeitada por também ser um subconjunto de [BC][ABC]∗[BC][ABC]^*. Logo, temos que x≤y,z=yx \le y, z = y. Com um esforço semelhante, temos que se x<yx < y não iremos reconhecer a palavra, logo só nos resta x=y=zx = y = z. Então, esse autômato de fila realmente reconhece a linguagem desejada, e apenas ela.

Definindo o autômato de fila:

Q={q0,qa,qb,qc}q0 eˊ o estado inicialΣ={A,B,C}$ eˊ o indicador de final de palavraΓ={A,B,C,$}δ={(q0,$)↦(q0,ϵ)(q0,A)↦(qa,ϵ)(qa,A)↦(qa,A)(qa,B)↦(qb,ϵ)(qb,B)↦(qb,B)(qb,C)↦(qc,ϵ)(qC,C)↦(qc,C)(qC,$)↦(q0,$)} Q = \left\{ q_0, q_a, q_b, q_c \right\}\\ q_0\ \text{é o estado inicial}\\ \Sigma = \left\{ A, B, C \right\}\\ $\ \text{é o indicador de final de palavra}\\ \Gamma = \left\{ A, B, C, $ \right\}\\ \delta=\left\{ \begin{array}{lcl} (q_0, $)&\mapsto&(q_0, \epsilon)\\ (q_0, A)&\mapsto&(q_a, \epsilon)\\ (q_a, A)&\mapsto&(q_a, A)\\ (q_a, B)&\mapsto&(q_b, \epsilon)\\ (q_b, B)&\mapsto&(q_b, B)\\ (q_b, C)&\mapsto&(q_c, \epsilon)\\ (q_C, C)&\mapsto&(q_c, C)\\ (q_C, $)&\mapsto&(q_0, $) \end{array} \right\}

Simulando através de uma Máquina de Turing

Inicialmente, vamos pegar a entrada e transformá-la de modo digno. Na Máquina de Turing a entrada será necessariamente apenas a palavra. Logo, para simular melhor o autômato de fila, nada como transformar a entrada da Máquina de Turing na entrada do autômato de fila.

Portanto, para o estado inicial da Máquina de Turing qtq_t, temos de sair de

qt
V
AAABBBCCC

para

q0'
V
AAABBBCCC$

onde q0′q_{0^{'}} é o equivalente ao q0q_0 do autômato de fila.

Seja qtq_t o estado inicial da Máquina de Turing, o objetivo dela é único e simplesmente inserir o símbolo terminador $$ no final da entrada. Logo, todo e qualquer símbolo da entrada deverá permanecer inalterado enquanto a Máquina de Turing caminha para a direita até encontrar o primeiro branco, então substituirá esse branco por $$ e passará a caminhar à esquerda para voltar para o início.

Exemplificando, sairemos de

qt
V
AAABBBCCC

passaremos por alguns estágios intermediários como

     qt
     V
AAABBBCCC

até chegarmos em

         qt
         V
AAABBBCCC 

Nesse momento, o espaço em branco será substituído por $$ e o estado mudará para qi≠qtq_i \ne q_t, que é o estado que iremos usar apenas para fazer o rebobinar. Então, o próximo passo é

        qi
        V
AAABBBCCC$

iremos passar por alguns estados intermediários como

     qi
     V
AAABBBCCC$

e finalmente iremos ultrapassar o início da entrada:

qi
V
 AAABBBCCC$

Nesse momento, iremos manter o branco ali e caminhar a direita, assumindo o estado q0′q_{0^{'}}:

q0'
V
AAABBBCCC$

como gostaríamos.

Agora, vamos usar a operação de rebobinar em diversos momentos, pois iremos escrever coisas no final da fita para representar o que é produzido no final do disparo do autômato de fila. Portanto, podemos deixar um marcador especial que, ao rebobinador encontrar esse marcador, ele irá para um estado específico mapeado do autômato de fila. Como no autômato de fila usamos q0q_0, qaq_a e assim por diante, usarei esse subscrito para representar esse estado. Isso significa que o começo do nosso processamento não é mais ir para a direita e colocar um $$ no final da entrada, mas sim ir para a esquerda, inserir 00 na entrada, então ir para a direita para inserir o $$ no final, então rebobinar tudo e iniciar o processamento do autômato de fila. Então, chamemos de qgq_g o estado inicial da Máuqina de Turing.

qgq_g tem como única intenção ir para a esquerda mantendo o caracter inicial, escrever 00 no espaço em branco e ir para a direita com o qtq_t já definido.

A execução fica assim:

qg
V
AAABBBCCC
qg
V
 AAABBBCCC
 qt
 V
0AAABBBCCC

Todo o resto continua sendo bem equivalente, mas temos que qiq_i irá consumir 00 e irá para a direita no estado q0′q_{0^{'}}:

          qi
          V
0AAABBBCCC$
 qi
 V
0AAABBBCCC$
qi
V
0AAABBBCCC$
 q0'
 V
 AAABBBCCC$

Por algo que irei explicar mais tarde, vamos usar qt$q_{t_$} no lugar de qtq_t, mas ele faz exatamente o que foi definido para qtq_t: vai para a direita e, ao achar um estado em branco, produz $$ e entra no estado de rebobinar.

Só aqui, para determinar alguns elementos da Máquina de Turing, temos algumas definições:

  • todo estado do autômato de fila implica em um símbolo de trabalho da Máquina de Turing e também um estado da Máquina de Turing
  • vamos chamar o mapeamento de estado do autômato de fila para elemento de trabalho da função τ:QAF↦ΓMT\tau: Q_{AF} \mapsto \Gamma_{MT}
  • vamos chamar o mapeamento de estado do autômato de fila para estado da máquina de Turing da função χ:QAF↦QMT\chi: Q_{AF} \mapsto Q_{MT}
  • o alfabeto de entrada do autômato de fila é o mesmo alfabeto de entrada da Máquina de Turing, ΣAF≡ΣMT\Sigma_{AF} \equiv \Sigma_{MT}
  • $$ pertence ao alfabeto de trabalho da Máquina de Turing (ou algo equivalente a ele)
  • não há equivalente ao branco no autômato de fila, portanto ∀γ∈ΓAF,t(γ)≠b\forall \gamma \in \Gamma_{AF}, t(\gamma) \ne b, sendo t:ΓAF↦ΓMTt: \Gamma_{AF} \mapsto \Gamma_{MT} a função que mapeia elementos de trabalho do autômato de fila para elementos de trabalho da Máquina de Turing
  • de modo similar, não há equivalente do branco dos estados do autômato de fila na fita de trabalho da Máquina de Turing, ∀q∈QAF,τ(q)≠b\forall q \in Q_{AF}, \tau(q) \ne b, onde τ:QAF↦ΓMT\tau: Q_{AF} \mapsto \Gamma_{MT} transforma o estado do autômato de fila em um símbolo de trabalho da Máquina de Turing
  • a Máquina de Turing começa no estado qgq_g que tem as transições ∀σ∈Σ,(qg,σ)↦(qg,σ,⇐)\forall \sigma \in \Sigma, (q_g, \sigma) \mapsto (q_g, \sigma, \Leftarrow) e também (qg,b)↦(qt$,τ(q0),⇒)(q_g, b) \mapsto (q_{t_$}, \tau(q_0), \Rightarrow), sendo q0q_0 o estado inicial do autômato de fila e qt$≠qgq_{t_$} \ne q_g.
  • existem estados da máquina de Turing que não devem possuir equivalência no autômato de fila, vamos chamar o conjunto desses estados de RR, portanto ∀q∈QAF,χ(q)∉R\forall q \in Q_{AF}, \chi(q) \not\in R, sendo χ:QAF↦QMT\chi: Q_{AF} \mapsto Q_{MT} a função que mapeia de um estado do autômato de fila para um estado na máquina de Turing
  • qg,qt$,qi∈Rq_g, q_{t_$}, q_i \in R
  • para colocar o $$ no final, temos que ter as seguintes transições ∀σ∈Σ,(qt$,σ)↦(qt$,σ,⇒)\forall \sigma \in \Sigma, (q_{t_$}, \sigma) \mapsto (q_{t_$}, \sigma, \Rightarrow) e também a transição definitiva de inserção do $$, (qt$,b)↦(qi,$,⇐)(q_{t_$}, b) \mapsto (q_i, $, \Leftarrow), sendo que qt$≠qiq_{t_$} \ne q_i (por outras questões temos também que qg≠qiq_g \ne q_i)
  • para o rebobinar, temos que conseguir recuar sempre, não só para os símbolos da entrada como também para os símbolos de trabalho do autômato de fila, portanto as transições ∀γ∈ΓAF,(qi,t(γ))↦(qi,t(γ),⇐)\forall \gamma \in \Gamma_{AF}, (q_i, t(\gamma)) \mapsto (q_i, t(\gamma), \Leftarrow) existem
  • finalmente, temos que, após rebobinar, ir para o estado equivalente do autômato de fila, portanto as seguintes transições existem ∀q∈QAF,(qi,τ(q))↦(χ(q),b,⇒)\forall q \in Q_{AF}, (q_i, \tau(q)) \mapsto (\chi(q), b, \Rightarrow)

Isso apenas para dar o bootstraping do autômato de fila. Agora precisamos definir as transições.

Vamos dividir essas transições em dois tipos: o tipo δϵ\delta_\epsilon são transições que não produzem nada para o final da fila (portanto, se a i-ésima transição for ti:(qx,γ)↦(qy,ϵ)t_i: (q_x, \gamma) \mapsto (q_y, \epsilon), então ti∈δϵt_i \in \delta_\epsilon); e o tipo δΩ\delta_\Omega, que produz um ou mais elementos no final da fila (portanto, se a i-ésimo transição for ti:(qx,γ)↦(qy,ω),ω∈Γ+t_i: (q_x, \gamma) \mapsto (q_y, \omega), \omega \in \Gamma^+, então ti∈δΩt_i \in \delta_\Omega).

As transições δϵ\delta_\epsilon, como não produzem nada de especial no final, podem ser representadas na máquina de Turing como simplesmente transformando o elemento atual em branco, mudando para o estado χ(qy)\chi(q_y) e avançando para a direita:

∀ti=(qx,γ)↦(qy,σ)∈δϵ,(χ(qx),t(γ))↦(χ(qy),b,⇒) \forall t_i = (q_x, \gamma) \mapsto (q_y, \sigma) \in \delta_\epsilon, (\chi(q_x), t(\gamma)) \mapsto (\chi(q_y), b, \Rightarrow)

Para transições δΩ\delta_\Omega, vamos deixar a marca do novo estado do autômato de fila para quando for feita a rebobinação. Nessa situação, precisamos ir até o final e inserir exatamente o elemento produzido. Peguemos a transição tj∈δΩ,tj=(qx,γ)↦(qy,γω),γ∈ΓAF,ω∈ΓAF∗t_j \in \delta_\Omega, t_j = (q_x, \gamma) \mapsto (q_y, \gamma\omega), \gamma \in \Gamma_{AF}, \omega \in \Gamma_{AF}^*. Para essa transição, precisamos de um novo qtγω∈Rq_{t_{\gamma\omega}} \in R que faça um papel semelhante ao qt$q_{t_$} previamente definido: ir até o final da entrada e, então, inserir o equivalente à palavra γω\gamma\omega no final da fita, então mudar para o estado de rebobinar qiq_i.

Nomeemos então o conjunto de estados QΩQ_\Omega, onde qtω inQΩq_{t_\omega} \ in Q_\Omega se ω∈ΓAF+\omega \in \Gamma_{AF}^+. Note que ∀qtω∈QΩ,qtω∈R,qtω≠qi,qtω≠qg\forall q_{t_\omega} \in Q_\Omega, q_{t_\omega} \in R, q_{t_\omega} \ne q_i, q_{t_\omega} \ne q_g. Uma das característica dos estados em QΩQ_\Omega é que, para elementos de fila mapeados vindos de f(γ),γ∈ΓAFf(\gamma), \gamma \in \Gamma_{AF}, ele simplesmente irá ignorar esse elemento e seguir para a direita, até encontrar o primeiro elemento em branco que, então, começará a fazer o dump do ω\omega na fita:

∀qtω∈QΩ,∀γ∈ΓAF,(qtω,t(γ))↦(qtω,t(γ),⇒) \forall q_{t_\omega} \in Q_\Omega, \forall \gamma \in \Gamma_{AF}, (q_{t_\omega}, t(\gamma)) \mapsto (q_{t_\omega}, t(\gamma), \Rightarrow)

Note que a premissa original gera u subconjunto dessas transições, já que ΣAF⊆ΓAF∖{$}\Sigma_{AF} \subseteq \Gamma_{AF} \setminus \{$\}.

Quando chega no elemento em branco, temos duas opções para qtωq_{t_\omega}: ∣ω∣=1|\omega| = 1 ou então ∣ω∣>1|\omega| > 1. Para o primeiro caso, tomemos qtγ,γ∈ΓAFq_{t_\gamma}, \gamma \in \Gamma_{AF}; vamos chamar esse conjunto de QΩ1Q_{\Omega^1}. Ele vai simplesmente colocar na fita o t(γ)t(\gamma) e seguir rebobinando, portanto:

∀qtγ∈QΩ1,γ∈ΓAF,(qtγ,b)↦(qi,t(γ),⇐) \forall q_{t_\gamma} \in Q_{\Omega^1}, \gamma \in \Gamma_{AF}, (q_{t_\gamma}, b) \mapsto (q_i, t(\gamma), \Leftarrow)

Note que, quando γ=$\gamma = $, o caso para qt$q_{t_$} é apenas um caso especial disso.

Para os outros elementos, adotemos a nomenclatura qtγω,γ∈ΓAF,ω∈ΓAF+q_{t_{\gamma\omega}}, \gamma \in \Gamma_{AF}, \omega \in \Gamma_{AF}^+; vamos chamar esse conjunto de QΩ2+Q_{\Omega^{2+}}. Ele vai colocar na fita o elemento t(γ)t(\gamma) e irá para a direita para terminar de colocar o resto do mapeamento de ω\omega. Podemos assumir então que ele irá para o estado qtωq_{t_\omega} tal que qtω∈QΩq_{t_\omega} \in Q_\Omega:

∀qtγω∈QΩ2+,γ∈ΓAF,(qtγω,b)↦(qtω,t(γ),⇒),qtω∈QΩ \forall q_{t_{\gamma\omega}} \in Q_{\Omega^{2+}}, \gamma \in \Gamma_{AF}, (q_{t_{\gamma\omega}}, b) \mapsto (q_{t_\omega}, t(\gamma), \Rightarrow), q_{t_\omega} \in Q_\Omega

Vale ressaltar que QΩ=QΩ1+QΩ2+,QΩ1∩QΩ2+=∅Q_\Omega = Q_{\Omega^1} + Q_{\Omega^{2+}}, Q_{\Omega^1} \cap Q_{\Omega^{2+}} = \emptyset.

Essa regra, definida exatamente desse jeito, garante que o elemento produzido pela transição do autômato seja fielmente colocada apenas no final da fila.

Recapitulando:

  • todo estado do autômato de fila implica em um símbolo de trabalho da Máquina de Turing e também um estado da Máquina de Turing
  • vamos chamar o mapeamento de estado do autômato de fila para elemento de trabalho da função bijetiva τ:QAF↦ΓQ\tau: Q_{AF} \mapsto \Gamma_Q, sendo ΓQ⊂ΓMT\Gamma_Q \subset \Gamma_{MT}
  • vamos chamar o mapeamento de estado do autômato de fila para estado da máquina de Turing da função bijetiva χ:QAF↦QQ\chi: Q_{AF} \mapsto Q_Q, sendo QQ⊂QMTQ_Q \subset Q_{MT}
  • QMT=R+QQQ_{MT} = R + Q_Q
  • QQ∩R=∅Q_Q \cap R = \emptyset
  • os alfabetos de entrada são equivalentes, ΣAF≡ΣMT\Sigma_{AF} \equiv \Sigma_{MT}
  • o indicador de fim de linha $$ no autômato de fila tem seu equivalente na máquina de Turing, representado simplesmente por $$
  • todo elemento de trabalho do autômato de fila tem um equivalente no elemento de fita, ∀γ∈ΓAF,t(γ)∈ΓΓ\forall \gamma \in \Gamma_{AF}, t(\gamma) \in \Gamma_{\Gamma}, sendo ΓΓ⊂ΓMT\Gamma_{\Gamma} \subset \Gamma_{MT}
  • ΓΓ∩ΓQ=∅\Gamma_{\Gamma} \cap \Gamma_Q = \emptyset
  • seja bb o caracter que representa o vazio da fita da máquina de Turing, b∉ΓΓ+ΓQb \not\in \Gamma_{\Gamma} + \Gamma_Q
  • QΩ⊂R,QΩ=QΩ1+QΩ2+,QΩ1∩QΩ2+=∅Q_\Omega \subset R, Q_\Omega = Q_{\Omega^1} + Q_{\Omega^{2+}}, Q_{\Omega^1} \cap Q_{\Omega^{2+}} = \emptyset
  • ∀γ∈ΓAF,∃qγ∈QΩ1\forall \gamma \in \Gamma_{AF}, \exists q_\gamma \in Q_{\Omega^1}
  • qg,qi∈Rq_g, q_i \in R
  • qg,qi∉QΩq_g, q_i \not \in Q_\Omega
  • estado inicial da máquina de Turing é qg∈Rq_g \in R, cujas únicas transições são ∀σ∈Σ,(qg,σ)↦(qg,σ,⇐)\forall \sigma \in \Sigma, (q_g, \sigma) \mapsto (q_g, \sigma, \Leftarrow) e também (qg,b)↦(qt$,τ(q0),⇒),qt$∈QΩ1(q_g, b) \mapsto (q_{t_$}, \tau(q_0), \Rightarrow), q_{t_$} \in Q_{\Omega^1}
  • as seguintes transições existem, ∀qtω∈QΩ,∀γ∈ΓAF,(qtω,t(γ))↦(qtω,t(γ),⇒)\forall q_{t_\omega} \in Q_\Omega, \forall \gamma \in \Gamma_{AF}, (q_{t_\omega}, t(\gamma)) \mapsto (q_{t_\omega}, t(\gamma), \Rightarrow)
  • seja uma transição do autômato de fila que produza a string não vazia ω∈ΓAF+\omega \in \Gamma_{AF}^+, então temos um estado qtω∈QΩq_{t_\omega} \in Q_\Omega; se ∣ω∣≥2|\omega| \ge 2, então qtω∈QΩ2+q_{t_\omega} \in Q_{\Omega^{2+}}, caso contrário ∣ω∣=1|\omega| = 1, então qtω∈QΩ1q_{t_\omega} \in Q_{\Omega^1}
  • seja qtγω∈QΩ2+,γ∈ΓAF,ω∈ΓAF+q_{t_{\gamma\omega}} \in Q_{\Omega^{2+}}, \gamma \in \Gamma_{AF}, \omega \in \Gamma_{AF}^+, então temos que qtω∈QΩq_{t_\omega} \in Q_\Omega; se ∣ω∣≥2|\omega| \ge 2, então qtω∈QΩ2+q_{t_\omega} \in Q_{\Omega^{2+}}, caso contrário ∣ω∣=1|\omega| = 1, então qtω∈QΩ1q_{t_\omega} \in Q_{\Omega^1}
  • existem as transições ∀qtω∈QΩ,∀γ∈ΓAF,(qtω,t(γ))↦(qtω,t(γ),⇒)\forall q_{t_\omega} \in Q_\Omega, \forall \gamma \in \Gamma_{AF}, (q_{t_\omega}, t(\gamma)) \mapsto (q_{t_\omega}, t(\gamma), \Rightarrow)
  • existem as transições ∀qtγ∈QΩ1,(qtγ,b)↦(qi,t(γ),⇐)\forall q_{t_\gamma} \in Q_{\Omega^1}, (q_{t_\gamma}, b) \mapsto (q_i, t(\gamma), \Leftarrow)
  • existem as transições ∀qtγω∈QΩ2+,(qtγω,b)↦(qtω,t(γ),⇒)\forall q_{t_{\gamma\omega}} \in Q_{\Omega^{2+}}, (q_{t_{\gamma\omega}}, b) \mapsto (q_{t_\omega}, t(\gamma), \Rightarrow)
  • seja o estado de rebobinar qi∈Rq_i \in R, então ele tem apenas as seguintes transições:
    • ∀γ∈ΓAF,(qi,t(γ))↦(qi,t(γ),⇐)\forall \gamma \in \Gamma_{AF}, (q_i, t(\gamma)) \mapsto (q_i, t(\gamma), \Leftarrow)
    • ∀q∈QAF,(qi,τ(q))↦(χ(q),b,⇒)\forall q \in Q_{AF}, (q_i, \tau(q)) \mapsto (\chi(q), b, \Rightarrow)
  • se a transição do autômato de fila for t∈δϵ,t:(qx,γ)↦(qy,ϵ),qx,qy∈QAF,γ∈ΓAFt \in \delta_\epsilon, t: (q_x, \gamma) \mapsto (q_y, \epsilon), q_x,q_y \in Q_{AF}, \gamma \in \Gamma_{AF}, então a seguinte transição existe (χ(qx),t(γ))↦(χ(qy),b,⇒)(\chi(q_x), t(\gamma)) \mapsto (\chi(q_y), b, \Rightarrow)
  • se a transição do autômato de fila for t∈δΩ,t:(qx,γ)↦(qy,ω),qx,qy∈QAF,γ∈ΓAF,ω∈ΓAF+t \in \delta_\Omega, t: (q_x, \gamma) \mapsto (q_y, \omega), q_x,q_y \in Q_{AF}, \gamma \in \Gamma_{AF}, \omega \in \Gamma_{AF}^+, então a seguinte transição existe (χ(qx),t(γ))↦(qtω,τ(qy),⇒),qtω∈QΩ(\chi(q_x), t(\gamma)) \mapsto (q_{t_\omega}, \tau(q_y), \Rightarrow), q_{t_\omega} \in Q_\Omega
  • para simular a aceitação, que acontece se e somente se o autômato de fila consumir todos os elementos da entrada, temos que todo estado composto por equivalência do autômato de fila quando consumir o branco deve ir para o estado de aceitação qf∈F⊂Rq_f \in F \subset R, tal que qf∉QΩ+{qg,qi}q_f \not\in Q_\Omega + \{q_g, q_i\}
    • portanto, as seguintes transições existem ∀q∈QAF,(χ(q),b)↦(qf,b,⇒)\forall q\in Q_{AF}, (\chi(q), b) \mapsto (q_f, b, \Rightarrow)

Em cima dessas, regras, para o autômato de fila que reconhece AnBnCnA^nB^nC^n:

QAF={q0,qa,qb,qc}q0 eˊ o estado inicialΣAF={A,B,C}$ eˊ o indicador de final de palavraΓAF={A,B,C,$}δ={(q0,$)↦(q0,ϵ)(q0,A)↦(qa,ϵ)(qa,A)↦(qa,A)(qa,B)↦(qb,ϵ)(qb,B)↦(qb,B)(qb,C)↦(qc,ϵ)(qC,C)↦(qc,C)(qC,$)↦(q0,$)} Q_{AF} = \left\{ q_0, q_a, q_b, q_c \right\}\\ q_0\ \text{é o estado inicial}\\ \Sigma_{AF} = \left\{ A, B, C \right\}\\ $\ \text{é o indicador de final de palavra}\\ \Gamma_{AF} = \left\{ A, B, C, $ \right\}\\ \delta=\left\{ \begin{array}{lcl} (q_0, $)&\mapsto&(q_0, \epsilon)\\ (q_0, A)&\mapsto&(q_a, \epsilon)\\ (q_a, A)&\mapsto&(q_a, A)\\ (q_a, B)&\mapsto&(q_b, \epsilon)\\ (q_b, B)&\mapsto&(q_b, B)\\ (q_b, C)&\mapsto&(q_c, \epsilon)\\ (q_C, C)&\mapsto&(q_c, C)\\ (q_C, $)&\mapsto&(q_0, $) \end{array} \right\}

Temos que as seguintes transições são do tipo δΩ\delta_\Omega:

(qa,A)↦(qa,A)(qb,B)↦(qb,B)(qC,C)↦(qc,C)(qC,$)↦(q0,$) \begin{array}{lcl} (q_a, A)&\mapsto&(q_a, A)\\ (q_b, B)&\mapsto&(q_b, B)\\ (q_C, C)&\mapsto&(q_c, C)\\ (q_C, $)&\mapsto&(q_0, $) \end{array}

e as seguintes são do tipo δϵ\delta_\epsilon:

(q0,$)↦(q0,ϵ)(q0,A)↦(qa,ϵ)(qa,B)↦(qb,ϵ)(qb,C)↦(qc,ϵ) \begin{array}{lcl} (q_0, $)&\mapsto&(q_0, \epsilon)\\ (q_0, A)&\mapsto&(q_a, \epsilon)\\ (q_a, B)&\mapsto&(q_b, \epsilon)\\ (q_b, C)&\mapsto&(q_c, \epsilon) \end{array}

Todas as transições δΩ\delta_\Omega geram exatamente um único caracter na saída, portanto temos que QΩ2+=∅Q_{\Omega^{2+}} = \emptyset, portanto:

QΩ=QΩ1QΩ1={qt$,qtA,qtB,qtC} Q_\Omega = Q_{\Omega^1}\\ Q_{\Omega^1} = \{ q_{t_$}, q_{t_A}, q_{t_B}, q_{t_C} \}

Também temos que:

ΓΓ={$,A,B,C}ΓQ={τ(q0),τ(qa),τ(qb),τ(qc)}QQ={χ(q0),χ(qa),χ(qb),χ(qc)} \Gamma_\Gamma = \{$, A, B, C\}\\ \Gamma_Q = \{\tau(q_0), \tau(q_a), \tau(q_b), \tau(q_c)\}\\ Q_Q = \{\chi(q_0), \chi(q_a), \chi(q_b), \chi(q_c)\}

Portanto, temos o seguinte a cerca dos estados e símbolos da máquina de Turing:

Q={qg,qf,qi,qt$,qtA,qtB,qtC,χ(q0),χ(qa),χ(qb),χ(qc)}qg eˊ o estado inicialF={qf}ΣMT={A,B,C}b eˊ o sıˊmbolo vazio da fitaΓMT={$,A,B,C,τ(q0),τ(qa),τ(qb),τ(qc),b} Q = \{ q_g, q_f, q_i, q_{t_$}, q_{t_A}, q_{t_B}, q_{t_C}, \chi(q_0), \chi(q_a), \chi(q_b), \chi(q_c) \}\\ q_g\ \text{é o estado inicial}\\ F = \{q_f\}\\ \Sigma_{MT} = \{A, B, C\}\\ b\ \text{é o símbolo vazio da fita}\\ \Gamma_{MT} = \{ $, A, B, C, \tau(q_0), \tau(q_a), \tau(q_b), \tau(q_c), b \}

Faltando definir, portanto, apenas as transições. Temos as seguintes fornecidas pelo estado de rebobinar, estado inicial e avanços dos estados qω∈QΩq_\omega \in Q_\Omega antes de inserir na fita os estados:

(qg,A)↦(qg,A,⇐)(qg,B)↦(qg,B,⇐)(qg,C)↦(qg,C,⇐)(qg,b)↦(qt$,τ(q0),⇒)(qi,$)↦(qi,$,⇐)(qi,A)↦(qi,A,⇐)(qi,B)↦(qi,B,⇐)(qi,C)↦(qi,C,⇐)(qt$,A)↦(qt$,A,⇒)(qtA,A)↦(qtA,A,⇒)(qtB,A)↦(qtB,A,⇒)(qtC,A)↦(qtC,A,⇒)(qt$,B)↦(qt$,B,⇒)(qtA,B)↦(qtA,B,⇒)(qtB,B)↦(qtB,B,⇒)(qtC,B)↦(qtC,B,⇒)(qt$,C)↦(qt$,C,⇒)(qtA,C)↦(qtA,C,⇒)(qtB,C)↦(qtB,C,⇒)(qtC,C)↦(qtC,C,⇒)(qt$,$)↦(qt$,$,⇒)(qtA,$)↦(qtA,$,⇒)(qtB,$)↦(qtB,$,⇒)(qtC,$)↦(qtC,$,⇒) \begin{array}{lcl} (q_g, A)&\mapsto&(q_g, A, \Leftarrow)\\ (q_g, B)&\mapsto&(q_g, B, \Leftarrow)\\ (q_g, C)&\mapsto&(q_g, C, \Leftarrow)\\ (q_g, b)&\mapsto&(q_{t_$}, \tau(q_0), \Rightarrow)\\ (q_i, $)&\mapsto&(q_i, $, \Leftarrow)\\ (q_i, A)&\mapsto&(q_i, A, \Leftarrow)\\ (q_i, B)&\mapsto&(q_i, B, \Leftarrow)\\ (q_i, C)&\mapsto&(q_i, C, \Leftarrow)\\ (q_{t_$}, A)&\mapsto&(q_{t_$}, A, \Rightarrow)\\ (q_{t_A}, A)&\mapsto&(q_{t_A}, A, \Rightarrow)\\ (q_{t_B}, A)&\mapsto&(q_{t_B}, A, \Rightarrow)\\ (q_{t_C}, A)&\mapsto&(q_{t_C}, A, \Rightarrow)\\ (q_{t_$}, B)&\mapsto&(q_{t_$}, B, \Rightarrow)\\ (q_{t_A}, B)&\mapsto&(q_{t_A}, B, \Rightarrow)\\ (q_{t_B}, B)&\mapsto&(q_{t_B}, B, \Rightarrow)\\ (q_{t_C}, B)&\mapsto&(q_{t_C}, B, \Rightarrow)\\ (q_{t_$}, C)&\mapsto&(q_{t_$}, C, \Rightarrow)\\ (q_{t_A}, C)&\mapsto&(q_{t_A}, C, \Rightarrow)\\ (q_{t_B}, C)&\mapsto&(q_{t_B}, C, \Rightarrow)\\ (q_{t_C}, C)&\mapsto&(q_{t_C}, C, \Rightarrow)\\ (q_{t_$}, $)&\mapsto&(q_{t_$}, $, \Rightarrow)\\ (q_{t_A}, $)&\mapsto&(q_{t_A}, $, \Rightarrow)\\ (q_{t_B}, $)&\mapsto&(q_{t_B}, $, \Rightarrow)\\ (q_{t_C}, $)&\mapsto&(q_{t_C}, $, \Rightarrow)\\ \end{array}

Das transições dos estados qω∈QΩq_\omega \in Q_\Omega colocando os símbolos no final da fila:

(qt$,b)↦(qi,$,⇐)(qtA,b)↦(qi,A,⇐)(qtB,b)↦(qi,B,⇐)(qtC,b)↦(qi,C,⇐) \begin{array}{lcl} (q_{t_$}, b)&\mapsto&(q_i, $, \Leftarrow)\\ (q_{t_A}, b)&\mapsto&(q_i, A, \Leftarrow)\\ (q_{t_B}, b)&\mapsto&(q_i, B, \Leftarrow)\\ (q_{t_C}, b)&\mapsto&(q_i, C, \Leftarrow)\\ \end{array}

Das transições vindos do final do rebobinar, recuperando o estado em ΓQ\Gamma_Q:

(qi,τ(q0))↦(χ(q0),b,⇒)(qi,τ(qa))↦(χ(qa),b,⇒)(qi,τ(qb))↦(χ(qb),b,⇒)(qi,τ(qc))↦(χ(qc),b,⇒) \begin{array}{lcl} (q_i, \tau(q_0))&\mapsto&(\chi(q_0), b, \Rightarrow)\\ (q_i, \tau(q_a))&\mapsto&(\chi(q_a), b, \Rightarrow)\\ (q_i, \tau(q_b))&\mapsto&(\chi(q_b), b, \Rightarrow)\\ (q_i, \tau(q_c))&\mapsto&(\chi(q_c), b, \Rightarrow)\\ \end{array}

Das transições disponíveis no autômato de fila:

(χ(q0),$)↦(χ(q0),b,⇒)(χ(q0),A)↦(χ(qa),b,⇒)(χ(qa),B)↦(χ(qb),b,⇒)(χ(qb),C)↦(χ(qc),b,⇒)(χ(qa),A)↦(qtA,τ(qa),⇒)(χ(qb),B)↦(qtB,τ(qb),⇒)(χ(qc),C)↦(qtC,τ(qc),⇒)(χ(qc),$)↦(qt$,τ(q0),⇒) \begin{array}{lcl} (\chi(q_0), $)&\mapsto&(\chi(q_0), b, \Rightarrow)\\ (\chi(q_0), A)&\mapsto&(\chi(q_a), b, \Rightarrow)\\ (\chi(q_a), B)&\mapsto&(\chi(q_b), b, \Rightarrow)\\ (\chi(q_b), C)&\mapsto&(\chi(q_c), b, \Rightarrow)\\ (\chi(q_a), A)&\mapsto&(q_{t_A}, \tau(q_a), \Rightarrow)\\ (\chi(q_b), B)&\mapsto&(q_{t_B}, \tau(q_b), \Rightarrow)\\ (\chi(q_c), C)&\mapsto&(q_{t_C}, \tau(q_c), \Rightarrow)\\ (\chi(q_c), $)&\mapsto&(q_{t_$}, \tau(q_0), \Rightarrow)\\ \end{array}

Das transições terminadoras, que levam a qfq_f:

(χ(q0),b)↦(qf,b,⇒)(χ(qa),b)↦(qf,b,⇒)(χ(qb),b)↦(qf,b,⇒)(χ(qc),b)↦(qf,b,⇒) \begin{array}{lcl} (\chi(q_0), b)&\mapsto&(q_f, b, \Rightarrow)\\ (\chi(q_a), b)&\mapsto&(q_f, b, \Rightarrow)\\ (\chi(q_b), b)&\mapsto&(q_f, b, \Rightarrow)\\ (\chi(q_c), b)&\mapsto&(q_f, b, \Rightarrow)\\ \end{array}

Assim, conseguimos escrever uma Máquina de Turing que consegue simular o comportamento de um autômato de fila.

Eis a execução para o reconhecimento de AAABBBCCCAAABBBCCC:

aqui, estou usando 0 para representar τ(q0)\tau(q_0), a para representar τ(qa)\tau(q_a), b para representar τ(qb)\tau(q_b), c para representar τ(qc)\tau(q_c) na fita. Estados do tipo χ(qx)\chi(q_x) são representados simplesmente como qxqx.

Máquina de Turing emulando o comportamento de um autômato de fila reconhecendo a palavra AAABBBCCC


Com isso, terminamos a primeira parte desta demonstração. O próximo passo é provar que podemos usar autômatos de fila para rodar máquinas de Turing, não importa o quão complicadas elas sejam.