Język bezkontekstowy

Język bezkontekstowy (ang. context-free language) – 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 Chomsky’ego 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 Γ , {\displaystyle A\to \Gamma ,} gdzie A {\displaystyle A} jest dowolnym symbolem nieterminalnym, i którego znaczenie nie zależy od kontekstu w jakim występuje, a Γ {\displaystyle \Gamma } 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 { a n b n : n N } {\displaystyle \{a^{n}b^{n}:n\in \mathbb {N} \}} jest generowany przez:

S a S b , {\displaystyle S\to aSb,}
S ϵ . {\displaystyle S\to \epsilon .}

Słowo a a a b b b {\displaystyle aaabbb} możemy wyprowadzić:

S a S b a a S b b a a a S b b b a a a b b b . {\displaystyle S\to aSb\to aaSbb\to aaaSbbb\to aaabbb.}

Przykład – język Dycka

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

S ϵ , {\displaystyle S\to \epsilon ,}
S ( S ) , {\displaystyle S\to (S),}
S S S . {\displaystyle S\to SS.}

Słowo ( ( ( ) ) ( ) ) {\displaystyle ((())())} można wyprowadzić:

S ( S ) ( S S ) ( S ( S ) ) ( ( S ) ( S ) ) ( ( ( S ) ) ( ) ) ( ( ( ) ) ( ) ) . {\displaystyle S\to (S)\to (SS)\to (S(S))\to ((S)(S))\to (((S))())\to ((())()).}

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

S ϵ {\displaystyle S\to \epsilon }
S ( 1 S ) 1 {\displaystyle S\to (_{1}S)_{1}}
S ( 2 S ) 2 {\displaystyle S\to (_{2}S)_{2}}
{\displaystyle \vdots }
S ( n S ) n {\displaystyle S\to (_{n}S)_{n}}
S S S {\displaystyle S\to SS}

Własności

Podane poniżej własności mają charakter algorytmiczny, tj. pisząc, że język X {\displaystyle X} jest bezkontekstowy, istnieje stała n {\displaystyle n} , istnieje język regularny R {\displaystyle 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 {\displaystyle L} i L {\displaystyle L'} są językami bezkontekstowymi oraz R {\displaystyle R} jest językiem regularnym, to językami bezkontekstowymi są zawsze L L , {\displaystyle L\cup L',} L L , {\displaystyle LL',} L , {\displaystyle L^{*},} L R , {\displaystyle L^{R},} L R . {\displaystyle L\cap R.}
  • Postać normalna Chomsky’ego: 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ć A B C {\displaystyle A\to BC} lub A a , {\displaystyle A\to a,} gdzie A , B , C {\displaystyle A,B,C} to symbole nieterminalne, a {\displaystyle 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ć A a X , {\displaystyle A\to aX,} gdzie A {\displaystyle A} to symbol nieterminalny, a {\displaystyle a} to symbol terminalny, X {\displaystyle X} to ciąg (być może pusty) symboli nieterminalnych.
  • Lemat o pompowaniu: Dla każdego języka bezkontekstowego istnieje takie n , {\displaystyle n,} że każde słowo z {\displaystyle z} tego języka długości większej od n {\displaystyle n} można zapisać w postaci u v w x y , {\displaystyle uvwxy,} gdzie | v w x | < n , {\displaystyle |vwx|<n,} przynajmniej jedno z v {\displaystyle v} i x {\displaystyle x} jest niepuste, i dla każdego k , {\displaystyle k,} u v k w x k y {\displaystyle uv^{k}wx^{k}y} należy do tego języka.
  • Lemat Ogdena: dla każdego języka bezkontekstowego istnieje takie n , {\displaystyle n,} że każde słowo z {\displaystyle z} w którym oznaczymy więcej niż n {\displaystyle n} symboli można zapisać w postaci u v w x y , {\displaystyle uvwxy,} gdzie ilość oznaczonych symboli w v w x {\displaystyle vwx} jest mniejsza od n , {\displaystyle n,} przynajmniej jedno z v {\displaystyle v} i x {\displaystyle x} zawiera oznaczony symbol, i dla każdego k , {\displaystyle k,} u v k w x k y {\displaystyle uv^{k}wx^{k}y} 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 N A {\displaystyle f\colon A^{*}\to \mathbb {N} ^{A}} przyporządkowuje słowu wektor liczby wystąpień każdej litery w słowie (np. f ( a b a ) = ( 2 , 1 ) {\displaystyle f(aba)=(2,1)} dla A = { a , b } {\displaystyle A=\{a,b\}} ). Wówczas dla każdego języka bezkontekstowego L A {\displaystyle L\subseteq A^{*}} istnieje język regularny R {\displaystyle R} taki, że f ( L ) = f ( R ) . {\displaystyle f(L)=f(R).} Przykład: dla L = { a n b n : n N } {\displaystyle L=\{a^{n}b^{n}:n\in \mathbb {N} \}} można wziąć R = ( a b ) . {\displaystyle R=(ab)^{*}.}
  • Twierdzenie Chomsky’ego-Schützenbergera: dla każdego języka bezkontekstowego L A {\displaystyle L\subseteq A^{*}} istnieje liczba naturalna n , {\displaystyle n,} język regularny R {\displaystyle R} nad alfabetem A n = { ( 1 , ) 1 , , ( n , ) n } {\displaystyle A_{n}=\{(_{1},)_{1},\dots ,(_{n},)_{n}\}} oraz homomorfizm f : A n A {\displaystyle f\colon A_{n}^{*}\to A^{*}} taki, że L = f ( D n R ) {\displaystyle L=f(D_{n}\cap R)} ( D n {\displaystyle D_{n}} 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 { a n b n c n : n N } {\displaystyle \{a^{n}b^{n}c^{n}:n\in \mathbb {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 { a n b m c m : n , m N } {\displaystyle \{a^{n}b^{m}c^{m}:n,m\in \mathbb {N} \}} i { a n b n c m : n , m N } . {\displaystyle \{a^{n}b^{n}c^{m}:n,m\in \mathbb {N} \}.}

Dopełnienie języka bezkontekstowego { a n b m c k : n , m , k N , n m m k } {\displaystyle \{a^{n}b^{m}c^{k}:n,m,k\in \mathbb {N} ,n\neq m\lor m\neq k\}} nie jest językiem bezkontekstowym. Gdyby było, to po przecięciu z językiem regularnym a b c {\displaystyle a^{*}b^{*}c^{*}} dostalibyśmy język bezkontekstowy (tymczasem dostajemy { a n b n c n : n N } {\displaystyle \{a^{n}b^{n}c^{n}:n\in \mathbb {N} \}} ).

Dla każdego n 1 {\displaystyle n\geqslant 1} istnieje język, który można przedstawić jako przecięcie n + 1 {\displaystyle n+1} języków bezkontekstowych, ale nie można przedstawić jako przecięcie n {\displaystyle 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ć { a n b n c m d m : n , m N } . {\displaystyle \{a^{n}b^{n}c^{m}d^{m}:n,m\in \mathbb {N} \}.}
  • 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ć { a n b m c k : n , m , k N , n m m k } . {\displaystyle \{a^{n}b^{m}c^{k}:n,m,k\in \mathbb {N} ,n\neq m\lor m\neq k\}.} (Gdyby był on deterministycznym językiem bezkontekstowym, to jego dopełnienie przecięte z a b c {\displaystyle a^{*}b^{*}c^{*}} { a n b n c n : n N } {\displaystyle \{a^{n}b^{n}c^{n}:n\in \mathbb {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 { a n b n c m d m : n , m N } { a n b m c m d n : n , m N } . {\displaystyle \{a^{n}b^{n}c^{m}d^{m}:n,m\in \mathbb {N} \}\cup \{a^{n}b^{m}c^{m}d^{n}:n,m\in \mathbb {N} \}.}

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 Θ ( n 3 ) {\displaystyle \Theta (n^{3})} ),
  • czy istnieje jakiekolwiek słowo, które należy do danego języka,
  • czy do danego języka należy co najmniej n {\displaystyle 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 ( u i , v i ) {\displaystyle (u_{i},v_{i})} oznacza i {\displaystyle i} -tą parę słów w systemie Posta. Stwórzmy dwa języki bezkontekstowe L 1 {\displaystyle L_{1}} i L 2 : {\displaystyle L_{2}{:}}

L 1 u i b i , {\displaystyle L_{1}\to u_{i}b_{i},} dla każdego i {\displaystyle i} odpowiadającego parze słów w systemie Posta,
L 1 u i L 1 b i , {\displaystyle L_{1}\to u_{i}L_{1}b_{i},}
L 2 v i b i , {\displaystyle L_{2}\to v_{i}b_{i},}
L 2 v i L 2 b i , {\displaystyle L_{2}\to v_{i}L_{2}b_{i},}

gdzie b i {\displaystyle b_{i}} są nowymi symbolami terminalnymi, niewystępującymi w żadnym u i {\displaystyle u_{i}} ani v i . {\displaystyle v_{i}.}

Wygenerowane słowo języka L 1 {\displaystyle L_{1}} składa się ze słowa wygenerowanego przez pierwszy język systemu Posta, oraz (odwróconego) znaczenia tego słowa:

u i 1 u i 2 u i 3 u i n b i n b i 3 b i 2 b i 1 . {\displaystyle u_{i_{1}}u_{i_{2}}u_{i_{3}}\cdots u_{i_{n}}b_{i_{n}}\cdots b_{i_{3}}b_{i_{2}}b_{i_{1}}.}

Analogiczną postać mają słowa wygenerowane przez L 2 . {\displaystyle L_{2}.} Czyli jeśli istnieje słowo wspólne dla L 1 {\displaystyle L_{1}} i L 2 , {\displaystyle L_{2},} 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 L 1 {\displaystyle L_{1}} i L 2 {\displaystyle L_{2}} o rozłącznych nieterminalach, i symbolach startowych odpowiednio S 1 {\displaystyle S_{1}} i S 2 , {\displaystyle S_{2},} Zbudujmy następującą gramatykę o symbolu startowym S : {\displaystyle S{:}}

S S 1 , {\displaystyle S\to S_{1},}
S S 2 , {\displaystyle S\to S_{2},}
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 S 1 {\displaystyle S_{1}} i S 2 . {\displaystyle S_{2}.} 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

  1. An infinite hierarchy of intersections of context-free languages | SpringerLink [online], www.springerlink.com [dostęp 2017-11-24]  (ang.).

Bibliografia