Czy istnieje krótka wyraźna konstrukcja uniwersalnej funkcji rekurencyjnej ? Wszystkie definicje, które widziałem, obejmują w pewien sposób numerację maszyn Turinga, co jest możliwe, ale wydaje się trudne i niemożliwe do zarządzania w języku programowania wyższego poziomu (takim jak Python, Haskell itp.)
9
Odpowiedzi:
Co powiesz na oryginalnego tłumacza Lispa McCarthy'ego (pierwotnie tutaj )? Jest uniwersalny, działa na naturalnym kodowaniu (Lisp AST), nie opiera się na zewnętrznym tłumaczu i ma około 20 linii.
źródło
Pewnie. Napisz procedury, które obliczają każdą z prymitywnych funkcji rekurencyjnych Godela , i napisz procedurę dla nieograniczonego operatora wyszukiwania. Zestaw funkcji, które można obliczyć w ten sposób, jest równoważny zestawowi funkcji, które mogą obliczać maszyny Turinga. Więcej informacji tutaj .
Minusem jest to, że wszelkie dane wejściowe do Twojego programu uniwersalnego musiałyby być sformułowane w kategoriach tych prostych operacji. Oczywiście po to są kompilatory.
źródło
Każdy tłumacz dla dowolnego języka, który jest kompletnym językiem Turinga, jest uniwersalną funkcją rekurencyjną. Istnieją interpretatory języków wysokiego poziomu, takich jak C ++ lub Python.
Numeracja Godela istnieje, ale domyślnie. Na przykład kod C ++ obliczający funkcję rekurencyjnąsol jest indeksem dla sol .
źródło
Funkcję uniwersalną
u
można dość łatwo napisać w języku podobnym do Haskella (bez skutków ubocznych, funkcje wyższego rzędu), a mianowicie:Funkcja
u
jest uniwersalna, ponieważ akceptuje (opis) programf
i taśmy wejściowejx
i informuje o wyniku prowadzeniaf
nax
.Chociaż odpowiedź ta nie jest do końca poważna, pokazuje, że kompilator lub interpreter języka podobnego do języka Haskell zawiera już wszystkie elementy potrzebne do utworzenia funkcji uniwersalnej. Morał tej historii jest taki, że lepiej poświęcić czas na studiowanie działania kompilatorów i tłumaczy, niż martwić się o wdrożenie uniwersalnej funkcji w zakresie maszyn Turinga.
źródło
u
bierze funkcję - nazwałbym to funkcją wyższego rzędu. Chciałbymu
wziąć liczbę całkowitą lub zwykły typ danych algebraicznych. Nie wymuszam żadnego konkretnego modelu obliczeń, o ile argument dou
jest namacalny - na przykład może być szeregowany z / do ciągu.u
przyjmuje zamknięcie, które jest skończoną sekwencją bajtów. Nawet w zwykłym twierdzeniu utm przyjmowana liczba całkowitau
reprezentuje funkcję.Zobacz także ten artykuł Johna Trompa, wykorzystujący logikę kombinacyjną. Wcześniejszy opis, najwyraźniej już niedostępny, był jeszcze lepszy.
źródło