Grammatica sensibile al contesto per il linguaggio delle parole concatenate con se stesse


9

Sto cercando una grammatica sensibile al contesto che descriva la seguente lingua: .L={www{a,b},|w|1}

Ho dei problemi con il fatto che non sono permesse regole come e quindi non posso inserire alcun termine non intermedio che indichi il "centro" della parola. C'è qualche trucco per il problema?Xε


1
Risposta noiosa: formulare un LBA e applicare la simulazione utilizzata per dimostrare che gli LBA e le grammatiche sensibili al contesto sono ugualmente potenti.
Raffaello

Risposte:


6

In effetti, esiste un semplice trucco che consente di aggiungere ulteriori informazioni in una determinata posizione: basta sostituire una lettera adiacente alla posizione e contrassegnarla con le informazioni e la lettera originale.

Nel tuo esempio, usa una non intermedia per il centro, ma poiché non può essere eliminata, conta anche come una normale lettera. Quindi abbiamo due copie M a e M b per indicare le lettere sostituite. Alla fine della derivazione i marcatori dovrebbero essere sostituiti dal loro contenuto in lettere, da semplici produzioni come M aa .MMaMbMaa

Nella maggior parte dei casi, l'applicazione di deve essere eseguita al termine del processo di derivazione. In alcune costruzioni questo non deve essere "cronometrato": quando la M scompare troppo presto, la derivazione non riesce a trovare una posizione corretta e il processo non si fermerà con successo. In altri casi è necessario un tipo di controllo. Questo a volte viene fatto introducendo un non terminale come segnale che si sposta lungo le lettere. Ancora una volta, questo segnale dovrebbe contenere anche un terminale, altrimenti si verificano gli stessi problemi.MaaM

Muoversi informazioni intorno è facile nelle cosiddette grammatiche monotone ( di | alfa |ß | ) utilizzando le regole come X A A X , che può essere visto come X che salta sopra A . Per una corretta grammatica sensibile al contesto, è necessario dividerlo in tre passaggi: X A X A X , X A XA A X , A A XA Xαβ|α|β|XAAXXAXAXAX,XAXAAX,AAXAX. in ogni produzione una lettera viene cambiata in un contesto appropriato. Ci vuole un po 'di immaginazione per vedere che questo processo non interagisce con altre parti della derivazione. Ad esempio, cosa succede quando la nell'ultimo passaggio viene coinvolta per la prima volta in un altro passaggio di derivazione?A

Questo potrebbe non funzionare per parole molto brevi, quando sono disponibili più informazioni rispetto alle posizioni disponibili. La soluzione più semplice è ignorare stringhe brevi nella tua costruzione e generarle separatamente.


Non sarebbe necessario che la produzione fosse esaminata in un certo ordine in modo che Ma → a non venisse usato prima di riordinare i non terminali fino alla fine? Oppure mi sfugge qualcosa?
MrBolton,

Ho aggiunto una nota a quello nella mia risposta. In alcune soluzioni l'applicazione di tale produzione troppo presto si tradurrà in un modulo sentenziale che non può essere completato con successo. In altri casi le produzioni devono essere accuratamente sincronizzate. Una questione di buon senso e tentativi ed errori.
Hendrik Jan

1

Risposta predefinita breve: elaborare un LBA che accetta la lingua e utilizzare la simulazione utilizzata per dimostrare che le grammatiche e l'LBA sensibili al contesto definiscono lo stesso insieme di lingue. Ma ovviamente non è quello che stai cercando.

Σ

Questo può essere fatto scambiando un token di controllo. Vale a dire, la grammatica di sinistra seleziona una regola, genera il token di controllo di adattamento e lo passa alla grammatica di destra. La grammatica corretta vede il token di controllo ed esegue la regola di adattamento. Nota che puoi anche implementare la comunicazione bidirezionale in questo modo, ma qui non è necessario.

Sε

Un modo per raggiungere questo obiettivo è usare lo stesso trucco di alcune prove sull'LBA: generare tutti i non terminali necessari prima , ovvero preparare il "nastro". Più tardi, "muoviti" su quel nastro. Solo "alla fine", sostituire tutti i non terminali con terminali.

G=(N,Σ,δ,S)Σ={a,b}Nδ

SX^lSXraaaaababbababbbbaabbεSXlSXrXlX^r

l,r

X^lXlXγX^lγX^lXαXγXαγ

(α,γ)Σ2XaXb

XlXα

X^lγXlX^lXlγX^lγXαX^lXαγXlγXlXlXlγXlγXαXlXαγXαγXβXαXβγ

(α,β,γ)Σ3

XlγX^rXlX^rγXαγX^rXαX^rγX^rγXrXγX^rX^rγXγ

(α,γ)Σ2

Xαα

αΣ

Xαα

R

ABCD



ABAYRAYRXRYRXRYRXRDXRDCD

Lk={wkwΣ}L=i1LkLkL


0

X

w|w|1ε

aXaaa,  aXbab,  bXaba,  bXbbb

w


Tuttavia, usando l'approccio di @ hendrik-jan si risparmiano due regole.
Rmn
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.