Prova semplice per le lingue senza contesto chiuse in turni ciclici


11

Lo spostamento ciclico (chiamato anche rotazione o coniugazione ) di una lingua è definito come . Secondo Wikipedia (e qui ) le lingue senza contesto sono chiuse sotto questa operazione, con riferimenti a documenti di Oshiba e di Maslov. C'è una facile prova di questo fatto?L{yx∣xy∈L}

Per le lingue normali la chiusura è discussa in questo modulo come " Dimostrare che le lingue regolari sono chiuse sotto l'operatore del ciclo ".

Risposte:


5

Puoi provare a utilizzare gli automi pushdown. Dato un automa pushdown per la lingua originale, ne costruiamo uno per il turno ciclico. Il nuovo automa funziona in due fasi, corrispondenti alla e parte della parola (dove è nella lingua originale). Nel primo stadio, ogni volta che l'automa vorrebbe far scoppiare un non terminale , può invece spingere un non terminale ; l'idea è che alla fine del primo stadio, lo stack contenga, in ordine inverso, i simboli che si trovano nello stack dopo aver letto dall'automa originale. Nel secondo stadio (l'interruttore non è deterministico), invece di spingere un non terminaleyxyxxyAA′xA ′ xA, C'è permesso di pop un non terminale . Se l'automa originale può effettivamente generare lo stack dopo aver letto , allora quello nuovo sarebbe in grado di far apparire esattamente l'intero stack.A′x

Modifica: ecco alcuni dettagli. Supponiamo di avere un PDA con alfabeto , insieme di stati , insieme di stati accettanti , non terminali , stato iniziale e un insieme di transizioni consentite. Ogni transizione consentita ha la forma , il che significa che quando si trova nello stato , dopo aver letto (o , nel qual caso si tratta di una transizione libera), se la parte superiore dello stack è (o , il che significa che lo stack è vuoto), il PDA può (è un modello non deterministico) passare allo stato , sostituendoQ F Γ q 0 ( q , a , A , q ′ , α ) q a ∈ A a = ϵ A ∈ Γ A = ϵ q ′ A α ∈ Γ ∗ΣQFΓq0(q,a,A,q′,α)qa∈Aa=ϵA∈ΓA=ϵq′A con .α∈Γ∗

Il nuovo PDA ha un nuovo non terminale per ogni . Per ogni due stati e , ci sono due stati . Gli stati iniziali (lo stato iniziale effettivo viene scelto in modo non deterministico tra loro tramite -transitions) sono . Per ogni transizione ci sono transizioni corrispondenti e . Ci sono anche altre transizioni.A′A∈Γq,q′∈QA∈Γ∪{ϵ}(q,q′,1),(q,q′,2,A)ϵ(q,q,1)(q,a,A,q′,α)( ( q , q ″ , 2 , B ) , a , A , ( q ′ , q ″ , 2 , B ) , α )((q,q″,1),a,A,(q′,q″,1),α)((q,q″,2,B),a,A,(q′,q″,2,B),α)

Per ogni transizione , ci sono transizioni , dove e . Per ogni stato finale , ci sono transizioni , dove .( ( q , q ″ , 1 ) , a , B ′ , ( q ′ , q ″ , 1 ) , B ′ A ′ α ) B ∈ Γ ∪ { ϵ }(q,a,A,q′,α)((q,q″,1),a,B′,(q′,q″,1),B′A′α)B∈Γ∪{ϵ}q ∈ F ( ( q , q ″ , 1 ) , ϵ , A , ( q 0 , q ″ , 2 , ϵ ) , A ) A ∈ Γ ∪ { ϵ }ϵ′=ϵq∈F((q,q″,1),ϵ,A,(q0,q″,2,ϵ),A)A∈Γ∪{ϵ}

Per ogni transizione , ci sono transizioni , dove . Per ogni transizione , ci sono transizioni , dove . Per ogni transizione , esistono "transizioni generalizzate" ; questi sono implementati come una sequenza di due transizioni attraverso un nuovo stato intermedio. Transizioni\ alpha) con( ( q , q ″ , 2 , A ) , a , B ′ , ( q ′ , q ″ , 2 , A ) , B ′ α ) A ∈ Γ ∪ { ϵ } ( q , a , ϵ , q ′(q,a,ϵ,q′,α)((q,q″,2,A),a,B′,(q′,q″,2,A),B′α)A∈Γ∪{ϵ}( ( q , q ″ , 2 , B ) , a , A ′ , ( q ′ , q ″ , 2 , A ) , ϵ ) B ∈ Γ ∪ { ϵ } ( q , a , A , q ′ , B ) ( ( q , q ″ , 2(q,a,ϵ,q′,A)((q,q″,2,B),a,A′,(q′,q″,2,A),ϵ)B∈Γ∪{ϵ}(q,a,A,q′,B)( q , a , ϵ , q ′ , α ) | α | ≥ 2 ( q , a , A , q ′ , A ) ( ( q , q ″ , 2 ,((q,q″,2,C),a,B′A,(q,q″,2,C),ϵ)(q,a,ϵ,q′,α)|α|≥2sono gestiti in modo simile. Per ogni transizione , ci sono transizioni , dove . Le transizioni sono gestite in modo simile. Infine, esiste un unico stato finale e transizioni .(q,a,A,q′,A)B ∈ Γ ′ ∪ { ϵ } ( q , a , A , q ′ , A α ) f ( ( q , q , 2 , A ) , ϵ , ϵ , f , ϵ((q,q″,2,A),a,B,(q′,q″,2,A),B)B∈Γ′∪{ϵ}(q,a,A,q′,Aα)f((q,q,2,A),ϵ,ϵ,f,ϵ)

(Potrebbero esserci alcune transizioni che ho perso, e alcuni dei dettagli che sto omettendo sono in qualche modo disordinati.)

Ricordiamo che stiamo cercando di accettare una parola , dove è accettato dal PDA originale. Uno stato significa che siamo allo stadio 1, allo stato , e il PDA originale è allo stato dopo aver letto . Uno stato è simile, dove corrisponde all'ultima che è stata spuntata. Nella fase 1, siamo autorizzati a spingere invece di popping . Lo facciamo per ogni non terminale che viene prodotto durante l'elaborazione di , ma viene visualizzato solo durante l'elaborazione di . Nella fase 2, siamo autorizzati a far scoppiarex y ( q , q ′ , 1 ) q q ′ x ( q , q ′ , 2 , A ) A A ′ A ′ A x y A ′ A A ϵ B ′yxxy(q,q′,1)qq′x(q,q′,2,A)AA′A′AxyA′invece di spingere . Se lo facciamo, dobbiamo ricordare che la parte superiore del magazzino è davvero ; questo vale solo quando non ci sono cose "temporanee" nello stack, che nel PDA simulato è lo stesso del top-of-stack che è o del modulo .AAϵB′

Qui c'è un semplice esempio. Considera un automa per che spinge per ogni e fa apparire per ogni . Il nuovo automa accetta parole di due forme: e . Per parole del primo modulo, fase 1 consiste nello spingere volte'fase 2 consiste di popping volte , spingendo volte , e iniziano volte . Per le parole della seconda forma, per prima cosa premiamo volte A x A y y k x n y n - k x k y n x n - k k A ′ k A ′ n - k A n - k A k A k A n - k A ′ n - k A ′xnynAxAyykxnyn−kxkynxn−kkA′kA′n−kAn−kAkA, quindi pop volte , push volte , passaggio allo stadio 2 e pop volte .kAn−kA′n−kA′

Ecco un esempio più complicato, per il linguaggio delle parentesi bilanciate di vari tipi ("()", "[]", "<>") in modo tale che i discendenti immediati di ciascun tipo di parentesi debbano appartenere a un tipo diverso. Ad esempio, "([] <>)" è OK ma "()" è errato. Per ogni "(", spingiamo se lo stack top-of-non è , per ogni ")", abbiamo pop . Allo stesso modo , sono associati a "[]" e "<>". Ecco come accettiamo la parola ">) ([()] <". ">)", spingendo e alla fase 2. "(", saltandoe ricordando la parte superiore dello stack . Consumiamo "[()]", spingendo e facendo scoppiare ; quando si spingeA A B C C ′ A ′ A ′ A B A B A A B ϵ X ′ B A C ′A AABCC′A′A′ABAB , siamo consapevoli che il "vero" top-of-stack è , e quindi le parentesi quadre sono consentite (non saremmo ingannati da ">) (() <"); quando si preme , poiché il top-of-stack è (che non è o del modulo ), allora sappiamo che è anche il "vero" top-of-stack, e quindi sono consentite parentesi tonde (anche se l'ombra top-of-stack è ). Infine, consumiamo "<" e pop .AABϵX′BAC′


Mi dispiace, ho difficoltà a capire - puoi spiegare ulteriormente? Dove inizia l'automa e quali sono le sue transizioni? E il passaggio da verifica per ogni simbolo dello stack? Grazie! A→A′
— usul

Suggerimento molto interessante. Grazie. Lo masticherò un po 'per lasciarlo affondare.
— Hendrik

@usul, dovrai compilare tu stesso i dettagli. Il passaggio (nella prima fase) dovrebbe avvenire quando l'automa "vuole" far scoppiare ma non può, e invece spinge . Puoi pensarlo come una mossa non deterministica. A A ′A→A′AA′
— Yuval Filmus,

@Yuval: scusa ma non posso farlo accadere. Quando capisco la tua idea, il nuovo automa inizia simulando la parte , cambiando pop e push. Quindi genera nello stack, dove l'automa originale inizia con quando legge . Qual è l'originale inizia spingendo? Quindi l'automa nuovo deve spuntare dallo stack vuoto. Continuo a pensare che la tua intuizione sia utile, ma sembra necessaria una cura in più. α α yyααy
— Hendrik Jan

@Hendrik, mi dispiace, ma non riesco a seguire il tuo controesempio. A che punto pensi che il nuovo automa debba saltar fuori dallo stack vuoto?
— Yuval Filmus,

4

Considera Greibach in forma normale . Per costruire una lingua spostata devi solo cambiare le produzioni da a e aggiungere una nuova non terminale che si comporta come , nel caso in cui alcune produzione riferimento . S → A 1 … A n α S ′ S SS→αA1…AnS→A1…AnαS′SS


Grazie, ma questo è spostato da una sola lettera. Sono interessato alla rotazione generale, con un numero arbitrario di lettere.
— Hendrik Jan

3
@HendrikJan, Beh, se è privo di contesto, quindi sarà sicuramente privo di contesto. Puoi costruire una grammatica per questo applicando il metodo che ho suggerito volte. Puoi anche costruire direttamente la grammatica , "appiattendo" la grammatica data Ad esempio, se e la grammatica ha produzioni da e da , aggiungerei una produzione e ruotarla. Naturalmente, la dimensione di la tua grammatica potrebbe crescere molto rapidamenteMAIUSC n ( L ) = MAIUSC 1 ( MAIUSC 1 ( … ( L ) … ) n MAIUSC n ( L ) n = 2 S → α A B A → β C S → α β C Bshift1(L)shiftn(L)=shift1(shift1(…(L)…)nshiftn(L)n=2S→αABA→βCS→αβCB
— Karolis Juodelė

1
Per fisso hai ragione. Ma qui è fisso o limitato. Ad esempio se allora otteniamo . n L = { a n b n ∣ n ≥ 0 } { a k b n a ℓ ∣ k + ℓ = n } ∪ { b k a n b ℓ ∣ k + ℓ = n }nnL={anbn∣n≥0}{akbnaℓ∣k+ℓ=n}∪{bkanbℓ∣k+ℓ=n}
— Hendrik Jan

@HendrikJan, capisco. Ho erroneamente supposto che la domanda riguardasse un cambiamento finito. Riconsidererò la mia risposta ...
— Karolis Juodelė

4

Si è rivelata una buona idea controllare il vecchio classico di Hopcroft e Ullman Introduction to Automata Theory (1979). La chiusura sotto ciclo è Esercizio 6.4c ed è contrassegnata con S **. Le doppie stelle indicano che è uno dei problemi più difficili (nel libro). Fortunatamente la S indica che è uno dei problemi selezionati con una soluzione.

La soluzione è la seguente. Prendi un CFG in forma normale di Chomsky. Considera qualsiasi albero di derivazione e sostanzialmente capovolgilo. Considera un percorso nella struttura originale. A sinistra l'albero ha contributi a destra , il che significa che la stringa derivata è uguale a . (In realtà poiché la grammatica è CNF quando il percorso continua a sinistra, il contributo sarà a destra e il corrispondente è vuoto, ecc.)S=X1,X2,…,Xnx1,x2,…,xny1,y2,…,ynx1x2…xnyn…y2y1xi

L'albero sottosopra ha un percorso con contributi a sinistra e a destra, quindi il risultato è una derivazione per . Come richiesto.y n , ... , y 2 y 1 x n , ... , x 2 x 1 y n ... y 2 y 1 x 1 x 2 ... x nS′,X^n,…X^2,X^1yn,…,y2y1xn,…,x2x1yn…y2y1x1x2…xn

I dettagli completi della costruzione sono riportati nel libro.

Nota come questo ricorda la soluzione (accettata) di Yuval. I non terminali che vengono spinti anziché spuntati sono nell'ordine opposto nella pila. Abbastanza simile a capovolto nell'albero.

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.