Un approccio pratico che in molti esempi funziona [ma non sempre, lo so] sta cercando di trovare la struttura di annidamento delle stringhe nella lingua. Le "dipendenze nidificate" devono essere generate contemporaneamente in diverse parti della stringa.
Inoltre abbiamo la cassetta degli attrezzi di base :
concatenazione: S→S1S2 se puoi dividere la lingua in due parti consecutive usa questa produzione
unione: S→S1∣S2 divisa in parti disgiunte
iterazione: S→S1S∣ε
Esempio 1
Ecco un esempio per l'annidamento (grazie Raffaello).
L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
Sostituire con 2 l . Ora possiamo rilasciare n in condizioni.n2ln
Sostituisci con k > o oppure k < o (confuso? O è 'oh' non 'zero'). Applicare strumenti per l'unione. Lavoriamo con k > o qui. Inoltre k > o iff k = s + o e s > 0 dove s è una nuova variabile. Sostituisci k con s + o .k≠ok>o or k<ook>ok>ok=s+os>0sks+o
L1={bs+oal(bc)ma2lbo∣l,m,o,s∈N,s>0,m≥2}
Alcune semplici riscritture.
L1={bbsboalbcbc(bc)m(aa)lbo∣l,m,o,s∈N}
Ora vediamo la struttura di nidificazione e iniziamo a costruire una grammatica.
, T → b U , U → b U ∣ ε (vedi: concatenazione e iterazione qui)S1→TVT→bUU→bU∣ε
(generiamo o b 's su entrambi i lati)V→bVb∣Wo b
W→aWaa∣X
, Y → b c b c , Z → b c Z ∣ εX→YZY→bcbcZ→bcZ∣ε
Esempio 2
K={akblcm∣l=m+k}
Una prima riscrittura "ovvia".
K={akbm+kcm∣m,k≥0}={akbmbkcm∣m,k≥0}
In linguistice questo si chiama "dipendenza cross-seriale": l'interleaving (di solito) indica fortemente non-contesto. Naturalmente m + k = k + m e siamo salvati.k,m,k,mm+k=k+m
K={akbk+mcm∣m,k≥0}={akbkbmcm∣m,k≥0}
con produzioni , X → a X b ∣ ε , Y → b Y c ∣ εS→XYX→aXb∣εY→bYc∣ε
Allo stesso modo K′={akblcm∣m=k+l}={akblclck∣k,l≥0}
con produzioni , X → b X c ∣ εS→aSc∣XX→bXc∣ε
Commento finale: queste tecniche ti aiutano a trovare una grammatica candidata senza contesto che si spera riconoscerà la tua lingua. Potrebbe essere ancora necessaria una prova di correttezza , per garantire che la grammatica funzioni davvero per riconoscere la tua lingua (niente di più e niente di meno).