Al college abbiamo imparato la teoria del calcolo in generale e le macchine di Turing in modo più specifico. Uno dei grandi risultati teorici è che al costo di un alfabeto (simboli) potenzialmente grande, è possibile ridurre il numero di stati fino a solo 2.
Stavo cercando esempi di diverse macchine di Turing e un esempio comune presentato è il matcher / correttore parentesi. In sostanza controlla se una stringa di parentesi, ad esempio (()()()))()()()
è bilanciata (l'esempio precedente restituisce 0 per sbilanciato).
Prova come posso Posso solo ottenere questo per essere una macchina a tre stati. Mi piacerebbe sapere se qualcuno può ridurre questo al minimo teorico di 2 e qual è stato il loro approccio / stati / simboli!
Giusto per chiarire, le parentesi sono "inserite" tra un nastro vuoto, quindi nell'esempio sopra
- - - - - - - (()()()))()()() - - - - - - -
sarebbe l'input sul nastro. L'alfabeto includerebbe (
, )
, 1
, 0
, -
, e lo *halt*
Stato non conta come uno stato.
Per riferimento l'approccio a tre stati che ho è il seguente: Descrizione degli stati:
State s1: Looks for Closing parenthesis
State s2: Looks for Open parenthesis
State s3: Checks the tape to ensure everything is matched
Symbols: ),(,X
Transizioni elencate come:
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 -
Perdona il modo informale di scrivere tutto questo. Sto ancora imparando i costrutti teorici dietro questo.