Każdy język, który nie jest kompletny w Turingu, nie może napisać dla siebie tłumacza. Nie mam pojęcia, gdzie to przeczytałem, ale widziałem, że używał go wiele razy. Wydaje się, że prowadzi to do pewnego rodzaju „ostatecznego” pełnego języka Turinga; te, które mogą tylkobyć interpretowanym przez maszynę Turinga. Języki te niekoniecznie byłyby w stanie obliczyć wszystkie funkcje całkowite, od naturali do naturałów, i niekoniecznie byłyby izomorficzne (to może być języki ostateczne A i B istnieją tak, że istnieje funkcja F, którą A może obliczyć, ale B nie może). Agda może zinterpretować system T Godela, a Agda jest totalny, więc taki ostateczny język powinien być o wiele potężniejszy niż wydaje się system T Godela. Wydaje mi się, że taki język byłby co najmniej równie silny jak agda (choć nie mam dowodów, tylko przeczucie).
Czy przeprowadzono jakieś badania w tym zakresie? Jakie wyniki są znane (a mianowicie czy znany jest „ostateczny” język)?
Premia: Obawiam się, że istnieje przypadek patologiczny, który nie może obliczyć funkcji, które System T Godela mógłby jeszcze interpretować tylko za pomocą maszyny Turinga, ponieważ umożliwia obliczenie niektórych naprawdę dziwnych funkcji. Czy tak jest, czy możemy wiedzieć, że taki język byłby w stanie obliczyć wszystko, co mógłby obliczyć System T Godela?
Odpowiedzi:
To źle sformułowane pytanie, więc najpierw zrozummy to. Zamierzam to zrobić w stylu teorii obliczalności. Dlatego użyję liczb zamiast ciągów znaków: fragment kodu źródłowego jest liczbą, a nie ciągiem symboli. To tak naprawdę nie ma znaczenia, możesz zastąpić przez s t r i n g na dole.N string
Niech być funkcją parowania .⟨m,n⟩
Powiedzmy, że język programowania jest podany przez następujące dane:L=(P,ev)
Fakt, że jest rozstrzygalne, oznacza, że istnieje całkowita mapa obliczalna v a l i d : N → { 0 , 1 }, tak że v a l i d ( n ) = 1P. v a l id: N → { 0 , 1 } . Nieformalnie mówimy, że można stwierdzić, czy dany ciąg jest poprawnym fragmentem kodu. Funkcja e v jest w zasadzie tłumaczem naszego języka: e v ( m , n ) uruchamia kod m na wejściu n - wynik może być niezdefiniowany.v a l i d( n ) = 1⟺n ∈ P e v e v ( m , n ) m n
Możemy teraz wprowadzić terminologię:
Możliwe są inne definicje „ interpretuje L 2 ”, ale pozwólcie, że nie zajmę się tym teraz.L1 L2
Mówimy, że i L 2 są równoważne, jeśli się interpretują.L1 L2
Istnieje „najpotężniejszy” język maszyn Turinga (który nazywamy „maszyną Turinga”), w którym n ∈ N jest kodowaniem maszyny Turinga, a φ ( n , m ) to częściowa funkcja obliczeniowa, która „uruchamia kodowanie maszyny Turinga n na wejściu m ”. Ten język może interpretować wszystkie inne języki, oczywiście, ponieważ wymagaliśmy, aby e v była obliczalna.T=(N,φ) n∈N φ(n,m) n m ev
Nasza definicja języków programowania jest bardzo swobodna. Aby spełnić następujące warunki, wymagamy jeszcze trzech warunków:
Klasyczny wynik jest następujący:
Twierdzenie: jeśli język potrafi się interpretować, to nie jest całkowity.
Dowód. Załóżmy, jest uniwersalny program dla ogólnej biuletynie L realizowanego w L , to znaczy dla wszystkich m ∈ P i n ∈ N , e v ( u , ⟨ m , n ⟩ ) ≃ e v ( m , n ) . Ponieważ następca, przekątna i e v ( u , - ) są zaimplementowane w L , podobnie ich skład k ↦u L. L. m ∈ P. n ∈ N
Zauważ, że moglibyśmy zastąpić mapę następczą dowolną inną mapą pozbawioną punktów stałych.
Oto małe twierdzenie, które, jak sądzę, rozwiąże nieporozumienie.
Twierdzenie: każdy język całkowity może być interpretowany przez inny język całkowity.
Dowód. Niech będzie językiem całkowitym. Otrzymujemy całkowitą L ', która interpretuje L , przylegając do L jego oceniającego e v . Dokładniej, niech P ' = { ⟨ 0 , n ⟩ | n ∈ P } ∪ { ⟨ 1 , 0 ⟩ } i określenie e v ' a e v ' ( ⟨ b , n ⟩ , mL L′ L L ev P′={⟨0,n⟩∣n∈P}∪{⟨1,0⟩} ev′
Oczywiście, L " oznacza całkowitą ponieważ L jest całkowite. Aby zobaczyć, że L ' może symulować L prostu wziąć u = ⟨ 1 , 0
Ćwiczenia: [dodano 27.06.2014] Język zbudowane powyżej nie jest zamknięta na podstawie kompozycji. Napraw dowód twierdzenia, aby L ' spełniał dodatkowe wymagania, jeśli L tak.L′ L′ L
Innymi słowy, nigdy nie potrzebujesz pełnej mocy maszyn Turinga do interpretacji całkowitego języka - wystarczy nieco mocniejszy całkowity język L ' . Język L ' jest ściśle potężniejszy niż L, ponieważ interpretuje L , ale L nie interpretuje siebie.L L′ L′ L L L
źródło
is_total
, co w innym przypadku nie byłoby cmputowalne, ale nie moglibyśmy zaimplementować oceny (ponieważ musiałbyś również obliczyć część wynikowej funkcji). Ogólnie powiedziałbym, że nie jest to język programowania, jeśli nie możesz nawet zaimplementować dla niego parsera.To stwierdzenie jest niepoprawne. Zastanów się nad językiem programowania, w którym semantyką każdego łańcucha jest „Ignoruj wprowadzanie i natychmiast zatrzymaj”. Ten język programowania nie jest kompletny, ale każdy program jest tłumaczem języka.
źródło