problem stopu i inne problemy nierozstrzygalne

advertisement
PROBLEM STOPU
I INNE PROBLEMY
NIEROZSTRZYGALNE
Autor
slawekj
Problem stopu i inne problemy nierozstrzygalne
1 SPIS TREŚCI
2
Temat pracy .......................................................................................................................................... 3
3
Rozstrzygalność problemów i obliczalność funkcji ............................................................................... 3
4
5
3.1
Definicja 1.0 .................................................................................................................................. 3
3.2
Twierdzenie 1.0 ............................................................................................................................. 3
3.3
Dowód twierdzenia 1.0 (szkic): ..................................................................................................... 4
3.4
Teza 1.0 ......................................................................................................................................... 5
3.5
Wniosek 1.0................................................................................................................................... 5
3.1
Kodowanie maszyny Turinga ........................................................................................................ 6
Twierdzenie Rice’a ................................................................................................................................ 6
4.1
Definicja ........................................................................................................................................ 6
4.2
Problemy ....................................................................................................................................... 6
4.3
Wnioseki........................................................................................................................................ 6
Przykłady Funkcji Rekurencyjnych ........................................................................................................ 6
Problem stopu i inne problemy nierozstrzygalne
2 TEMAT PRACY
……………………………………………………………..
3 ROZSTRZYGALNOŚĆ PROBLEMÓW I OBLICZALNOŚĆ FUNKCJI
Łatwo sprawdzić, że rożnych maszyn Turinga jest ℵ0, czyli tyle, co liczb naturalnych.
Z drugiej strony, dla niepustego i skończonego alfabetu Σ, zbiór Σ∗ wszystkich słów nad
tym alfabetem ma moc ℵ0, a języków zawierających te słowa jest 2ℵ0 = c, czyli continuum, to
znaczy znacznie więcej niż maszyn Turinga. Tak więc nie każdy język posiada rozpoznającą
go maszynę; i nie do każdego można skonstruować rozpoznający go program komputerowy.
Każdy tzw. problem decyzyjny, czyli pytanie, na które maszyna (lub komputer) miałyby
odpowiedzieć „tak” lub „nie”, daje się sprowadzić do sprawdzenia należenia słów do pewnego
języka1. Różnica między mocą zbioru języków oraz mocą zbioru maszyn Turinga określa granicę
możliwości komputerów: zawsze będą one potrafiły odpowiedzieć tylko na ℵ0 pytań, czyli na
niewielką część tego, czego nie wiadomo.
Podobnie ma się sprawa z obliczaniem wartości funkcji. Wszystkich funkcji z N do N jest
ℵ0ℵ0 = c, czyli znowu continuum. Wobec tego daleko nie wszystkie funkcje dadzą się
zaprogramować za pomocą maszyny Turinga; w związku z tym również nie dadzą się
zaprogramować w żadnym języku na żadnym komputerze.
Tych nierozstrzygalnych problemów i nieobliczalnych funkcji jest znacznie więcej niż
rozstrzygalnych i obliczalnych, jednak wskazanie konkretnego takiego problemu lub funkcji nie
jest proste. Poniżej podany jest szkic konstrukcji ważnego problemu nierozstrzygalnego.
3.1 DEFINICJA 1.0
Problem L (równoważnie: podzbiór L ⊆ Σ∗) nazywamy rozstrzygalnym jeśli istnieje maszyna
Turinga M, taka że L = L(M). Analogicznie, funkcję nazywamy obliczalną lub rekurencyjną,
jeśli istnieje obliczająca ją maszyna Turinga.
3.2 TWIERDZENIE 1.0
Problem stopu maszyny Turinga, to znaczy problem, czy dana maszyna Turinga M kończy
obliczenie dla danego słowa w ∈ Σ∗ na taśmie, jest nierozstrzygalny. Tzn. nie istnieje maszyna
Turinga S, która potrafiłaby zbadać dowolną maszynę Turinga M oraz dowolne dane w (obie
Problem stopu i inne problemy nierozstrzygalne
rzeczy jakoś zakodowane na taśmie wejściowej dla S), zatrzymać się i poprawnie odpowiedzieć
a pytanie, czy M zatrzymuje się na w.
3.3 DOWÓD TWIERDZENIA 1.0 (SZKIC):
Łatwiej mówić o programach komputerowych analizujących inne programy, niż o maszynach
Turinga, więc tego będę się trzymał. Ale dla pełnego dowodu należałoby rozważać maszyny
Turinga.
Załóżmy więc, że problem stopu jest rozstrzygalny; mamy więc taki
program komputerowy S w jakimś języku programowania, który jako
dane bierze dowolny tekst programu P w tym języku oraz dowolne
dane w, chwilę działa, następnie zatrzymuje się, i drukuje poprawną
odpowiedź na pytanie, czy program P na danych w kończy obliczenie,
czy też działa nieskończenie długo. Skonstruujmy program R przez
dobudowanie do programu S:
• „podwajacza danych”, który tworzy dwie kopie podanych mu na wejściu
danych, i doczepmy go do obu wejść programu; w ten sposób program R
będzie wczytywał tekst programu P i sprawdzał, czy program P zatrzymuje się na swoim łasnym
tekście;
• ślepą pętlę, i doczepmy ją do wyjścia „stop”.
Wobec tego, jeśli program P zatrzymuje się na swoim tekście, to program R na tekście programu
P się zapętla; a w przeciwnym razie zatrzymuje się (i drukuje wynik „pętla”). I w końcu
sprawdźmy, jak zachowuje się program R na swoim własnym tekście; to znaczy
wykonajmy go z R zamiast P. Są dwie możliwości:
• albo R zatrzymuje się na R; wtedy S powinien dać wynik „stop”; tak więc R wchodzi w
ślepą pętlę — sprzeczność;
• albo R zapętla się na R; wtedy S powinien dać wynik „pętla”, ważne, że zatrzymać się i
dać wynik; tak więc R zatrzymuje się — znowu sprzeczność.
W każdym przypadku dostajemy sprzeczność. To dowodzi, że oryginalny program S nie
może istnieć.
Załóżmy, że istnieje funkcja s(p,w), która na każdych danych zatrzymuje się i
stwierdza, czy obliczenie p(w) jest skończone. Definiujemy funkcję
fun r(p) :
if s(p, p) then {while true do od} /∗ ślepa pętla ∗/
else return true;
fi
Czy obliczenie r(r) się zatrzymuje?
Rys. 1.2: Programistyczna wersja dowodu tw. 1.0.
Problem stopu i inne problemy nierozstrzygalne
3.4 TEZA 1.0
Dla każdej funkcji f, której wartości dają się efektywnie obliczać dowolnymi sposobami, istnieje
maszyna Turinga obliczająca f.
Ta teza oczywiście nie jest twierdzeniem i nie daje się dowieść, bo nie posiadamy żadnej ogólnej
definicji „liczenia" niezależnej od pojęcia maszyny Turinga oraz od innych mechanizmów jej
równoważnych. Jest to raczej teza filozoficzna, poparta tym, że jak dotąd nikomu nie udało się
wymyślić żadnego przykładu czegoś, co sensownie można by nazwać obliczaniem, co nie
byłoby wykonalne na jakiejś maszynie Turinga.
W szczególności wszystko, co daje się zaprogramować w dowolnym języku na komputer o
dowolnej architekturze, daje się również policzyć przy pomocy jakiejś maszyny Turinga.
Zachodzi też zależność odwrotna: jeśli abstrahować od skończoności pamięci komputerów, to
każdy imperatywny język programowania ogólnego zastosowania, taki jak Pascal, C lub Java,
ma pełną moc maszyn Turinga. Natomiast niekoniecznie mają ją języki wąsko specjalizowane,
takie jak HTML (język opisu witryn internetowych) lub SQL (język zapytań baz danych).
Znaczenie poznawcze maszyn Turinga wynika z tego, że
• stanowią one uniwersalny model obliczeń, oraz
• są koncepcyjnie proste, znacznie prostsze niż istniejące języki programowania, czy architektury
istniejących komputerów.
Dlatego każdy nowy model obliczeń zwyczajowo porównujemy z maszynami Turinga. Jeśli
okaże się, że potrafi on zasymulować każdą maszynę Turinga, to uważamy, że lepiej już być nie
może.
3.5 WNIOSEK 1.0
Żaden język, dla którego problem stopu jest rozstrzygalny, nie może mieć pełnej mocy
maszyn Turinga (czyli: nie może być zupełny w sensie Turinga).
Twierdzenie 1.0 oraz wniosek 1.0 wykluczają możliwość, że kiedyś, w wyniku rozwoju
informatyki, programiści będą mogli wykrywać niebezpieczeństwo ślepych pętli w programach
za pomocą innych programów; przynajmniej jeśli teza 1.0 jest prawdziwa. Jest to możliwe tylko
dla bardzo „słabych” języków, w których nie da się wiele zaprogramować.
Ale to twierdzenie nie oznacza, że nigdy nie możemy wiedzieć, czy dany program się
zatrzyma. Nie istnieje metoda ogólna, stosująca się do wszystkich programów, ale w konkretnym
przypadku możemy umieć zbadać własności konkretnego programu. Twierdzenie 1.0 nie
wyklucza też istnienia programu, który zawsze prawidłowo orzeka o zatrzymywaniu się innych
programów, ale z rzadka poddaje się i mówi „nie wiem”.
Każda nauka powinna znać swoje możliwości i ograniczenia. Twierdzenie 1.0 ma poważne
konsekwencje w ustalaniu granic informatyki. Z nierozstrzygalności własności stopu dla
maszyn Turinga wyprowadza się bardzo wiele innych twierdzeń o nierozstrzygalności.
Nierozstrzygalne są między innymi
Problem stopu i inne problemy nierozstrzygalne
• uniwersalny problem stopu — czy dany program zatrzymuje się dla wszystkich danych;
• problem równoważności programów — czy dwa dane programy dają te same wyniki na
każdych danych;
• problem Rice’a — czy funkcja obliczana przez dany program ma daną własność (dla
każdej „sensownej” nietrywialnej własności).
Twierdzenie 1.0 ma bardzo bliski związek ze słynnym twierdzeniem Gödla o niezupełności
aksjomatyzacji arytmetyki. Oba twierdzenia są negatywne, czyli stwierdzają niemożność
zrobienia czegoś. I dla dowodu obu stosuje się t.zw. rozumowanie przekątniowe, które trochę
przypomina wyciąganie siebie samego za włosy z bagna. Nietrudno jest wykazać równoważność
obu twierdzeń.
3.1 KODOWANIE MASZYNY TURINGA
…………………
4 TWIERDZENIE RICE’A
4.1 DEFINICJA
……….
4.2 PROBLEMY
……….
4.3 WNIOSEKI
……….
5 PRZYKŁADY FUNKCJI REKURENCYJNYCH
6 INNE PROBLEMY NIEROZSTRZYGALNE
Problem stopu i inne problemy nierozstrzygalne
Download