Macchina di Turing a due stati per l'abbinamento delle parentesi


9

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.


Ci è permesso usare un alfabeto più grande?
Raffaello

@Raphael Secondo il risultato teorico, si possono scambiare stati con alfabeto e viceversa. Quindi ridurre gli stati a due significa che molto probabilmente dovrai usare un alfabeto più grande. Quindi sì, la risposta breve è L'alfabeto può essere grande quanto desiderato
Four_FUN

Penso che in una TM a due nastri, questo può essere fatto senza simboli aggiuntivi e.
Karolis Juodelė,

@Four_FUN sei del MIT?

Risposte:


8

Solo un compendio del "codice sorgente" della risposta di Raffaello: questa è una versione funzionante che usa lo stesso trucco (sullo stato q1) e ha un alfabeto a nastro:
_ ( ) [ { / \ (dove è il simbolo vuoto iniziale)_

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

Puoi vederlo al lavoro usando un simulatore online di Turing machine ; il codice sorgente è:

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

Un'ultima nota: se vuoi vedere come questa tecnica può essere spinta al limite, leggi (e cerca di capire :-) la costruzione della macchina Universal Turing con 2 stati e 18 simboli di Y. Rogozhin in "Piccola Universal Turing macchine"


Non abbiamo deciso che le risposte che presentano solo il codice sorgente non vanno bene per l' Informatica ? ;)
Raffaello

1
@Raphael: sono d'accordo con te, ma il mio può essere visto proprio come un addendum al tuo (sembra perfetto, anche se non ho controllato i dettagli). Aggiungerò una nota a riguardo.
Vor

1
@Raphael: l'ho codificato solo per divertimento, cercando di minimizzare i simboli del nastro, e "sembra" :-) per funzionare, quindi ho deciso di pubblicarlo.
Vor

@Vor. Grazie mille per il tuo ulteriore contributo in questo problema. Tutto ciò mi dice che ho bisogno di più pratica in queste cose. Grazie per aver pubblicato il codice sorgente, anche se la teoria era ciò che cercavo.
Four_FUN

1
@Four_FUN: la Rogozhin Universal TM (2,18) è una macchina Turing standard (ovvero, a parte l'ingresso, il suo nastro iniziale contiene solo simboli vuoti) che simula un sistema arbitrario a 2 tag (che è un modello universale). Il simbolo 2 stato 3 è una macchina di Turing debolmente (il nastro iniziale deve essere riempito con una sequenza infinita di un modello) e l'universalità viene "raggiunta" simulando gli automi cellulari Regola 110 (che è stata dimostrata essere Turing completa ). Esiste una prova (dichiarata?) Che un TM standard (2,3) non può essere completo di Turing.
Vor

7

Risposta stupida: il tuo risultato promette che esiste una macchina di Turing universale con due stati. Costruisci qualsiasi TM per il linguaggio Dyck, calcola il suo indice e codificalo nella macchina universale.

{#,(,),X}un'^un'

  • Lo stato iniziale funziona come segue.q0

    Quando si trovano simboli non contrassegnati, spostarsi a destra fino alla prima . Nel fare ciò, sovrascrivi tutti i simboli con . Sovrascrivi il trovato con . Se non ce n'è , ovvero premiamo il simbolo gap , lo sovrascriviamo con e a .)un'un'^)X^
    )#X^q1

    Quando trovi i simboli contrassegnati, sposta a sinistra finché non viene trovato il primo , sovrascrivendo tutti i simboli passati (contrassegnati) con le loro varianti non contrassegnate. Sovrascrivi il trovato con . Se troviamo un o first, esegui il ciclo / rifiuta¹.(^(^X
    )^#

  • In , controlliamo che tutto sia stato abbinato; potrebbero esserci ancora dei prefissi della forma sul nastro. Cioè, spostati a sinistra finché troviamo . Se così troviamo , accetta; se troviamo qualche altro simbolo ma prima , ciclo / rifiuto.q1(^+X^#X^


  1. Questo è corretto poiché la macchina si abbina al rovescio; in un input legale, ci sono solo tra la coppia di parentesi attualmente abbinate.X

Se non ti dispiace chiederti, come fa esattamente la mia soluzione a promettere una TM universale con due stati? (soluzione molto intelligente tra l'altro. Grazie per il tuo contributo)
Four_FUN

1
@Four_FUN: perché dici nella tua domanda: "... Uno dei grandi risultati teorici è che al costo di un alfabeto (simboli) potenzialmente grande, puoi ridurre il numero di stati fino a solo 2 ..." . .. quindi puoi anche scegliere una macchina Universal Turing arbitraria e ridurre il numero di stati a solo 2. E se fai alcuni esperimenti ti accorgerai anche che non è difficile fare una procedura automatica che converta una TM arbitraria in equivalente 2 indica TM (se non ti interessa minimizzare il numero di simboli alfabetici).
Vor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.