Podsumowanie: Zgodnie z twierdzeniem Rice'a wszystko jest niemożliwe. A jednak cały czas robię to , jak się wydaje, rzeczy niemożliwe !
Oczywiście twierdzenie Rice'a nie mówi po prostu „wszystko jest niemożliwe”. Mówi coś bardziej szczegółowego: „Każda właściwość programu komputerowego jest niepoliczalna”.
(Jeśli chcesz podzielić włosy, każdą właściwość „nietrywialną”. To znaczy właściwości, które posiadają wszystkie programy lub które nie posiadają żadnych programów, można w prosty sposób obliczyć. Ale żadnej innej właściwości nie można obliczyć.)
Właśnie to twierdzenie mówi lub wydaje się mówić. I przypuszczalnie duża liczba bardzo inteligentnych ludzi dokładnie zweryfikowała poprawność tego twierdzenia. Ale wydaje się całkowicie przeciwstawić logice! Istnieje wiele właściwości programów, których obliczenia są trywialne !! Na przykład:
Ile kroków wykonuje program przed zatrzymaniem? Decyzja, czy liczba ta jest skończona czy nieskończona, jest właśnie problemem zatrzymania, którego nie można obliczyć. Decyzja, czy liczba ta jest większa czy mniejsza niż jakieś skończone jest banalna! Wystarczy uruchomić program na maksymalnie kroków i sprawdzić, czy się zatrzyma, czy nie. Łatwy!
Podobnie, czy program wykorzystuje więcej lub mniej niż jednostek pamięci w pierwszych krokach wykonania? Trywialnie obliczalne.
Czy tekst programu wspomina o zmiennej o nazwie ? Trywialna analiza tekstowa ujawni odpowiedź.
Czy program wywołuje polecenie ? Ponownie zeskanuj tekst programu w poszukiwaniu nazwy tego polecenia.
Widzę wiele właściwości, które również wyglądają na nieobliczalne; np. ile dodatków wykonuje pełne uruchomienie programu? Cóż, to prawie tak samo, jak pytanie, ile kroków wykonuje program, co jest praktycznie problemem zatrzymania. Ale wygląda na to, że istnieje mnóstwo właściwości programu, które naprawdę, bardzo łatwo jest obliczyć. A jednak twierdzenie Rice'a twierdzi, że żadnego z nich nie da się obliczyć.
Czego tu brakuje?
źródło
Odpowiedzi:
Na potrzeby tej dyskusji „program” jest fragmentem kodu, który zawsze przyjmuje liczbę całkowitą jako dane wejściowe i albo działa wiecznie, albo zwraca liczbę całkowitą. Mówimy, że dwa programy i są extensionally równać , jeśli obliczyć tę samą funkcję, czyli dla każdej liczby albo zarówno i prowadzony na zawsze, albo oboje kończą i wyjście tego samego numeru.g n f ( n ) g ( n )fa sol n fa( n ) sol( n )
Ekstensjonalny nieruchomość programów jest własność , który szanuje ekstensjonalny równość, czyli jeśli i są extensionally równe wtedy albo obie mają własność lub oba nie mają.fP. fa sol P.
Oto kilka przykładów właściwości innych niż wymiarowe:
k
. (Możemy zmieniać nazwy zmiennych).Jestem pewien, że zauważyłeś, że dokładnie wymieniałem twoje rzekome kontrprzykłady na twierdzenie Rice'a:
Istnieje inny sposób na wyjaśnienie tego: musisz odróżnić program od funkcji, którą oblicza. Wiele różnych programów oblicza tę samą funkcję (wszystkie są na ogół równe). Twierdzenie Rice'a dotyczy właściwości funkcji, a nie właściwości programów, które je obliczają.
źródło
Podstawowe nieporozumienie:
Nie o tym mówi twierdzenie Rice'a. Mówi o właściwościach funkcji i że zestaw programów obliczających tę funkcję nie jest rozstrzygalny. Formalnie, biorąc pod uwagę zestaw∅ ⊂ P.⊂ R E
nie podlega rozstrzygnięciu. Dla wymienionych właściwości nie znajdziesz odpowiedniego dla którego zestaw programów ma ten formularz. Niektóre programy dla jednej funkcji mogą mieć właściwość, podczas gdy inne (dla tej samej funkcji) mogą nie mieć. Zobacz tutaj kilka przykładów.P.
Twierdzenie Rice'a dotyczy właściwości semantycznych (właściwości funkcji obliczonej przez program, np. Dziedziny lub zakresu wartości). To, o czym mówisz, to właściwości składniowe (właściwości programu , takie jak środowisko wykonawcze lub liczba używanych zmiennych).
Wydaje się, że niewiele wiadomo na temat właściwości składniowych; zobacz to pytanie .
źródło