Jak sprawdzisz, czy dwa algorytmy (powiedzmy: Sortuj i Naiwne) zwracają ten sam wynik dla dowolnego wejścia, gdy zestaw wszystkich danych wejściowych jest nieskończony?
Aktualizacja: Dziękuję Ben za opisanie, w jaki sposób niemożliwe jest algorytmiczne wykonanie tego przypadku w ogólnym przypadku. Odpowiedź Dave'a jest doskonałym podsumowaniem metod algorytmicznych i ręcznych (w zależności od ludzkiego rozumu i metafory), które nie zawsze działają, ale są dość skuteczne.
computability
formal-methods
software-engineering
software-verification
Andres Riofrio
źródło
źródło
Odpowiedzi:
W przeciwieństwie do tego, co mówią nie-mówcy, istnieje wiele skutecznych technik, aby to zrobić.
Bisimulacja to jedno podejście. Zobacz na przykład artykuł Gordona na temat koindukcji i programowania funkcjonalnego .
Innym podejściem jest wykorzystanie operacyjnych teorii równoważności programów, takich jak praca Pittsa .
Trzecim podejściem jest sprawdzenie , czy oba programy spełniają tę samą specyfikację funkcjonalną. Istnieją tysiące artykułów na temat tego podejścia.
Czwarte podejście polega na pokazaniu, że jeden program można przepisać na inny za pomocą transformacji programu dźwiękowego .
Oczywiście żadna z tych metod nie jest kompletna z powodu nierozstrzygalności, ale w celu rozwiązania tego problemu opracowano wiele prac.
źródło
Aby rozwinąć nieco stwierdzenia „to niemożliwe”, oto prosty szkic dowodu.
Możemy modelować algorytmy z wyjściem przez maszyny Turinga, które zatrzymują się wraz z wyjściem na taśmie. Jeśli chcesz mieć maszyny, które mogą się zatrzymać, akceptując z wyjściem na taśmie lub odrzucając (w takim przypadku nie ma wyjścia), możesz łatwo wymyślić kodowanie, które pozwala modelować te maszyny za pomocą „zatrzymaj lub nie zatrzymuj”, nie ma maszyn odrzuconych.
Załóżmy teraz, że mam algorytm P do określania, czy dwie takie bazy TM mają takie same dane wyjściowe dla każdego wejścia. Następnie, biorąc pod uwagę TM A i wejście X , mogę zbudować nową TM B, która działa w następujący sposób:
Teraz mogę uruchomić P na A i B . B nie zatrzymuje się na X , ale ma takie samo wyjście jak A dla wszystkich innych danych wejściowych, więc jeśli i tylko jeśli A nie zatrzyma się na X, te dwa algorytmy mają takie same dane wyjściowe dla każdego wejścia. Ale założono, że P jest w stanie stwierdzić, czy dwa algorytmy mają takie same dane wyjściowe dla każdego wejścia, więc jeśli mielibyśmy P , moglibyśmy stwierdzić, czy dowolna maszyna zatrzymuje się na dowolnym wejściu, co stanowi problem zatrzymania. Ponieważ wiadomo, że problem zatrzymania jest nierozstrzygalny, P nie może istnieć.
Oznacza to, że nie ma ogólnego (obliczalnego) podejścia do ustalenia, czy dwa algorytmy mają takie same dane wyjściowe, które zawsze działają, więc musisz zastosować rozumowanie specyficzne dla pary analizowanych algorytmów. Jednak w praktyce mogą istnieć metody obliczeniowe, które działają dla dużych klas algorytmów, a z pewnością istnieją techniki, których można użyć, aby wypracować dowód na konkretny przypadek. Odpowiedź Dave'a Clarke'a daje ci kilka istotnych rzeczy do obejrzenia tutaj. Wynik „niemożliwości” dotyczy tylko opracowania ogólnej metody, która rozwiąże problem raz na zawsze, dla wszystkich par algorytmów.
źródło
Zasadniczo jest to niemożliwe, ale wiele ograniczeń może to umożliwić. Na przykład możesz sprawdzić równoważność dwóch programów kodu prostego za pomocą BDD. Wykonanie symboliczne może obsługiwać wiele innych przypadków.
źródło
Niemożliwe jest opracowanie algorytmu, który ogólnie potwierdza tę równość. Wskazówka: redukcja problemu zatrzymania.
źródło