Języki, automaty i obliczenia/Ćwiczenia 13: Złożoność obliczeniowa.: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Matiunreal (dyskusja | edycje)
Matiunreal (dyskusja | edycje)
Linia 21: Linia 21:
zależności <math>\displaystyle k=i\cdot j</math> (według uzasadnienia z wykładu) jest wykonywana w czasie wielomianowym.
zależności <math>\displaystyle k=i\cdot j</math> (według uzasadnienia z wykładu) jest wykonywana w czasie wielomianowym.


Pozostaje zaprojektować deterministyczną maszynę generującą ciągi. Można to zrobić według schematu
Pozostaje zaprojektować deterministyczną maszynę generującą ciągi. Można to zrobić według schematu (maszyna cztero-taśmowa):
(maszyna cztero-taśmowa):
 
# Taśma nr <math>\displaystyle 1</math> jest tylko do odczytu. Mamy na niej słowo <math>\displaystyle 3^k</math>.
# Taśma nr <math>\displaystyle 1</math> jest tylko do odczytu. Mamy na niej słowo <math>\displaystyle 3^k</math>.
# Rozpocznij od zapisania słowa <math>\displaystyle 11</math> na taśmie nr <math>\displaystyle 2</math> i słowa <math>\displaystyle 22</math> na taśmie nr <math>\displaystyle 3</math>
# Rozpocznij od zapisania słowa <math>\displaystyle 11</math> na taśmie nr <math>\displaystyle 2</math> i słowa <math>\displaystyle 22</math> na taśmie nr <math>\displaystyle 3</math>
Linia 32: Linia 32:
Idea tej maszyny jest bardzo prosta. Wykorzystaj taśmy nr <math>\displaystyle 2</math> (licznik 1) i <math>\displaystyle 3</math> (licznik 2) jako liczniki a na taśmie <math>\displaystyle 4</math> wykonuj symulacje.
Idea tej maszyny jest bardzo prosta. Wykorzystaj taśmy nr <math>\displaystyle 2</math> (licznik 1) i <math>\displaystyle 3</math> (licznik 2) jako liczniki a na taśmie <math>\displaystyle 4</math> wykonuj symulacje.
Zacznij od stanu liczników na <math>\displaystyle 2</math> i zwiększaj kolejno licznik 1 a po jego przepełnieniu zeruj go (do wartości początkowej <math>\displaystyle 2</math>)
Zacznij od stanu liczników na <math>\displaystyle 2</math> i zwiększaj kolejno licznik 1 a po jego przepełnieniu zeruj go (do wartości początkowej <math>\displaystyle 2</math>)
i zwiększ licznik <math>\displaystyle 2</math>. Gdy on także się przepełni, to iloczyn stanów liczników przekracza <math>\displaystyle k</math> zatem
i zwiększ licznik <math>\displaystyle 2</math>. Gdy on także się przepełni, to iloczyn stanów liczników przekracza <math>\displaystyle k</math> zatem można zakończyć generowanie ciągów.
można zakończyć generowanie ciągów.


W oczywisty sposób otrzymujemy, że ilość wymaganych kroków czasowych maszyny jest ograniczona przez wielomian (dla dużych <math>\displaystyle n</math>).
W oczywisty sposób otrzymujemy, że ilość wymaganych kroków czasowych maszyny jest ograniczona przez wielomian (dla dużych <math>\displaystyle n</math>). Dla małych <math>\displaystyle n</math> możemy zawsze rozbudować maszynę tak aby akceptowała słowa bez żadnego testowania.
Dla małych <math>\displaystyle n</math> możemy zawsze rozbudować maszynę tak aby akceptowała słowa bez żadnego testowania.
Zatem <math>\displaystyle L\in </math> '''P''' .
Zatem <math>\displaystyle L\in </math> '''P''' .
</div></div>
</div></div>
Linia 50: Linia 48:
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Bierzemy maszynę <math>\displaystyle MT_4</math> z wykładu konstruującą funkcję <math>\displaystyle 2n</math>. Dodajemy jedna dodatkową taśmę (oznaczmy taśmy przez <math>\displaystyle I</math> oraz <math>\displaystyle S</math>).
Bierzemy maszynę <math>\displaystyle MT_4</math> z wykładu konstruującą funkcję <math>\displaystyle 2n</math>. Dodajemy jedna dodatkową taśmę (oznaczmy taśmy przez <math>\displaystyle I</math> oraz <math>\displaystyle S</math>).
Drugą taśmę realizujemy poprzez rozszerzenie alfabetu. Jest to spowodowane faktem, że w definicji konstruowalności
Drugą taśmę realizujemy poprzez rozszerzenie alfabetu. Jest to spowodowane faktem, że w definicji konstruowalności pamięciowej wymagane jest istnienie jedno-taśmowej deterministycznej maszyny Turinga. Konstruujemy maszynę <math>\displaystyle \mathcal{M}</math> według schematu
pamięciowej wymagane jest istnienie jedno-taśmowej deterministycznej maszyny Turinga.
 
Konstruujemy maszynę <math>\displaystyle \mathcal{M}</math> według schematu
# Jeśli słowo wejściowe jest puste to stop.
# Jeśli słowo wejściowe jest puste to stop.
# Jeśli słowo wejściowe jest inne niż <math>\displaystyle 1^n</math> to odrzuć.
# Jeśli słowo wejściowe jest inne niż <math>\displaystyle 1^n</math> to odrzuć.
Linia 74: Linia 71:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
Wykorzystujemy trzy taśmy (<math>\displaystyle I</math>, <math>\displaystyle C</math>, <math>\displaystyle S</math>) oraz maszynę <math>\displaystyle \mathcal{M}</math> konstruującą pamięciowo funkcję <math>\displaystyle g(n)=3n</math>.
Wykorzystujemy trzy taśmy (<math>\displaystyle I</math>, <math>\displaystyle C</math>, <math>\displaystyle S</math>) oraz maszynę <math>\displaystyle \mathcal{M}</math> konstruującą pamięciowo funkcję <math>\displaystyle g(n)=3n</math>. Docelowa maszyna <math>\displaystyle \mathcal{N}</math> działa według schematu.
Docelowa maszyna <math>\displaystyle \mathcal{N}</math> działa według schematu.
 
# Jeśli słowo początkowe jest puste wypisz <math>\displaystyle 1</math> i zatrzymaj się. Inaczej wykonaj następny krok.
# Jeśli słowo początkowe jest puste wypisz <math>\displaystyle 1</math> i zatrzymaj się. Inaczej wykonaj następny krok.
# Jeśli słowo wejściowe jest inne niż <math>\displaystyle 1^n</math> to odrzuć.
# Jeśli słowo wejściowe jest inne niż <math>\displaystyle 1^n</math> to odrzuć.
Linia 106: Linia 103:
</math></center>
</math></center>


Jest to język regularny, więc
Jest to język regularny, więc rozpoznawany przez automat skończenie stanowy. Zatem do akceptacji tego języka wystarczy, aby maszyna przeszła taśmę z lewej strony do prawej według zasad:
rozpoznawany przez automat skończenie stanowy. Zatem do akceptacji tego języka wystarczy,
 
aby maszyna przeszła taśmę z lewej strony do prawej według zasad:
# Jeśli czytasz symbol <math>\displaystyle a</math> wypisz <math>\displaystyle a</math> i przejdź w prawo powtarzając ten krok. Jeśli czytasz <math>\displaystyle b</math> przejdź w prawo i wykonaj krok następny.
# Jeśli czytasz symbol <math>\displaystyle a</math> wypisz <math>\displaystyle a</math> i przejdź w prawo powtarzając ten krok. Jeśli czytasz <math>\displaystyle b</math> przejdź w prawo i wykonaj krok następny.
# Jeśli jesteś na ograniczniku to akceptuj, inaczej odrzuć.
# Jeśli jesteś na ograniczniku to akceptuj, inaczej odrzuć.
Linia 139: Linia 135:


{{cwiczenie|1.6||
{{cwiczenie|1.6||
W trakcie wykładu rozważaliśmy zamkniętość klas języków w
W trakcie wykładu rozważaliśmy zamkniętość klas języków w klasyfikacji Chomsky'ego ze względu na różne działania. Podaj uzasadnienie (ideę konstrukcji) następującego faktu:
klasyfikacji Chomsky'ego ze względu na różne działania. Podaj
 
uzasadnienie (ideę konstrukcji) następującego faktu:
Dla dowolnych maszyn Turinga <math>\displaystyle TM_1</math>, <math>\displaystyle TM_2</math> istnieje maszyna <math>\displaystyle \mathcal{M}</math> o własności:


Dla dowolnych maszyn Turinga <math>\displaystyle TM_1</math>, <math>\displaystyle TM_2</math> istnieje maszyna
<math>\displaystyle \mathcal{M}</math> o własności:
# <math>\displaystyle  L( \mathcal{M})=L(TM_1)\cup L(TM_2) </math>
# <math>\displaystyle  L( \mathcal{M})=L(TM_1)\cup L(TM_2) </math>
# <math>\displaystyle  L( \mathcal{M})=L(TM_1)\cap L(TM_2) </math>
# <math>\displaystyle  L( \mathcal{M})=L(TM_1)\cap L(TM_2) </math>
Linia 155: Linia 149:


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none">   
'''(Ad. 1)''' Konstruujemy maszynę dwu-taśmową która działa
'''(Ad. 1)''' Konstruujemy maszynę dwu-taśmową która działa według zasady:
według zasady:
 
# Kopiuj słowo wejściowe na taśmę nr 2. Symuluj kolejno jeden krok czasowy <math>\displaystyle TM_1</math> na taśmie <math>\displaystyle 1</math> i jeden krok <math>\displaystyle TM_2</math> na taśmie <math>\displaystyle 2</math>.
# Kopiuj słowo wejściowe na taśmę nr 2. Symuluj kolejno jeden krok czasowy <math>\displaystyle TM_1</math> na taśmie <math>\displaystyle 1</math> i jeden krok <math>\displaystyle TM_2</math> na taśmie <math>\displaystyle 2</math>.
# Jeśli któraś z maszyn zaakceptowała to akceptuj.
# Jeśli któraś z maszyn zaakceptowała to akceptuj.


'''(Ad. 2)''' Konstrukcja jest niemalże identyczne. Jedynie w
'''(Ad. 2)''' Konstrukcja jest niemalże identyczne. Jedynie w kroku (2) akceptujemy gdy obie maszyny zaakceptowały. Ponieważ może to się stać w różnych krokach czasowych, w momencie gdy jedna z maszyn zaakceptuje, kończymy jej symulację i symulujemy tylko drugą aż do momentu gdy zaakceptuje (o ile to nastąpi).
kroku (2) akceptujemy gdy obie maszyny zaakceptowały. Ponieważ może
to się stać w różnych krokach czasowych, w momencie gdy jedna z
maszyn zaakceptuje, kończymy jej symulację i symulujemy tylko drugą
aż do momentu gdy zaakceptuje (o ile to nastąpi).
</div></div>
</div></div>


Linia 218: Linia 208:
Zatem własność Posta zachodzi dla tej listy.
Zatem własność Posta zachodzi dla tej listy.


'''(Ad. 2)''' Dany ciąg nie ma własności Posta. bez względu na
'''(Ad. 2)''' Dany ciąg nie ma własności Posta. bez względu na kolejność indeksów pierwsze ze słów zawsze jest postaci <math>\displaystyle a^k</math> a drugi <math>\displaystyle b^j</math> dla pewnych <math>\displaystyle k,j>0</math>. Ale zawsze <math>\displaystyle a^k \neq b^j</math> czyli własność Posta nie może zachodzić.
kolejność indeksów pierwsze ze słów zawsze jest postaci <math>\displaystyle a^k</math> a
drugi <math>\displaystyle b^j</math> dla pewnych <math>\displaystyle k,j>0</math>. Ale zawsze <math>\displaystyle a^k \neq b^j</math> czyli
własność Posta nie może zachodzić.


'''(Ad. 3)''' Rozważmy ciąg indeksów <math>\displaystyle (4,2,3,2,3,1,1)</math>.
'''(Ad. 3)''' Rozważmy ciąg indeksów <math>\displaystyle (4,2,3,2,3,1,1)</math>.
Linia 245: Linia 232:
{{cwiczenie|1.8||
{{cwiczenie|1.8||
W definicji problemu Posta zakłada się, że alfabet <math>\displaystyle \mathcal{A}</math>
W definicji problemu Posta zakłada się, że alfabet <math>\displaystyle \mathcal{A}</math>
zawiera co najmniej dwa elementy. Wykaż, że gdy to założenie nie
zawiera co najmniej dwa elementy. Wykaż, że gdy to założenie nie jest spełnione (tzn. <math>\displaystyle \mathcal{A}=\left\{1\right\}</math>) problem Posta jest problemem rozstrzygalnym.
jest spełnione (tzn. <math>\displaystyle \mathcal{A}=\left\{1\right\}</math>) problem Posta jest
problemem rozstrzygalnym.
}}
}}


<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none">   
Rozważ dwa przypadki, zależnie od tego czy lista zawiera tylko pary
Rozważ dwa przypadki, zależnie od tego czy lista zawiera tylko pary słów postaci <math>\displaystyle (a^k,a^j)</math>, gdzie <math>\displaystyle k>j</math> (lub tylko <math>\displaystyle k<j</math>) czy też jeszcze jakieś inne pary słów.
słów postaci <math>\displaystyle (a^k,a^j)</math>, gdzie <math>\displaystyle k>j</math> (lub tylko <math>\displaystyle k<j</math>) czy też
jeszcze jakieś inne pary słów.
</div></div>
</div></div>


Linia 260: Linia 243:
<math>\displaystyle \mathcal{A}</math>. Przedstawimy algorytm sprawdzający czy lista ma
<math>\displaystyle \mathcal{A}</math>. Przedstawimy algorytm sprawdzający czy lista ma
własność Posta.
własność Posta.
# Jeśli lista zawiera parę <math>\displaystyle (1^k,1^k)</math> to mamy własność Posta.
# Jeśli lista zawiera parę <math>\displaystyle (1^k,1^k)</math> to mamy własność Posta.
# Jeśli jedyne pary to takie w których <math>\displaystyle (u_i,v_i)=(1^{k_i},1^{l_i})</math> oraz <math>\displaystyle k_i>l_i</math> (lub <math>\displaystyle k_i<l_i</math>) dla
# Jeśli jedyne pary to takie w których <math>\displaystyle (u_i,v_i)=(1^{k_i},1^{l_i})</math> oraz <math>\displaystyle k_i>l_i</math> (lub <math>\displaystyle k_i<l_i</math>) dla
Linia 268: Linia 252:
<center><math>\displaystyle (u_i,v_i)=(1^k,1^l)\quad , \quad (u_j,v_j)=(1^p,1^q) </math></center>
<center><math>\displaystyle (u_i,v_i)=(1^k,1^l)\quad , \quad (u_j,v_j)=(1^p,1^q) </math></center>


przy czym <math>\displaystyle k<l</math> i <math>\displaystyle p>q</math>. W tej sytuacji zachodzi własność Posta.
przy czym <math>\displaystyle k<l</math> i <math>\displaystyle p>q</math>. W tej sytuacji zachodzi własność Posta. Uzasadnienie jest następujące. Biorąc ciąg:
Uzasadnienie jest następujące. Biorąc ciąg:
<center><math>\displaystyle  
<center><math>\displaystyle  
\begin{array} {c c c}
\begin{array} {c c c}
Linia 295: Linia 278:
</math></center>
</math></center>


Dla danej listy, można rostrzygnąć w czasie wielomianowym który z
Dla danej listy, można rostrzygnąć w czasie wielomianowym który z przypadków (1), (2), (3) zachodzi. Otrzymaliśmy rostrzygalność problemu Posta dla tej sytuacji.
przypadków (1), (2), (3) zachodzi. Otrzymaliśmy rostrzygalność
problemu Posta dla tej sytuacji.
 
</div></div>
</div></div>



Wersja z 08:54, 24 sie 2006

1. ĆWICZENIA 13

Ćwiczenie 1.1

W trakcie wykładu rozważaliśmy język

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L=\left\{3^k\: : \: k=i\cdot j } dla pewnych Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle i,j> 1\right\} }

wykazując, że L NP .

Uzasadnij, że także
L P .
Wskazówka
Rozwiązanie

Ćwiczenie 1.2

Uzasadnij że funkcja s(n)=3n jest konstruowalna pamięciowo.

Wskazówka
Rozwiązanie

Ćwiczenie 1.3

Uzasadnij że funkcja s(n)=3n jest konstruowalna pamięciowo.

Wskazówka
Rozwiązanie

Ćwiczenie 1.4

Skonstruuj maszynę Turinga rozpoznającą język zadany gramatyką:

SaTb|b,TTa|1
Wskazówka
Rozwiązanie

Ćwiczenie 1.5

Przedstaw ideę działania maszyny Turinga rozpoznającej język

L={anb2nc3n:n>1}
Wskazówka
Rozwiązanie

Ćwiczenie 1.6

W trakcie wykładu rozważaliśmy zamkniętość klas języków w klasyfikacji Chomsky'ego ze względu na różne działania. Podaj uzasadnienie (ideę konstrukcji) następującego faktu:

Dla dowolnych maszyn Turinga TM1, TM2 istnieje maszyna o własności:

  1. L()=L(TM1)L(TM2)
  2. L()=L(TM1)L(TM2)
Wskazówka
Rozwiązanie

Ćwiczenie 1.7

Czy któraś z poniższych list słów ma własność Posta?

  1. (u1,v1)=[a2a2b],(u2,v2)=[b2ba],(u3,v3)=[ab2b]
  2. (u1,v1)=[ab2],(u2,v2)=[a2b]
  3. (u1,v1)=[baabab],(u2,v2)=[ba],(u3,v3)=[abab],(u4,v4)=[aaa]
Rozwiązanie

Ćwiczenie 1.8

W definicji problemu Posta zakłada się, że alfabet 𝒜 zawiera co najmniej dwa elementy. Wykaż, że gdy to założenie nie jest spełnione (tzn. 𝒜={1}) problem Posta jest problemem rozstrzygalnym.

Wskazówka
Rozwiązanie

2. Zadania domowe

Ćwiczenie 2.1

Zadanie domowe 2.1 do wykładu 12 polegało na konstrukcji maszyny Turinga 𝒯 akceptującej język:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L_1=\left\{www\: : \: w\in \left\{\circ,\bullet,\star\right\}^*\right\} }

Zmodyfikuj, ewentualnie, tę konstrukcję 𝒯 aby udowodnić L1 P .

Ćwiczenie 2.2

Zadanie domowe 2.2 do wykładu 12 polegało na konstrukcji niedeterministycznej maszyny Turinga 𝒩𝒯 akceptującej język:

Parser nie mógł rozpoznać (błąd składni): {\displaystyle \displaystyle L_2=\left\{w_1 w_1 w_2 w_2 \dots w_n w_n \: : \: w_i \in \left\{\circ,\bullet\right\}^+, n>0 \right\} }

Zmodyfikuj, ewentualnie, tę konstrukcję 𝒩𝒯 aby udowodnić, że L2 NP .

Podpowiedź: wykorzystaj konstrukcję z wyrocznią. Dla słowa wejściowego w przeprowadź weryfikację w trzech etapach: konstrukcja słów w1,,wn gdzie n<|w| (wyrocznia), sklejanie, weryfikacja czy w=w1w1w2w2wnwn.

Ćwiczenie 2.3

Uzasadnij, że jeśli funkcja s(n) jest konstruowalna pamięciowo to obliczenie d1*d2 z definicji konstruowalności pamięciowej (tzn. d1=s01n, d2=s11s(n)w) następuję w conajwyżej c2s(n) krokach gdzie c jest pewną stałą niezależną od n.
Podpowiedź: przeanalizuj ilość możliwych konfiguracji.

Ćwiczenie 2.4

Uzasadnij że funkcja n3 jest konstruowalna pamięciowo.

Ćwiczenie 2.5

Skonstruuj maszynę Turinga akceptującą słowo u=1n w dokładnie n2 krokach. Jak zmodyfikować konstrukcję maszyny aby akceptowała słowo u dokładnie w 2n krokach?

Ćwiczenie 2.6

Wypisz dokładnie wszystkie elementy składowe maszyn Turinga rozpoznających języki zadane gramatykami:

  1. SAbC , AaAb|ε, CbCc|ε
  2. SABACA,AAa|a,Bbb|b,Cc|ε

Ćwiczenie 2.7

Wykaż (podając ideę kontrukcji) że dla maszyn Turinga TM1, TM2 istnieje maszyna Turinga rozpoznająca język:

L()={uv:uL(TM1),vL(TM2)}

Ćwiczenie 2.8

Czy któraś z poniższych list słów ma własność Posta?

  1. (u1,v1)=[aa2b],(u2,v2)=[ba2a2]
  2. (u1,v1)=[aba],(u2,v2)=[aba2]
  3. (u1,v1)=[aaaa],(u2,v2)=[bba](u3,v3)=[bbb](u4,v4)=[baab]

Ćwiczenie 2.9

Udowodnij Twierdzenie 2.1 z wykładu:

Twierdzenie. Dla każdej gramatyki istnieje równoważna gramatyka tego samego typu taka, że każda produkcja, w której występuje symbol terminalny a , jest postaci va .