Máquina de Turing de dois estados para correspondência entre parênteses

9

Na faculdade, aprendemos mais sobre a teoria da computação em geral e sobre as máquinas de Turing. Um dos grandes resultados teóricos é que, ao custo de um alfabeto potencialmente grande (símbolos), você pode reduzir o número de estados para apenas 2.

Eu estava procurando exemplos de diferentes máquinas de Turing e um exemplo comum apresentado é o parênteses / verificador. Essencialmente, ele verifica se uma série de parênteses, por exemplo, (()()()))()()()está equilibrada (o exemplo anterior retornaria 0 para desequilibrado).

Por mais que eu tente, só consigo que isso seja uma máquina de três estados. Gostaria muito de saber se alguém pode reduzir isso para o mínimo teórico de 2 e qual foi a sua abordagem / estados / símbolos!

Apenas para esclarecer, os parênteses são "imprensados" entre a fita em branco; portanto, no exemplo acima, - - - - - - - (()()()))()()() - - - - - - -seria a entrada na fita. O alfabeto incluiria (, ), 1, 0, -, eo *halt*estado não conta como um estado.

Para referência, a abordagem de três estados que possuo é a seguinte: Descrição dos estados:

 State s1: Looks for Closing parenthesis

 State s2: Looks for Open parenthesis

 State s3: Checks the tape to ensure everything is matched

 Symbols: ),(,X

Transições Listadas como:

Action: State Symbol NewState WriteSymbol Motion
// Termination behavior
Action: s2 - *halt* 0  -
Action: s1 -  s3    -  r

//Transitions of TM
Action: s1 (  s1  (   l
Action: s1 )  s2  X  r
Action: s1 X  s1  X  l
Action: s2 ( s1 X  l
Action: s2 X  s2 X r
Action: s3 (  *halt* 0 -
Action: s3 X  s3     X r
Action: s3 -  *halt* 1 -

Perdoe a maneira informal de escrever tudo isso. Ainda estou aprendendo as construções teóricas por trás disso.

Quatro divertidas
fonte
Podemos usar um alfabeto maior?
Raphael
@ Rafael De acordo com o resultado teórico, pode-se trocar estados por alfabeto e vice-versa. Portanto, reduzir os estados para dois significa que você provavelmente precisará usar um alfabeto maior. Então, sim, a resposta curta é o alfabeto pode ser tão grande quanto desejado
Four_FUN
Eu acho que, em uma fita dupla TM, isso pode ser feito sem símbolos extras e.
usar o seguinte código
@Four_FUN você é do MIT?

Respostas:

8

Apenas um compêndio de "código-fonte" da resposta de Raphael: esta é uma versão funcional que usa o mesmo truque (no estado q1) e tem um alfabeto de fita:
_ ( ) [ { / \ (onde é o símbolo em branco inicial)_

q0:  _ -> accept  // accept on empty string and on balanced parenthesis
     ( -> {,R,q1  // mark the first open "(" with "{" and goto q1
     ) -> reject  // reject if found unbalanced ")"
     \ -> /,L,q0  // go left
     / -> \,R,q0  // go right

q1:  ( -> [,R,q1  // replace "(" with "[" and continue ...
     ) -> /,L,q1  // ... until first ")", replace it with "/" and goto left
     [ -> \,R,q1  // found matching "(" bracket, goto right and search for another ")"
     _ -> reject  // no ")" found for the first "{", reject
     { -> \,R,q0  // this must be the last match, goto q0 and check if it is true
     \ -> /,L,q1  // go left
     / -> \,R,q1  // go right

Você pode vê-lo trabalhando usando um simulador on-line da máquina de Turing ; o código fonte é:

0 _ Y r halt
0 ( { r 1
0 ) N r halt
0 \ / l 0
0 / \ r 0
1 ( [ r 1
1 ) / l 1
1 [ \ r 1
1 _ N r halt
1 { \ r 0
1 \ / l 1
1 / \ r 1

Uma observação final: se você quiser ver como essa técnica pode ser levada ao limite, leia (e tente entender :-) a construção da máquina Universal Turing com 2 estados e 18 símbolos de Y. Rogozhin em "Small Universal Turing máquinas "

Vor
fonte
Não decidimos que respostas que apresentam apenas código-fonte não são boas para a Ciência da Computação ? ;)
Raphael
11
@ Rafael: Eu concordo com você, mas o meu pode ser visto como um adendo ao seu (isso parece bom, mesmo que eu não tenha verificado os detalhes). Vou adicionar uma observação sobre isso.
Vor
11
@ Rafael: Eu o codifiquei apenas por diversão, tentando minimizar os símbolos da fita, e "parece" :-) funcionar, então decidi publicá-la.
Vor
@Vor. Muito obrigado pela sua contribuição adicional para este problema. Tudo isso me diz que eu preciso de mais prática nessas coisas. Obrigado por postar seu código-fonte, no entanto, mesmo que a teoria fosse o que eu procurava.
Four_FUN
11
@Four_FUN: o Rogozhin Universal TM (2,18) é uma máquina de Turing padrão (ou seja, além da entrada, sua fita inicial contém apenas símbolos em branco) que simula um sistema arbitrário de 2 marcas (que é um modelo universal). O símbolo de 2 estados 3 é uma máquina de Turing fracamente (a fita inicial precisa ser preenchida com uma sequência infinita de um padrão), e a universalidade é "alcançada" simulando a regra 110 dos autômatos celulares (que foi provado que Turing está completo) ) Existe uma prova (reivindicada?) De que uma TM padrão (2,3) não pode ser concluída por Turing.
Vor
7

Resposta idiota: seu resultado promete que existe uma máquina de Turing universal com dois estados. Construa qualquer TM para a linguagem Dyck, calcule seu índice e codifique-o na máquina universal.

{#,(,),x}a^a

  • q0

    )aa^)x^
    )#x^q1

    (^(^x
    )^#

  • q1(^+x^#x^


  1. x
Rafael
fonte
Se você não se importa de me perguntar, como exatamente a minha solução promete uma TM universal com dois estados? (solução muito inteligente btw Thnak por sua entrada.)
Four_FUN
11
@Four_FUN: porque você diz na sua pergunta: "... Um dos grandes resultados teóricos é que, à custa de um alfabeto potencialmente grande (símbolos), você pode reduzir o número de estados para apenas 2 ..." . .. para que você também possa escolher uma máquina universal de Turing arbitrária e reduzir o número de estados para apenas 2. E se você fizer algumas experiências, também perceberá que não é difícil fazer um procedimento automático que converta uma TM arbitrária em uma equivalente 2 state TM (se você não se importa com a minimização do número de símbolos do alfabeto).
Vor