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