Istnieje wiele technik, aby udowodnić, że język nie jest pozbawiony kontekstu, ale jak udowodnić, że język jest pozbawiony kontekstu?
Jakie są techniki, aby to udowodnić? Oczywiście jednym ze sposobów jest wykazanie gramatyki bezkontekstowej dla tego języka. Czy istnieją jakieś systematyczne techniki znajdowania gramatyki bezkontekstowej dla danego języka?
Dla stałych języków, nie są systematyczne sposoby w celu uzyskania regularnego automat gramatyka / skończonych Stan: na przykład, Myhill-Nerode twierdzenie zapewnia jeden sposób. Czy istnieje odpowiednia technika dla języków bezkontekstowych?
Moją motywacją jest (mam nadzieję) zbudowanie pytania referencyjnego zawierającego listę technik, które często są pomocne, gdy próbuję udowodnić, że dany język jest pozbawiony kontekstu. Ponieważ mamy tutaj wiele pytań, które są tego szczególnymi przypadkami, byłoby dobrze, gdybyśmy mogli udokumentować ogólne podejście lub ogólne techniki, których można użyć w obliczu tego rodzaju problemu.
Odpowiedzi:
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).
Zamień na . Możemy teraz upuścić w warunkach.2 l nn 2l n
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 ≠ o k > o lub k < o o k > o k = s + o s > 0 s k s + ok > o k=s+o s>0 s k s+o
Kilka prostych przeróbek.
Teraz widzimy strukturę zagnieżdżania i zaczynamy budować gramatykę.
T → b U U → b U ∣ εS1→TV , , (patrz: konkatenacja i iteracja tutaj)T→bU U→bU∣ε
o bV→bVb∣W (generujemy po obu stronach)o b
Y → b c b c Z → b c Z ∣ εX→YZ , ,Y→bcbc Z→bcZ∣ε
Przykład 2
Pierwsze „oczywiste” przepisanie.
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,m m+k=k+m
z produkcjami , ,X → a X b ∣ ε Y → b Y c ∣ εS→XY X→aXb∣ε Y→bYc∣ε
PodobnieK′={akblcm∣m=k+l}={akblclck∣k,l≥0}
z produkcjami ,X → b X c ∣ εS→aSc∣X X→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).
źródło
Istnieje jedna charakterystyka CFL, która może być użyteczna, twierdzenie Chomsky'ego-Schützenbergera .
Język Dyck
Twierdzenie Chomsky'ego-Schützenbergera
Zauważ, że homomorfizm rozciąga się na słowa (symbol po symbolu), a następnie na języki (słowo po słowie).
Przykład
Rozważ . ZL={anbncm∣n,m∈N
twierdzenie implikuje, że jest pozbawiony kontekstu, w szczególności od tego czasuL
Przykład 2
Pokaż, że jest pozbawiony kontekstu.L={bkal(bc)manbo∣k,l,m,n,o∈N,k≠o,2l=n,m≥2}
Potrzebujemy tutaj jednego rodzaju nawiasów dla , jednego dla , jednego dla i drugiego używanego do modelowania które powodują . Używamya bc b b k≠o
i zastosuj twierdzenie. Aby zobaczyć, że , nie potrzebujemy więcej niż fakt, że pasujące symbole (np. I ) muszą występować równie często w dowolnym . Dodając to ograniczenie do wyrażeń regularnych, przez które zdefiniowaliśmy , otrzymujemyL=ψ(DT∩R) [ ] w∈DT R
i tym razem
Do gramatyki i automatów
Jeśli w końcu chcemy mieć automat lub gramatykę, mamy przed sobą jeszcze trochę pracy.
W kierunku automat skonstruować NPDA dla i NFA dla . Pierwszy z nich jest standardowy, a my mamy algorytmy dla drugiego, pod warunkiem, że język jest podany w odpowiedniej reprezentacji (patrz również tutaj ). Oba przecięcie to kolejna standardowa konstrukcja i można zastosować do każdego przejścia osobno.DT ψR ψ
W kierunku gramatyki, zbuduj ją dla (znowu, powinno być standardowe), weź tę dla i je . Następnie zastosuj do zestawu reguł (symbol dla symbolu).R ψDT ψ
Prawdopodobnie jest to łatwe, ponieważ algorytmiczne; złożoność polega na znalezieniu odpowiedniego , i . Nie wiem, czy to podejście jest (często) prostsze niż bezpośrednie tworzenie PDA / gramatyki, ale może pozwolić skupić się na ważnych cechach danego języka. Spróbuj sam!R ψT R ψ
źródło