W skrócie : Algorytm jest konstruktywną częścią konstruktywnego dowodu, że dany problem ma rozwiązanie. Motywacją dla tej definicji jest izomorfizm Curry-Howarda między programami i dowodami, biorąc pod uwagę, że program ma interes tylko wtedy, gdy rozwiązuje problem, ale możliwe do udowodnienia. Ta definicja pozwala na więcej abstrakcji i pozostawia pewne drzwi otwarte w odniesieniu do rodzaju domen, które mogą dotyczyć, na przykład w odniesieniu do właściwości skończoności.
Ostrzeżenie . Próbuję znaleźć odpowiednie formalne podejście do odpowiedzi na pytanie. Myślę, że jest to konieczne, ale wydaje się, że żaden z użytkowników, którzy do tej pory odpowiedzieli (w tym ja, a niektórzy byli mniej lub bardziej wyraźnie na ten temat w innych postach), nie ma odpowiedniego tła do prawidłowego opracowania problemów związanych z konstruktywna matematyka, teoria dowodów, teoria typów i takie wyniki, jak izomorfizm Curry-Howarda między dowodami a programami. Robię, co w mojej mocy, tutaj, z wszelkimi fragmentami wiedzy, które posiadam (jak sądzę), i jestem zbyt świadomy ograniczeń tej odpowiedzi. Mam tylko nadzieję, że dam kilka wskazówek, jak według mnie powinna wyglądać odpowiedź. Jeśli zauważysz jakikolwiek punkt, który jest wyraźnie niewłaściwy formalnie (możliwe do udowodnienia), proszę pozwolić mi teraz w komentarzu - lub przez e-mail.
Określanie niektórych problemów
Standardowym sposobem rozważenia algorytmu jest stwierdzenie, że algorytm jest dowolnym, ściśle określonym programem dla niektórych urządzeń komputerowych , w tym również tych, które nie mają żadnych ograniczeń pamięci. Językiem może być również język maszynowy. W rzeczywistości wystarczy rozważyć wszystkie programy dla kompletnego urządzenia komputerowego Turinga (co oznacza brak ograniczeń pamięci). Może nie dać ci wszystkich prezentacji algorytmów, w tym sensie, że algorytmy muszą być wyrażone w formie zależnej w szczegółach od kontekstu interpretacyjnego, nawet teoretycznego, ponieważ wszystko jest zdefiniowane do pewnego kodowania. Ale ponieważ obliczy wszystko, co należy obliczyć, obejmie jakoś wszystkie algorytmy, aż do kodowania.
π
π, prawdopodobnie w sensie matematycznym prawie wszystkich. Wymagałoby to jednak większej precyzji w definicjach.
Prawdziwe pytanie brzmi więc, jakie są sensowne algorytmy. Odpowiedź jest taka, że znaczącymi algorytmami są te, które rozwiązują problem, obliczając krok po kroku „rozwiązanie”, „odpowiedź” na ten problem. Algorytm jest interesujący, jeśli jest powiązany z problemem, który rozwiązuje.
Biorąc pod uwagę formalny problem, jak uzyskać algorytm, który rozwiązuje problem. Algorytmy są jawne lub niejawne związane z ideą rozwiązania problemu, co można udowodnić. To, czy nasze techniki dowodowe są dokładne, to inna sprawa, ale staramy się przynajmniej przekonać samych siebie. Jeśli ograniczysz się do matematyki konstruktywnej, co jest właściwie tym, co musimy zrobić (i jest to bardzo akceptowalne ograniczenie aksomatyczne dla większości matematyki), sposobem udowodnienia istnienia rozwiązania jest przejście przez etapy sprawdzające, które faktycznie wykazują konstrukcję który reprezentuje rozwiązanie, w tym ewentualnie inne kroki, które potwierdzają jego poprawność.
Wszyscy programiści myślą coś w stylu: jeśli majstruję przy danych w taki i taki sposób, to otrzymuję ten widget, który ma właściwe właściwości ze względu na twierdzenie Sezamu, i przeprowadzając tę transformację zachowującą foo, otrzymuję pożądaną odpowiedź . Ale dowód jest zwykle nieformalny i nie opracowujemy wszystkich szczegółów, co tłumaczy, dlaczego satelita próbował między innymi okrążyć Marsa pod ziemią (między innymi). Rozważamy większość argumentacji, ale w rzeczywistości zachowujemy tylko konstruktywną część, która buduje rozwiązanie, i opisujemy to w języku komputerowym jako algorytm, który rozwiązuje problem.
Interesujące algorytmy (lub programy)
Wszystko to miało na celu wprowadzenie następujących pomysłów, które są przedmiotem wielu aktualnych badań (których nie jestem specjalistą). Pojęcie „ interesującego algorytmu ” stosowane tutaj jest moje, wprowadzone jako nieformalny symbol zastępczy dla dokładniejszych definicji.
Ciekawy algorytm jest konstruktywną częścią konstruktywnego dowodu, że dany problem ma rozwiązanie . Oznacza to, że dowód musi faktycznie wykazywać rozwiązanie, a nie po prostu udowodnić jego istnienie, na przykład przez zaprzeczenie. Aby uzyskać więcej informacji, zobacz Logika intuicyjna i konstruktywizm w matematyce.
Jest to oczywiście bardzo restrykcyjna definicja, która uwzględnia tylko to, co nazwałem interesującymi algorytmami. Dlatego ignoruje prawie wszystkie z nich. Ale podobnie robią wszystkie nasze podręczniki na temat algorytmu. Próbują uczyć tylko niektórych interesujących.
Biorąc pod uwagę wszystkie parametry problemu (dane wejściowe), krok po kroku informuje, jak uzyskać określony wynik. Typowym przykładem jest rozdzielczość równań ( algorytm nazwy faktycznie pochodzi od imienia perskiego matematyka Muhammada ibna Muszy al-Khwārizmiego , który badał rozdzielczość niektórych równań). Części dowodu służą do ustalenia, że niektóre wartości obliczone w algorytmie mają pewne właściwości, ale te części nie muszą być przechowywane w samym algorytmie.
Oczywiście musi się to odbywać w ramach sformalizowanej ramy logicznej, która określa, z czym są obliczane dane, jakie są dozwolone podstawowe kroki obliczeniowe i jakie są używane aksjomaty.
Wracając do silnego przykładu, można go interpretować jako algorytm, choć trywialny. Normalna funkcja silnia odpowiada dowodowi, że biorąc pod uwagę pewną strukturę arytmetyczną i liczbę całkowitą n, istnieje liczba, która jest iloczynem pierwszych n liczb całkowitych. Jest to dość proste, podobnie jak obliczenia czynnikowe. Może być bardziej złożony w przypadku innych funkcji.
Teraz, jeśli zdecydujesz się na zestawienie silni, zakładając, że możesz, co nie jest prawdą dla wszystkich liczb całkowitych (ale może być prawdą dla niektórych skończonych domen wartości), wszystko, co robisz, to uwzględnienie w swoich aksjomatach istnienia silni przez zdefiniowanie za pomocą nowy aksjomat jego wartość dla każdej liczby całkowitej, abyś już nie musiał niczego udowadniać (a więc obliczać).
Ale system aksjomatów ma być skończony (lub przynajmniej skończony). I istnieje nieskończona liczba wartości dla silni, jedna na liczbę całkowitą. Masz więc problem z skończonym systemem aksjomatów, jeśli aksjatyzujesz funkcję nieskończoną, tj. Zdefiniowaną w domenie nieskończonej. Przekłada się to obliczeniowo na fakt, że twoje przyszłe wyszukiwanie tabeli nie może być zaimplementowane dla wszystkich liczb całkowitych. To zabiłoby zwykły wymóg skończoności dla algorytmów (ale czy ma być tak rygorystyczny, jak często jest przedstawiany?).
Możesz zdecydować się na zdefiniowany generator aksjomatów do obsługi wszystkich przypadków. Oznaczałoby to mniej więcej włączenie standardowego programu silniakowego do algorytmu w celu zainicjowania tablicy w razie potrzeby. Nazywa się to zapamiętywaniem przez programistów. Jest to faktycznie najbliższy odpowiednik wstępnie obliczonej tabeli. Można zrozumieć, że ma wstępnie obliczoną tabelę, z wyjątkiem faktu, że tabela jest faktycznie tworzona w leniwym trybie oceny , gdy jest to potrzebne. Ta dyskusja prawdopodobnie wymagałaby nieco bardziej formalnej opieki.
Możesz zdefiniować swoje prymitywne operacje według własnego uznania (w ramach zgodności z formalnym systemem) i przypisać im dowolne koszty wybrane podczas korzystania z algorytmu, aby przeprowadzić analizę złożoności lub wydajności. Ale jeśli konkretne systemy, które faktycznie implementują twój algorytm (na przykład komputer lub mózg) nie są w stanie spełnić tych specyfikacji kosztów, twoja analiza może być interesująca intelektualnie, ale jest bezwartościowa do rzeczywistego wykorzystania w prawdziwym świecie.
21000
Jakie programy są interesujące
Ta dyskusja powinna być lepiej powiązana z wynikami, takimi jak
izomorfizm Curry-Howarda między programami i dowód. Jeśli jakikolwiek program jest faktycznie dowodem czegoś, każdy program może być interpretowany jako interesujący program w rozumieniu powyższej definicji.
Jednak, według mojego (ograniczonego) zrozumienia, ten izomorfizm jest ograniczony do programów, które można dobrze pisać w odpowiednim systemie pisania, gdzie typy odpowiadają twierdzeniom teorii aksjomatycznej. Dlatego nie wszystkie programy można zakwalifikować jako interesujące programy. Domyślam się, że w tym sensie algorytm powinien rozwiązać problem.
Prawdopodobnie wyklucza to większość „losowo generowanych” programów.
Jest to również nieco otwarta definicja „interesującego algorytmu”. Każdy program, który można uznać za interesujący, jest zdecydowanie taki, ponieważ istnieje zidentyfikowany system typów, który sprawia, że jest interesujący. Ale program, który do tej pory nie był dostępny do pisania, może stać się do pisania z bardziej zaawansowanym systemem typów, a tym samym stać się interesujący. Mówiąc dokładniej, zawsze było to interesujące, ale z powodu braku wiedzy na temat właściwego systemu typów nie mogliśmy go poznać.
Wiadomo jednak, że nie wszystkie programy można pisać, ponieważ wiadomo, że niektóre wyrażenia lambda, takie jak implementacja kombinatora Y , nie mogą zostać wpisane w systemie typu dźwięku .
Ten widok dotyczy tylko formalności programistycznych, które można bezpośrednio powiązać z jakimś systemem dowodu aksjomatycznego. Nie wiem, jak można ją rozszerzyć na formalizacje obliczeniowe niskiego poziomu, takie jak Maszyna Turinga. Ponieważ jednak algorytm i obliczalność to często gra polegająca na kodowaniu problemów i rozwiązań (pomyśl o arytmetyki zakodowanej w rachunku lambda ), można wziąć pod uwagę, że każde formalnie zdefiniowane obliczenie, które można przedstawić jako kodowanie algorytmu, jest również algorytmem. Takie kodowania prawdopodobnie wykorzystują tylko bardzo niewielką część tego, co można wyrazić w formalizmie niskiego poziomu, takim jak Maszyny Turinga.
Jednym z zainteresowań tego podejścia jest to, że daje ono pojęcie algorytmu, które jest bardziej abstrakcyjne i niezależne od kwestii faktycznego kodowania, „fizycznej reprezentacji” dziedziny obliczeniowej. Można więc na przykład rozważyć domeny z nieskończonymi obiektami, o ile istnieje obliczeniowy sposób ich użycia.