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.