Czy jakikolwiek język, który może wyrazić swój własny kompilator Turing, jest kompletny?

12

Komentarz do tex.SE mnie zastanawiał. Oświadczenie to zasadniczo:

Jeśli mogę napisać kompilator dla języka X w języku X, to X jest Turing-complete.

Pod względem obliczalności i języków formalnych jest to:

Jeśli decyduje L L T, M i M L , to F L = R E .M.L.L.T.M.M.L.faL.=Rmi

Tutaj oznacza języka dla wszystkich maszyn Turinga kodowania i K L oznacza zbiór funkcji obliczonych przez maszyny w L .L.T.M.faL.L.

Czy to prawda?

Raphael
źródło
zamknij, pomyśl / zgódź się, że musi istnieć jakaś prawdziwa bliskość tego, jak każdy „nietrywialny” lub „wystarczająco złożony” język, który może wyrazić swój własny symulator, jest kompletny. kompilator jest zazwyczaj częścią symulatora. jest to rzeczywiście „wzorzec projektowy” znaleziony w wielu dowodach kompletności TM, ale może nie został uogólniony / sformalizowany. może temat do dalszej analizy / dyskusji na czacie informatyki . podejrzany / przypuszczalny jest inny interesujący temat, taki jak: „każdy nietrywialny / wystarczająco złożony język rekurencyjny i rekurencyjnie wymienny może być odwzorowany / zredukowany do każdego innego”.
dniu
1
Stworzyłem ezoteryczny język o nazwie InterpretMe, który nie może nic zrobić poza wyrażeniem własnego tłumacza, więc na pewno nie jest on kompletny.
Pisownia bezkontekstowa
Czy możesz wyjaśnić drugie stwierdzenie? Co jest ? Jak to zdanie jest powiązane z pierwszym? M.
reinierpost
@reinierpost zwykle oznacza liczbę M , ponieważ niektóre z nich (dopuszczalne) kodującego. Stąd, L , T M = { M | M  jest maszyna Turinga } . Przez F L oznaczam zestaw funkcji obliczonych przez język L maszyn Turinga. M.M.L.T.M.={M.M. jest maszyną Turinga}faL.L.
Raphael
Lepszym sposobem zawierać żądanie może być: „Jeśli jest TM z M l i l M = l , wtedy K L = R e .M.M.L.L.M.=L.faL.=Rmi
Raphael

Odpowiedzi:

13

Nieformalne oświadczenie nie jest prawdziwe, jak pokazuje poniższy język programowania. Każdy ciąg, powiedzmy, znaków ASCII jest poprawnym programem, a znaczenie każdego programu brzmi: „Wyprowadź program, który po prostu wypisuje kopię swojego wejścia”. Zatem każdy program w tym języku jest kompilatorem języka, ale język nie jest kompletny w Turingu.

Nie jestem pewien, czy twoja „wersja teorii obliczeń” jest równoważna, ale też nie jest prawdą. Zgodnie z drugim twierdzeniem Kleene o rekurencji dla dowolnego kodowania maszyn Turinga istnieje TM, która akceptuje własne kodowanie i odrzuca wszystkie inne. 1 To urządzenie jest kontrprzykładem do zdania. Mówiąc konkretniej, możemy osiągnąć wynik, wybierając kodowanie. Na przykład, niech każdy nieparzysty numer koduje maszynę  zdefiniowaną przez „Jeśli moje dane wejściowe są nieparzyste, zaakceptuj ją, w przeciwnym razie odrzucaj” i niech cyfra  2 x koduje maszynę zakodowaną przez  x w twoim ulubionym schemacie kodowania dla maszyn Turinga. M  jest w języku  L zaakceptowany przez  MM.2)xxM.L.M.ale  nie jest ukończony przez Turinga.faL.


1 sekundy rekursji KLEENE Twierdzenie mówi, że na każdy wyliczenie częściowych funkcji rekurencyjnej (czyli dla każdego kodowania programów jako liczby całkowite) oraz każde częściowe funkcji rekurencyjnej  P ( x , y ) nie jest liczba całkowita  p taka, że ϕ p  jest funkcją odwzorowującą y na Q ( p , y ) . W szczególności niech Q będzie funkcją, która akceptuje, jeśli x = y(ϕja)ja0Q(x,y)pϕpyQ(p,y)Qx=yi odrzuca inaczej. Według twierdzenia istnieje liczba całkowita  która koduje program ϕ p ( y ) = Q ( p , y ) . Oznacza to, że ϕ p przyjmuje własne kodowanie  p i odrzuca wszystkie inne dane wejściowe.pϕp(y)=Q(p,y)ϕpp

David Richerby
źródło
1
W jakim sensie każdy program w tym języku jest kompilatorem tego języka? Każdy program jest programem, który wprowadza program w tym języku i generuje inny program w tym języku, tak, ale quines zasadniczo nie jest uważany za kompilator.
user253751
1
Myślę, że @immibis ma rację: twój kompilator to c ( P ) = { x r e t u r n P }, podczas gdy wszystkie programy w języku są P ( x ) = P , więc c najwyraźniej nie jest w języku . Czy coś brakuje? dodo(P.)={xrmiturn P.}P.(x)=P.do
Raphael
1
@immibis Myślę (z opóźnieniem), że masz rację. Wygląda na to, że chciałem napisać, że semantyka każdego programu to po prostu „wyjście danych wejściowych”. To wydaje się wystarczająco bliskie temu, co napisałem, że prawdopodobnie to właśnie chciałem powiedzieć w pierwszej kolejności. A może miałem szczęście, że odległość edytowania od mojej błędnej odpowiedzi do poprawnej odpowiedzi była tak mała. :-)
David Richerby,
1
Odpowiedź mówi teraz: „ignoruje dane wejściowe i wysyła kopię danych wejściowych” - nie możesz zrobić obu tych rzeczy.
user253751,
@immibis Wrócę ponownie .
David Richerby,