Język bezkontekstowy

Z testwiki
Przejdź do nawigacji Przejdź do wyszukiwania

Język bezkontekstowy (Szablon:Ang.) – język formalny taki, że istnieje niedeterministyczny automat ze stosem decydujący czy dany łańcuch należy do języka. Równoważnie, taki, że istnieje dlań gramatyka bezkontekstowa. W hierarchii Chomskiego jest zdefiniowany jako język typu 2.

Rodzina języków regularnych jest podzbiorem zbioru języków bezkontekstowych. Każdy język bezkontekstowy jest językiem kontekstowym.

Języki bezkontekstowe mają ważne znaczenie w informatyce, m.in. w budowie kompilatorów; patrz analiza składniowa.

Gramatyka bezkontekstowa

Każdy język bezkontekstowy jest generowany przez pewną gramatykę bezkontekstową. Nazwa ta bierze się od tego, że wszystkie jej reguły są postaci AΓ, gdzie A jest dowolnym symbolem nieterminalnym, i którego znaczenie nie zależy od kontekstu w jakim występuje, a Γ to dowolny (być może pusty) ciąg symboli terminalnych i nieterminalnych.

Do zapisu reguł można stosować notację Backusa-Naura.

Przykład

Język słów postaci {anbn:n} jest generowany przez:

SaSb,
Sϵ.

Słowo aaabbb możemy wyprowadzić:

SaSbaaSbbaaaSbbbaaabbb.

Przykład – język Dycka

Język „poprawnie rozstawionych nawiasów”, czyli takich wyrażeń, które mają tyle samo wystąpień znaku ( i znaku ), i w każdym prefiksie słowa jest nie mniej ( od ) (można sprawdzić, że takie warunki rzeczywiście są równoważne temu, że nawiasy są poprawnie rozstawione) jest generowany przez:

Sϵ,
S(S),
SSS.

Słowo ((())()) można wyprowadzić:

S(S)(SS)(S(S))((S)(S))(((S))())((())()).

Ten język nazywa się językiem Dycka. Ogólnie, możemy zdefiniować język Dycka Dn dla n możliwych rodzajów nawiasów (tj. nad alfabetem {(1,)1,(2,)2,,(n,)n}) za pomocą gramatyki

Sϵ
S(1S)1
S(2S)2
S(nS)n
SSS

Własności

Podane poniżej własności mają charakter algorytmiczny, tj. pisząc, że język X jest bezkontekstowy, istnieje stała n, istnieje język regularny R mamy na myśli także fakt, że można podać algorytm wyznaczający te obiekty, dostający na wejściu dane reprezentowane w efektywnej postaci. W efektywny sposób jest wykonywalna konwersja między gramatyką bezkontekstową a niedeterministycznym automatem ze stosem (w obydwie strony).

  • Języki bezkontekstowe są zamknięte ze względu na konkatenację, sumę, domknięcie Kleene’ego, odbicie lustrzane i przecięcie z językami regularnymi: jeżeli L i L są językami bezkontekstowymi oraz R jest językiem regularnym, to językami bezkontekstowymi są zawsze LL, LL, L*, LR, LR.
  • Postać normalna Chomskiego: każdą gramatykę bezkontekstową, której język nie generuje słowa pustego można sprowadzić do postaci, w której każda reguła ma postać ABC lub Aa, gdzie A,B,C to symbole nieterminalne, a to symbol terminalny. Tę postać normalną wykorzystuje się w algorytmie CYK.
  • Postać normalna Greibach: każdą gramatykę bezkontekstową, której język nie generuje słowa pustego można sprowadzić do postaci, w której każda reguła ma postać AaX, gdzie A to symbol nieterminalny, a to symbol terminalny, X to ciąg (być może pusty) symboli nieterminalnych.
  • Lemat o pompowaniu: Dla każdego języka bezkontekstowego istnieje takie n, że każde słowo z tego języka długości większej od n można zapisać w postaci uvwxy, gdzie |vwx|<n, przynajmniej jedno z v i x jest niepuste, i dla każdego k, uvkwxky należy do tego języka.
  • Lemat Ogdena: dla każdego języka bezkontekstowego istnieje takie n, że każde słowo z w którym oznaczymy więcej niż n symboli można zapisać w postaci uvwxy, gdzie ilość oznaczonych symboli w vwx jest mniejsza od n, przynajmniej jedno z v i x zawiera oznaczony symbol, i dla każdego k, uvkwxky należy do tego języka. Lemat o pompowaniu jest szczególnym przypadkiem lematu Ogdena, w którym oznacza się wszystkie symbole.
  • Twierdzenie Parikha: Niech f:A*A przyporządkowuje słowu wektor liczby wystąpień każdej litery w słowie (np. f(aba)=(2,1) dla A={a,b}). Wówczas dla każdego języka bezkontekstowego LA* istnieje język regularny R taki, że f(L)=f(R). Przykład: dla L={anbn:n} można wziąć R=(ab)*.
  • Twierdzenie Chomskiego-Schützenbergera: dla każdego języka bezkontekstowego LA* istnieje liczba naturalna n, język regularny R nad alfabetem An={(1,)1,,(n,)n} oraz homomorfizm f:An*A* taki, że L=f(DnR) (Dn to język Dycka).

Przecięcie języków bezkontekstowych i dopełnienie języka bezkontekstowego

Dopełnienie języka bezkontekstowego albo przecięcie dwóch języków bezkontekstowych nie musi być językiem bezkontekstowym.

Przykład: język {anbncn:n} nie jest bezkontekstowy (co można wykazać korzystając z lematu o pompowaniu). Język ten jednak jest przecięciem dwóch języków bezkontekstowych {anbmcm:n,m} i {anbncm:n,m}.

Dopełnienie języka bezkontekstowego {anbmck:n,m,k,nmmk} nie jest językiem bezkontekstowym. Gdyby było, to po przecięciu z językiem regularnym a*b*c* dostalibyśmy język bezkontekstowy (tymczasem dostajemy {anbncn:n}).

Dla każdego n1 istnieje język, który można przedstawić jako przecięcie n+1 języków bezkontekstowych, ale nie można przedstawić jako przecięcie n języków bezkontekstowych[1].

Podklasy klasy języków bezkontekstowych

  • Języki liniowe to języki, dla których istnieje gramatyka, w której po prawej stronie każdej reguły znajduje się co najwyżej jeden nieterminal. Nie każdy język bezkontekstowy jest językiem liniowym; za przykład może służyć {anbncmdm:n,m}.
  • Języki bezkontekstowe deterministyczne to języki rozpoznawalne przez deterministyczny automat ze stosem. Są one zamknięte ze względu na dopełnienie i przecięcie z językami regularnymi. Nie każdy język bezkontekstowy jest językiem deterministycznym; za przykład może służyć {anbmck:n,m,k,nmmk}. (Gdyby był on deterministycznym językiem bezkontekstowym, to jego dopełnienie przecięte z a*b*c*{anbncn:n} również takie by było. Ale ten język nie jest nawet bezkontekstowy.)
  • Języki jednoznaczne to języki, dla których istnieje jednoznaczna gramatyka bezkontekstowa – gramatyka, w której każde słowo może mieć tylko jedno drzewo wyprowadzenia. Przykładem języka niejednoznacznego jest {anbncmdm:n,m}{anbmcmdn:n,m}.

Rozstrzygalność

W językach regularnych praktycznie wszystkie problemy decyzyjne są rozstrzygalne. Nie jest to już jednak prawdą w językach bezkontekstowych.

Rozstrzygalne są takie problemy jak:

  • czy dane słowo należy do danego języka (algorytm CYK wykonuje ten test w czasie Θ(n3)),
  • czy istnieje jakiekolwiek słowo, które należy do danego języka,
  • czy do danego języka należy co najmniej n słów,
  • czy dany język zawiera nieskończenie wiele słów.

Nierozstrzygalne problemy to natomiast m.in.:

  • czy istnieje jakiekolwiek słowo, które nie należy do danego języka,
  • czy dane dwa języki są równe,
  • czy jeden język bezkontekstowy jest podzbiorem drugiego,
  • czy istnieje słowo wspólne dla danych dwóch języków,
  • czy dany język jest jednoznaczny,
  • czy dana gramatyka jest jednoznaczna.

Dowód nierozstrzygalności istnienia wspólnego słowa

Pytanie czy przekrój 2 języków jest niepusty można zredukować do problemu odpowiedniości Posta – niech (ui,vi) oznacza i-tą parę słów w systemie Posta. Stwórzmy dwa języki bezkontekstowe L1 i L2:

L1uibi, dla każdego i odpowiadającego parze słów w systemie Posta,
L1uiL1bi,
L2vibi,
L2viL2bi,

gdzie bi są nowymi symbolami terminalnymi, niewystępującymi w żadnym ui ani vi.

Wygenerowane słowo języka L1 składa się ze słowa wygenerowanego przez pierwszy język systemu Posta, oraz (odwróconego) znaczenia tego słowa:

ui1ui2ui3uinbinbi3bi2bi1.

Analogiczną postać mają słowa wygenerowane przez L2. Czyli jeśli istnieje słowo wspólne dla L1 i L2, to w systemie Posta, na podstawie którego zostały zbudowane, istnieje słowo rozwiązujące pozytywnie problem odpowiedniości w tym systemie.

Ponieważ jednak problem odpowiedniości Posta jest nierozstrzygalny, nierozstrzygalne jest też istnienie wspólnego słowa.

Dowód nierozstrzygalności jednoznaczności gramatyki

Weźmy dwa jednoznaczne języki L1 i L2 o rozłącznych nieterminalach, i symbolach startowych odpowiednio S1 i S2, Zbudujmy następującą gramatykę o symbolu startowym S:

SS1,
SS2,
plus wszystkie produkcje obu języków.

Gramatyka taka jest jednoznaczna wtedy i tylko wtedy, gdy nie istnieje słowo należące jednocześnie do S1 i S2. Ponieważ dla każdego systemu Posta potrafimy zbudować jednoznaczne gramatyki (poprzedni dowód), rozwiązanie problemu jednoznaczności rozwiązywałoby problem odpowiedniości Posta.

A zatem problem ten jest nierozstrzygalny.

Zobacz też

Przypisy

Szablon:Przypisy

Bibliografia

Szablon:Języki formalne i gramatyki