Praktycznym podejściem, które w wielu przykładach działa [ale nie zawsze, wiem] jest próba znalezienia zagnieżdżonej struktury ciągów w języku. „Zagnieżdżone zależności” muszą być generowane jednocześnie w różnych częściach łańcucha.
Mamy również podstawowy zestaw narzędzi :
konkatenacja: jeśli możesz podzielić język na dwie kolejne części, użyj tej produkcjiS→S1S2
związek: podzielony na części rozłączneS→S1∣S2
iteracja:S→S1S∣ε
Przykład 1
Oto przykład zagnieżdżenia (dziękuję Raphael).
L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
Zamień na . Możemy teraz upuścić w warunkach.2 l nn2ln
Zamień na (mylić? to „oh”, a nie „zero”). Zastosuj narzędzia do unii. Pracujemy tutaj z . Również iff oraz gdzie jest nową zmienną. Zamień na .k > o lub k < o o k > ok ≠ ok > o lub k < ook > ok = s + o s > 0 s k s + ok > ok=s+os>0sks+o
L1={bs+oal(bc)ma2lbo∣l,m,o,s∈N,s>0,m≥2}
Kilka prostych przeróbek.
L1={bbsboalbcbc(bc)m(aa)lbo∣l,m,o,s∈N}
Teraz widzimy strukturę zagnieżdżania i zaczynamy budować gramatykę.
T → b U U → b U ∣ εS1→TV , , (patrz: konkatenacja i iteracja tutaj)T→bUU→bU∣ε
o bV→bVb∣W (generujemy po obu stronach)o b
W→aWaa∣X
Y → b c b c Z → b c Z ∣ εX→YZ , ,Y→bcbcZ→bcZ∣ε
Przykład 2
K={akblcm∣l=m+k}
Pierwsze „oczywiste” przepisanie.
K={akbm+kcm∣m,k≥0}={akbmbkcm∣m,k≥0}
W językoznawstwie nazywa się to „zależnością międzyseryjną”: przeplatanie (zwykle) silnie wskazuje na brak kontekstu. Oczywiście i jesteśmy zbawieni.m + k = k + mk,m,k,mm+k=k+m
K={akbk+mcm∣m,k≥0}={akbkbmcm∣m,k≥0}
z produkcjami , ,X → a X b ∣ ε Y → b Y c ∣ εS→XYX→aXb∣εY→bYc∣ε
PodobnieK′={akblcm∣m=k+l}={akblclck∣k,l≥0}
z produkcjami ,X → b X c ∣ εS→aSc∣XX→bXc∣ε
Komentarz końcowy: te techniki pomogą ci opracować kandydatową gramatykę bezkontekstową, która, mam nadzieję, rozpozna twój język. Konieczny może być jeszcze dowód poprawności , aby gramatyka naprawdę rozpoznała Twój język (nic więcej i nic mniej).