Języki, automaty i obliczenia/Ćwiczenia 10: Lemat o pompowaniu dla języków bezkontekstowych. Własności języków bezkontekstowych. Problemy rozstrzygalne: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Matiunreal (dyskusja | edycje)
Linia 2: Linia 2:


{{cwiczenie|1||
{{cwiczenie|1||
Wykorzystując lemat o pompowaniu udowodnij, że następujące języki nie są bezkontekstowe:
Wykorzystując lemat o pompowaniu, udowodnij, że następujące języki nie są bezkontekstowe:
#  <math>\displaystyle L=\left\{ a^{n}b^{m}c^{k}:k=\max \left\{ n,m\right\} \right\}  </math>  
#  <math>\displaystyle L=\left\{ a^{n}b^{m}c^{k}:k=\max \left\{ n,m\right\} \right\},   </math>  
#  <math>\displaystyle L=\left\{ a^{k}b^{n}c^{m}:k<n<m\right\}   </math>  
#  <math>\displaystyle L=\left\{ a^{k}b^{n}c^{m}:k<n<m\right\}</math>  
#  <math>\displaystyle L=\left\{ w\overleftarrow{w}a^{|w|}:w\in \left\{ a,b\right\} ^{*}\right\}   </math>  
#  <math>\displaystyle L=\left\{ w\overleftarrow{w}a^{|w|}:w\in \left\{ a,b\right\} ^{*}\right\}</math>  


}}
}}
Linia 26: Linia 26:
Punkt 3.<br>
Punkt 3.<br>
Dostatecznie długie słowo <math>\displaystyle  w\overleftarrow{w}a^{|w|}\in L</math> możemy rozłożyć na katenację pięciu słów  
Dostatecznie długie słowo <math>\displaystyle  w\overleftarrow{w}a^{|w|}\in L</math> możemy rozłożyć na katenację pięciu słów  
tak by był spełniony  warunek pompowania z lematu. Jeśli <math>\displaystyle w=a_1...a_n</math>, to  
tak, by był spełniony  warunek pompowania z lematu. Jeśli <math>\displaystyle w=a_1...a_n</math>, to  
<center><math>\displaystyle w\overleftarrow{w}a^{|w|}=\underbrace {a_1...a_k}_{u_1} \underbrace{a_{k+1}...a_n a_n....a_{k+1}}_{w_1 }
<center><math>\displaystyle w\overleftarrow{w}a^{|w|}=\underbrace {a_1...a_k}_{u_1} \underbrace{a_{k+1}...a_n a_n....a_{k+1}}_{w_1 }
\underbrace{a_k ...a_1}_u \underbrace{a^{2(n-k)}}_{w_2} \underbrace{a^{2k-n}} _{u_2}</math></center>
\underbrace{a_k ...a_1}_u \underbrace{a^{2(n-k)}}_{w_2} \underbrace{a^{2k-n}} _{u_2}</math></center>
Linia 35: Linia 35:
Wprowadzimy uogólnienie lematu o pompowaniu dla języków bezkontekstowych. Dla słowa <math>\displaystyle w \in A^*</math>
Wprowadzimy uogólnienie lematu o pompowaniu dla języków bezkontekstowych. Dla słowa <math>\displaystyle w \in A^*</math>
o długości <math>\displaystyle n</math> dowolną liczbę ze zbioru <math>\displaystyle \{1,.....,n\}</math> nazywamy pozycją w słowie <math>\displaystyle w</math>. Ustalając
o długości <math>\displaystyle n</math> dowolną liczbę ze zbioru <math>\displaystyle \{1,.....,n\}</math> nazywamy pozycją w słowie <math>\displaystyle w</math>. Ustalając
dowolny podzbiór <math>\displaystyle P \subset \{1,.....,n\}</math> będziemy mówić, że w słowie <math>\displaystyle w</math> wyróżniono pozycje ze zbioru <math>\displaystyle P</math>.
dowolny podzbiór <math>\displaystyle P \subset \{1,.....,n\}</math>, będziemy mówić, że w słowie <math>\displaystyle w</math> wyróżniono pozycje ze zbioru <math>\displaystyle P</math>.
</div></div>
</div></div>


Linia 90: Linia 90:
{{cwiczenie|3||
{{cwiczenie|3||
Udowodnij, że dla dowolnego języka <math>\displaystyle L</math> nad alfabetem jednoelementowym  
Udowodnij, że dla dowolnego języka <math>\displaystyle L</math> nad alfabetem jednoelementowym  
<center><math>\displaystyle L \in \mathcal{L}_3 \Leftrightarrow L \in \mathcal{L}_2</math></center>
<center><math>\displaystyle L \in \mathcal{L}_3 \Leftrightarrow L \in \mathcal{L}_2.</math></center>


}}
}}
Linia 104: Linia 104:
<math>\displaystyle w(a^n)^*=w(a^k)^{\frac{n}{k}}\subset L \subset \{a\}^*</math>. <br>
<math>\displaystyle w(a^n)^*=w(a^k)^{\frac{n}{k}}\subset L \subset \{a\}^*</math>. <br>
Dla <math>\displaystyle i=1,...,n</math> oznaczmy przez
Dla <math>\displaystyle i=1,...,n</math> oznaczmy przez
<center><math>\displaystyle L_i = a^{p+i}(a^n)^* \cap L</math></center>
<center><math>\displaystyle L_i = a^{p+i}(a^n)^* \cap L.</math></center>


Jeśli <math>\displaystyle L_i \neq \emptyset</math>, to niech <math>\displaystyle w_i \in L_i</math> będzie słowem o najmniejszej długości. Wówczas  
Jeśli <math>\displaystyle L_i \neq \emptyset</math>, to niech <math>\displaystyle w_i \in L_i</math> będzie słowem o najmniejszej długości. Wówczas  
Linia 122: Linia 122:
<math>\displaystyle L_1=\left\{ a^{n}b^{n}:n\geqslant 0\right\}  </math>    jest językiem bezkontekstowym,<br>
<math>\displaystyle L_1=\left\{ a^{n}b^{n}:n\geqslant 0\right\}  </math>    jest językiem bezkontekstowym,<br>
<math>\displaystyle L_2=\left\{ w \in \{a,b\}^* : |w|=5k </math> dla pewnego <math> k\geqslant 0 \rbrace  </math>  jest językiem regularnym.<br>
<math>\displaystyle L_2=\left\{ w \in \{a,b\}^* : |w|=5k </math> dla pewnego <math> k\geqslant 0 \rbrace  </math>  jest językiem regularnym.<br>
Języki regularne są domknięte ze względu na uzupełnienie, a przecięcie języka bezkontekstowego z regularnm jest  
Języki regularne są domknięte ze względu na uzupełnienie, a przecięcie języka bezkontekstowego z regularnym jest  
językiem bezkontekstowym.
językiem bezkontekstowym.
</div></div>
</div></div>
Linia 138: Linia 138:
<math>\displaystyle v_0\mapsto v_0v_0 \mapsto v_0v_0 v_0 \mapsto (v_0)v_0v_0 \mapsto ((v_0))v_0v_0  
<math>\displaystyle v_0\mapsto v_0v_0 \mapsto v_0v_0 v_0 \mapsto (v_0)v_0v_0 \mapsto ((v_0))v_0v_0  
\mapsto (())v_0v_0  \mapsto (())(v_0) v_0 \mapsto
\mapsto (())v_0v_0  \mapsto (())(v_0) v_0 \mapsto
(())()v_0 \mapsto (())() </math>
(())()v_0 \mapsto (())(). </math>
</div></div>
</div></div>


{{cwiczenie|6||
{{cwiczenie|6||
Określ gramatyki generujące języki
Określ gramatyki generujące języki:
# <math>\displaystyle L_1 =\{a^n b^m c^m : m,n \geqslant 0 \} \cup \{a^n b^n c^m : m,n \geqslant 0 \} </math>,
# <math>\displaystyle L_1 =\{a^n b^m c^m : m,n \geqslant 0 \} \cup \{a^n b^n c^m : m,n \geqslant 0 \} </math>,
# <math>\displaystyle L_2 =\{a^n b^n a^p b^q : n,p,q \geqslant 1 \}\cup \{a^n b^m a^p b^p : n,m,p \geqslant 1 \}</math>.   
# <math>\displaystyle L_2 =\{a^n b^n a^p b^q : n,p,q \geqslant 1 \}\cup \{a^n b^m a^p b^p : n,m,p \geqslant 1 \}</math>.   
Linia 153: Linia 153:
<math>\displaystyle  P_1 : v_0 \rightarrow v_1c \; |\; a w_1 \; |\;av_2 b\; |\; 1  ,\;\;  v_1 \rightarrow v_1c \; |\;av_2 b \; |\;1 , \;\;
<math>\displaystyle  P_1 : v_0 \rightarrow v_1c \; |\; a w_1 \; |\;av_2 b\; |\; 1  ,\;\;  v_1 \rightarrow v_1c \; |\;av_2 b \; |\;1 , \;\;
v_2 \rightarrow a v_2 b \; |\;1 ,\\
v_2 \rightarrow a v_2 b \; |\;1 ,\\
w_1 \rightarrow aw_1 \; |\; bw_2 c \; |\;1,\;\; w_2 \rightarrow  bw_2 c \; |\;1</math><br>
w_1 \rightarrow aw_1 \; |\; bw_2 c \; |\;1,\;\; w_2 \rightarrow  bw_2 c \; |\;1.</math><br>
Gramatyka ta nie jest jednoznaczna. Każde słowo w postaci <math>\displaystyle a^nb^nc^n</math> ma dwa różne wyprowadzenia.
Gramatyka ta nie jest jednoznaczna. Każde słowo w postaci <math>\displaystyle a^nb^nc^n</math> ma dwa różne wyprowadzenia.
Na przykład dla słowa <math>\displaystyle abc</math> mamy
Na przykład dla słowa <math>\displaystyle abc</math> mamy:
<center><math>\displaystyle v_0 \mapsto v_1c \mapsto av_2bc \mapsto abc  </math></center>
<center><math>\displaystyle v_0 \mapsto v_1c \mapsto av_2bc \mapsto abc, </math></center>


<center><math>\displaystyle v_0 \mapsto aw_1 \mapsto abw_2c \mapsto abc  </math></center>
<center><math>\displaystyle v_0 \mapsto aw_1 \mapsto abw_2c \mapsto abc. </math></center>


Język <math>\displaystyle L_2</math> jest  generowany przez  gramatykę <math>\displaystyle G_2</math>  o zbiorze praw<br>
Język <math>\displaystyle L_2</math> jest  generowany przez  gramatykę <math>\displaystyle G_2</math>  o zbiorze praw<br>
Linia 164: Linia 164:
v_2 \rightarrow  v_2 b \; |\;v_4 b , \;\;  v_3 \rightarrow bv_3    \; |\; bv_5, \\
v_2 \rightarrow  v_2 b \; |\;v_4 b , \;\;  v_3 \rightarrow bv_3    \; |\; bv_5, \\
v_4  \rightarrow  v_4 a  \; |\;v_6 a,        \;\;
v_4  \rightarrow  v_4 a  \; |\;v_6 a,        \;\;
v_5 \rightarrow av_5 b \; |\; ab ,\;\; v_6 \rightarrow  a v_6 b \; |\;ab</math><br>
v_5 \rightarrow av_5 b \; |\; ab ,\;\; v_6 \rightarrow  a v_6 b \; |\;ab.</math><br>
Gramatyka <math>\displaystyle G_2</math> też nie jest jednoznaczna. Każde słowo w postaci <math>\displaystyle a^n b^n a^p b^p</math> ma dwa różne wyprowadzenia.
Gramatyka <math>\displaystyle G_2</math> też nie jest jednoznaczna. Każde słowo w postaci <math>\displaystyle a^n b^n a^p b^p</math> ma dwa różne wyprowadzenia.
Natomiast język <math>\displaystyle L_2</math> jest również generowany przez gramatykę  <math>\displaystyle G_3</math>  
Natomiast język <math>\displaystyle L_2</math> jest również generowany przez gramatykę  <math>\displaystyle G_3</math>  
Linia 170: Linia 170:
<math>\displaystyle  P_3 : v_0 \rightarrow v_1 v_1\; |\; v_1 v_2 \; |\; v_2 v_1,    \;\;  v_1 \rightarrow av_1b \; |\;ab    , \;\;
<math>\displaystyle  P_3 : v_0 \rightarrow v_1 v_1\; |\; v_1 v_2 \; |\; v_2 v_1,    \;\;  v_1 \rightarrow av_1b \; |\;ab    , \;\;
v_2 \rightarrow  av_3 \; |\;v_4 b , \;\;  v_3 \rightarrow av_3    , \\
v_2 \rightarrow  av_3 \; |\;v_4 b , \;\;  v_3 \rightarrow av_3    , \\
v_4  \rightarrow  v_4 b  \; |\;v_1 b,       \;\;
v_4  \rightarrow  v_4 b  \; |\;v_1 b        \;\;
</math><br>
</math><br>
i ta gramatyka jest jednoznaczna, co oznacza, że język <math>\displaystyle L_2</math> jest jednoznaczny.<br>
i ta gramatyka jest jednoznaczna, co oznacza, że język <math>\displaystyle L_2</math> jest jednoznaczny.<br>
Linia 176: Linia 176:
<math>\displaystyle L_2 = \{a^n b^n a^p b^p : n,p \geqslant 1\}\cup \{a^n b^n a^p b^q : n,p,q \geqslant 1,  \;p\neq q \}\cup  
<math>\displaystyle L_2 = \{a^n b^n a^p b^p : n,p \geqslant 1\}\cup \{a^n b^n a^p b^q : n,p,q \geqslant 1,  \;p\neq q \}\cup  
\{a^n b^m a^p b^p : m,n,p \geqslant 1, n\neq m  \}</math>.<br>
\{a^n b^m a^p b^p : m,n,p \geqslant 1, n\neq m  \}</math>.<br>
Gramatyka <math>\displaystyle G_3</math> generuje niezależnie od siebie te trzy zbiory. Rozkładając analogicznie język <math>\displaystyle L_1</math> otrzymujemy<br>
Gramatyka <math>\displaystyle G_3</math> generuje niezależnie od siebie te trzy zbiory. Rozkładając analogicznie język <math>\displaystyle L_1</math>, otrzymujemy:<br>
<math>\displaystyle L_1 =\{a^n b^n c^n : n \geqslant 0 \} \cup \{a^n b^n c^m : k,m,n \geqslant 0, n\neq m  \}\cup
<math>\displaystyle L_1 =\{a^n b^n c^n : n \geqslant 0 \} \cup \{a^n b^n c^m : k,m,n \geqslant 0, n\neq m  \}\cup
\{a^n b^m c^m : m,n \geqslant 0, n\neq m  \}</math>.<br>
\{a^n b^m c^m : m,n \geqslant 0, n\neq m  \}</math>.<br>
Linia 192: Linia 192:
\endaligned</math></center>
\endaligned</math></center>


Używając algorytmu Cocke'a-Youngera-Kasamiego sprawdź, czy poniższe  
Używając algorytmu Cocke'a-Youngera-Kasamiego, sprawdź, czy poniższe  
słowa należą do języka generowanego przez tę gramatykę.
słowa należą do języka generowanego przez tę gramatykę:
# <math>\displaystyle w_1=bac</math>,
# <math>\displaystyle w_1=bac</math>,
# <math>\displaystyle w_2=babcab</math>,
# <math>\displaystyle w_2=babcab</math>,
Linia 207: Linia 207:


{{cwiczenie|8||
{{cwiczenie|8||
Wykorzystując lemat o pompowaniu udowodnij, że następujące języki nie są bezkontekstowe:
Wykorzystując lemat o pompowaniu, udowodnij, że następujące języki nie są bezkontekstowe:
#  <math>\displaystyle L=\left\{ a^{n}b^{m}c^{k}:k=min\{m,n\}\right\}  </math>  
#  <math>\displaystyle L=\left\{ a^{n}b^{m}c^{k}:k=min\{m,n\}\right\},   </math>  
#  <math>\displaystyle L=\left\{ a^{n}b^{m}c^{k}:k=mn\right\}  </math>  
#  <math>\displaystyle L=\left\{ a^{n}b^{m}c^{k}:k=mn\right\},   </math>  
#  <math>\displaystyle L=\left\{ a^{n}b^{n^{2}}\right\}  </math>  
#  <math>\displaystyle L=\left\{ a^{n}b^{n^{2}}\right\}.   </math>  


}}
}}


{{cwiczenie|9||
{{cwiczenie|9||
Stosując lemat Ogdena pokaż, że język <math>\displaystyle L=\{a^ib^jc^k: i,j,k>1,\ k  
Stosując lemat Ogdena, pokaż, że język <math>\displaystyle L=\{a^ib^jc^k: i,j,k>1,\ k  
\not = ir,\ k \not = js, </math> gdzie <math>\displaystyle r,s \in \{2,3,...\}\}</math> nie jest  
\not = ir,\ k \not = js, </math> gdzie <math>\displaystyle r,s \in \{2,3,...\}\}</math> nie jest  
bezkontekstowy.
bezkontekstowy.
Linia 239: Linia 239:


{{cwiczenie|12||
{{cwiczenie|12||
Określ gramatyki generujące języki
Określ gramatyki generujące języki:
# <math>\displaystyle L_3 =\{a^n b^m c^nd^p : m,n,p \geqslant 0 \} \cup \{a^n b^m c^p d^m : m,n,p \geqslant 0 \} </math>,
# <math>\displaystyle L_3 =\{a^n b^m c^nd^p : m,n,p \geqslant 0 \} \cup \{a^n b^m c^p d^m : m,n,p \geqslant 0 \} </math>,
# <math>\displaystyle L_4 =\{a^n b^{2n} : n \geqslant 1 \}\cup \{a^n b^{3n} : n \geqslant 1 \}</math>.   
# <math>\displaystyle L_4 =\{a^n b^{2n} : n \geqslant 1 \}\cup \{a^n b^{3n} : n \geqslant 1 \}</math>.   
Linia 247: Linia 247:


{{cwiczenie|13||
{{cwiczenie|13||
Napisz algorytmy rozstrzygające, czy dany język bezkontekstowy jest
Napisz algorytmy rozstrzygające, czy dany język bezkontekstowy jest:
# nieskończny,
# nieskończny,
# niepusty.
# niepusty.
Linia 263: Linia 263:
\endaligned</math></center>
\endaligned</math></center>


Używając algorytmu Cocke'a-Youngera-Kasamiego sprawdź, czy poniższe  
Używając algorytmu Cocke'a-Youngera-Kasamiego, sprawdź, czy poniższe  
słowa należą do języka generowanego przez tę gramatykę.
słowa należą do języka generowanego przez tę gramatykę:
# <math>\displaystyle w_1=cabba</math>,
# <math>\displaystyle w_1=cabba</math>,
# <math>\displaystyle w_2=baccab</math>,
# <math>\displaystyle w_2=baccab</math>,

Wersja z 10:07, 27 sie 2006

Ćwiczenia 10

Ćwiczenie 1

Wykorzystując lemat o pompowaniu, udowodnij, że następujące języki nie są bezkontekstowe:

  1. L={anbmck:k=max{n,m}},
  2. L={akbncm:k<n<m},
  3. L={wwa|w|:w{a,b}*}.
Rozwiązanie

Lemat 1 (Ogden)

Dla dowolnego języka bezkontekstowego LA* istnieje liczba naturalna M1 taka, że każde słowo wL, w którym wyróżniono M lub więcej pozycji, można przedstawić w formie w=u1w1uw2u2, gdzie w1,w2,v1,v2,uA* oraz

  1. w1w2 zawiera przynajmniej jedną wyróżnioną pozycję,
  2. w1uw2 zawiera co najwyżej M wyróżnionych pozycji,
  3. u1w1iuw2iu2L dla i=0,1,...

Lemat o pompowaniu jest szczególnym przypadkiem lematu Ogdena. Lemat Ogdena można próbować stosować w tych przypadkach, w których lemat o pompowaniu nie działa.

Ćwiczenie 2

Stosując lemat Ogdena pokaż, że język L={aibjck:i=j,j=k,k=i} nie jest bezkontekstowy.

Rozwiązanie

Ćwiczenie 3

Udowodnij, że dla dowolnego języka L nad alfabetem jednoelementowym

L3L2.
Rozwiązanie

Ćwiczenie 4

Udowodnij, że język Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L=\left\{ a^{n}b^{n}:n \;} nie jest wielokrotnością liczby 5} jest bezkontekstowy.

Rozwiązanie

Ćwiczenie 5

Czy gramatyka poprawnych nawiasów
({v0},{(,)},v0,P), gdzie P:v0v0v0|(v0)|1

jest jednoznaczna?

Rozwiązanie

Ćwiczenie 6

Określ gramatyki generujące języki:

  1. L1={anbmcm:m,n0}{anbncm:m,n0},
  2. L2={anbnapbq:n,p,q1}{anbmapbp:n,m,p1}.

Czy gramatyki te są jednoznaczne?

Rozwiązanie

Ćwiczenie 7

Dana niech będzie gramatyka (v0 jest symbolem początkowym):

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned v_0 & \rightarrow & v_0v_1\ |\ v_3v_1 \\ v_1 & \rightarrow & v_1v_2\ |\ v_2v_3 \\ v_2 & \rightarrow & v_4v_1\ |\ v_3v_3\ |\ a \\ v_3 & \rightarrow & v_1v_2\ |\ v_4v_2\ |\ b \\ v_4 & \rightarrow & v_3v_4\ |\ v_0v_1\ |\ c. \endaligned}

Używając algorytmu Cocke'a-Youngera-Kasamiego, sprawdź, czy poniższe słowa należą do języka generowanego przez tę gramatykę:

  1. w1=bac,
  2. w2=babcab,
  3. w3=bcaaca.
Rozwiązanie
ZADANIA DOMOWE

Ćwiczenie 8

Wykorzystując lemat o pompowaniu, udowodnij, że następujące języki nie są bezkontekstowe:

  1. L={anbmck:k=min{m,n}},
  2. L={anbmck:k=mn},
  3. L={anbn2}.

Ćwiczenie 9

Stosując lemat Ogdena, pokaż, że język L={aibjck:i,j,k>1, k=ir, k=js, gdzie r,s{2,3,...}} nie jest bezkontekstowy.

Wskazówka

Ćwiczenie 10

Udowodnij, że język L={ww:w{a,b}*{ab2a}} jest bezkontekstowy.

Ćwiczenie 11

Czy gramatyka poprawnych nawiasów

({v0,v1},{(,)},v0,P), gdzie P:v0v1v0|1,v1(v0)

rozważana w przykładzie 1.2 jest jednoznaczna?

Ćwiczenie 12

Określ gramatyki generujące języki:

  1. L3={anbmcndp:m,n,p0}{anbmcpdm:m,n,p0},
  2. L4={anb2n:n1}{anb3n:n1}.

Czy gramatyki te są jednoznaczne? Wykaż, że język L4 jest jednoznaczny.

Ćwiczenie 13

Napisz algorytmy rozstrzygające, czy dany język bezkontekstowy jest:

  1. nieskończny,
  2. niepusty.

Ćwiczenie 14

Dana niech będzie gramatyka (v0 jest symbolem początkowym):

Parser nie mógł rozpoznać (nieznana funkcja „\aligned”): {\displaystyle \displaystyle \aligned v_0 & \rightarrow & v_0v_1\ |\ v_3v_1 \\ v_1 & \rightarrow & v_2v_1\ |\ v_3v_2 \\ v_2 & \rightarrow & v_1v_4\ |\ v_3v_3\ |\ a \\ v_3 & \rightarrow & v_2v_2\ |\ v_4v_2\ |\ b \\ v_4 & \rightarrow & v_1v_4\ |\ v_0v_1\ |\ c. \endaligned}

Używając algorytmu Cocke'a-Youngera-Kasamiego, sprawdź, czy poniższe słowa należą do języka generowanego przez tę gramatykę:

  1. w1=cabba,
  2. w2=baccab,
  3. w3=aabbcc.