Języki, automaty i obliczenia/Ćwiczenia 13: Złożoność obliczeniowa.: Różnice pomiędzy wersjami
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: | ||
# <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
wykazując, że NP .
Uzasadnij, że takżeĆwiczenie 1.2
Uzasadnij że funkcja jest konstruowalna pamięciowo.
Ćwiczenie 1.3
Uzasadnij że funkcja jest konstruowalna pamięciowo.
Ćwiczenie 1.4
Skonstruuj maszynę Turinga rozpoznającą język zadany gramatyką:
Ćwiczenie 1.5
Przedstaw ideę działania maszyny Turinga rozpoznającej język
Ć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 , istnieje maszyna o własności:
Ćwiczenie 1.7
Czy któraś z poniższych list słów ma własność Posta?
Ć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. ) problem Posta jest problemem rozstrzygalnym.
2. Zadania domowe
Ćwiczenie 2.1
Zadanie domowe 2.1 do wykładu 12 polegało na konstrukcji maszyny Turinga akceptującej język:
Zmodyfikuj, ewentualnie, tę konstrukcję aby udowodnić P .
Ćwiczenie 2.2
Zadanie domowe 2.2 do wykładu 12 polegało na konstrukcji niedeterministycznej maszyny Turinga akceptującej język:
Zmodyfikuj, ewentualnie, tę konstrukcję aby udowodnić, że
NP .
Podpowiedź: wykorzystaj konstrukcję z wyrocznią. Dla słowa wejściowego przeprowadź weryfikację w trzech etapach: konstrukcja słów gdzie (wyrocznia), sklejanie, weryfikacja czy .
Ćwiczenie 2.3
Uzasadnij, że jeśli funkcja jest konstruowalna pamięciowo to obliczenie z definicji
konstruowalności pamięciowej (tzn. ,
) następuję w conajwyżej krokach gdzie jest pewną
stałą niezależną od .
Podpowiedź: przeanalizuj ilość możliwych konfiguracji.
Ćwiczenie 2.4
Uzasadnij że funkcja jest konstruowalna pamięciowo.
Ćwiczenie 2.5
Skonstruuj maszynę Turinga akceptującą słowo w dokładnie krokach. Jak zmodyfikować konstrukcję maszyny aby akceptowała słowo dokładnie w krokach?
Ćwiczenie 2.6
Wypisz dokładnie wszystkie elementy składowe maszyn Turinga rozpoznających języki zadane gramatykami:
- , ,
Ćwiczenie 2.7
Wykaż (podając ideę kontrukcji) że dla maszyn Turinga , istnieje maszyna Turinga rozpoznająca język:
Ćwiczenie 2.8
Czy któraś z poniższych list słów ma własność Posta?
Ć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 , jest postaci .