Własności języków bezkontekstowych

by Jerry Sky

2020-11-12



1. Lemat o pompowaniu dla języków bezkontekstowych

Niech LL będzie dowolnym językiem bezkontekstowym. Wówczas istnieje stała pompowania nn, zależna tylko od LL, taka, że jeśli słowo zz należy do języka LL oraz zn|z| \ge n, to z=uvwxyz = uvwxy, oraz

(ten lemat rozszerza ten poprzedni lemat o pompowaniu dodając jeszcze pole xx)

1.1. D-d

Mamy gramatykę G(L)G(L) w postaci normalnej Chomsky’ego (czyli mamy produkcje typu ABCA \to BC lub AaA \to a; drzewo wyprowadzenia jest binarne patrząc na węzły wewnętrzne).

Niech ta nasza gramatyka G=(N,T,P,S)G = (N,T,P,S) gdzie N=k|N| = k.

Ustalmy n=2kn = 2^k (stałą pompowania).
Bierzemy zLz \in L, z=z1,,znz = z_1,\dots,z_n (składa się z nn symboli).

Drzewo wyprowadzenia:

Bierzemy najdłuższą ścieżkę, która jest długości co najmniej długości lgn=k\lg n = k. Ścieżka zawiera co najmniej k+1k+1 węzłów wewnętrznych, ale mamy tylko kk nieterminali — czyli (pigeonhole principle) musimy mieć gdzieś powtórkę (oznaczmy przez AA). Patrząc od dołu zaznaczamy poddrzewa, których korzeniami są te dwie instancje AA:

Stosujemy podział słowa z=uvwxyz = uvwxy:

I możemy je teraz „pompować”:

  1. uv0wx0yuv^0wx^0y
  2. yv2wx2yyv^2wx^2y

Dlatego lemat jest spełniony.

Chociaż jeszcze należy pokazać, że:

Wynika to z tego, że szukaliśmy pierwszych powtarzających się symboli od dołu, stąd poddrzewo (czerwone, większe) nie może być wyższe niż kk. Co daje nam liczbę liści 2k\le 2^k.


1.2. Przykład

Mamy język L={aibici:i1}L = \left\{ a^i b^i c^i: i \ge 1 \right\}.

Używamy lematu w celu udowodnienia, że język LL nie jest bezkontekstowy.

Weźmy nn (stałą pompowania) i słowo z=anbncnz = a^n b^n c^n.

  1. Zgodnie z lematem możemy pompować w obrębie jednego bloku znaków (aa lub bb lub cc) ale wtedy zmienia się liczba tych znaków, a nie zmienia się liczba pozostałych, czyli wychodzimy z języka.
  2. Możemy pompować też znaki z dwóch sąsiednich bloków (aa i bb lub bb i cc) utrzymując ich równoliczność, ale wtedy zostaje problem z trzecim blokiem i także wypadamy z języka.
  3. Innych możliwości nie ma więc LL nie jest bezkontekstowy.

1.3. Przykład

Mamy język L={aibjck:ijjk}L = \left\{ a^i b^j c^k: i \neq j \land j \neq k \right\}.

Bierzemy słowo anbn+1cn+2a^n b^{n+1} c^{n+2}. Ale pompując w sposób anbn1(b2)i(c2)icna^n b^{n-1} (b^2)^i (c^2)^i c^n dostajemy słowa należące do języka.

Musimy wzmocnić ten lemat.


2. Lemat Ogdena — silniejsza wersja lematu o pompowaniu

Niech LL będzie językiem bezkontekstowym. Wówczas istnieje stała pompowania nn taka, że jeśli w słowie zLz \in L oznaczymy co najmniej nn liter to możemy słowo zz zapisać jako uvwxyuvwxy i

2.1. D-d

Weźmy m>nm > n, gdzie n=2Nn = 2^{|N|} i nasze słowo z=z1z2znzmz = z_1 z_2 \dots z_n \dots z_m. Oznaczamy co najmniej nn liter.

Znowu, tak jak wcześniej, budujemy drzewo wyprowadzenia i najdłuższą ścieżkę czyli od korzenia do liścia, tylko tym razem w następujący sposób:
jeśli jestem w danym wierzchołku to idę do poddrzewa, które ma „więcej” symboli oznaczonych w liściach.

Wyznaczona ścieżka ma co najmniej długość lgn=k\lg n = k. Co więcej jeśli zignorujemy wierzchołki, w których tylko jedno poddrzewo miało wierzchołki oznaczone to dalej mamy długość kk.

Znowu, tak samo jak w poprzednim dowodzie mamy powtórki gdzieś wierzchołka AA.

Więc analogicznie bierzemy poddrzewa:

Analiza podobna jak w poprzednim dowodzie, ale liczymy tylko symbole oznaczone.

W obu połówkach były symbole oznaczone, to vv i xx muszą mieć jakiś symbol oznaczony.

  1. Analogicznie, skoro liczyliśmy od dołu to wysokość (różowego) poddrzewa jest nie większa niż kk wierzchołków dzielących symbole oznaczone, stąd vwxvwx nie ma więcej niż 2k=n2^k = n symboli.

2.2. Przykład

Kontynuacja przykładu

Mamy język L={aibjck:ijjk}L = \left\{ a^i b^j c^k: i \neq j \land j \neq k \right\}.

Mamy m>nm > n, gdzie nn to stała pompowania.

Bierzemy słowo z=am+m!bmcm+m!z = a^{m + m!} b^m c^{m + m!} — powinniśmy pompować najrzadziej występujący symbol.

Oznaczamy wszystkie litery bb.

Zgodnie z lematem możemy:

  1. Pompować tylko litery bb; jeśli pompujemy kk liter to dla i=m!k+1i = \frac{m!}{k} + 1 czyli mamy równość bb i aa.
  2. Pompować tylko aa i bb (bb i cc) — znowu wypadamy z języka bo bb zrównają się z cc (bb z aa).
  3. Czy możemy równocześnie pompować aa, bb i cc? — nie, bo to by nam już nie zapewniło wypadnięcia z języka.

3. Twierdzenie o zamkniętności operacji na j. bezkontekstowych

Języki bezkontekstowe są zamknięte na sumę, złożenie i domknięcie Kleene’ego.

3.1. D-d

Niech

przy czym N1N2=N_1 \cap N_2 = \emptyset i SN1N2S \notin N_1 \cup N_2.

  1. G3=({S}N1N2,T1T2,S,P1P2{SS1S2})G_3 = \left(\{S\} \cup N_1 \cup N_2, T_1 \cup T_2, S, P_1 \cup P_2 \cup \{S \to S_1|S_2\} \right) i L(G3)=L(G1)L(G2)L(G_3) = L(G_1) \cup L(G_2)
  2. G4=({S}N1N2,T1T2,S,P1P2{SS1S2})G_4 = \left( \{S\} \cup N_1 \cup N_2, T_1 \cup T_2, S, P_1 \cup P_2 \cup \{S \to S_1S_2\} \right) i L(G4)=L(G1)L(G2)L(G_4) = L(G_1)L(G_2)
  3. G5=({S}N1,T1,S,P1{SS1Sϵ})G_5 = \left( \{S\} \cup N_1, T_1, S, P_1 \cup \{S \to S_1 S | \epsilon\} \right) i L(G5)=L(G1)L(G_5) = L(G_1)^*

Twierdzenie o nie-zamkniętności operacji przecięcia na j. bezkontekstowych

Języki bezkontekstowe nie są zamknięte na przecięcie.

D-d

Niech

Wówczas zauważmy, że
A=BCA = B \cap C nie jest bezkontekstowy (przykład).