Całkowity język, który może interpretować tylko kompletny język Turinga

16

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?

Jake
źródło
2
Twoje wypowiedzi są mylące ze względu na sposób korzystania z terminologii. Zamiast polegać na terminologii, spróbuj sformułować swoje pytanie w matematycznie rygorystyczny i jasny sposób, abyśmy mogli zrozumieć twoje pytanie. Co rozumiesz przez język programowania w kontekście teorii obliczalności? Czy masz na myśli wyliczenie funkcji obliczalnych?
Kaveh
1
Zgaduję o tym, co czytasz: jeśli język jest wystarczająco silny i zawiera uniwersalną funkcję innej klasy funkcji, może zdefiniować funkcję przekątną dla tej klasy. Jeśli jest to klasa funkcji całkowitych, to funkcja przekątna nie może należeć do tej klasy.
Kaveh
Nieformalnie stwierdzono, gdzie go znalazłem. Coś dosłownie zgodnie z tym, co tutaj podałem. Nie wiem też, jak to powiedzieć matematycznie. Po lekturze nie jestem pewien, co to jest „funkcja diagonalna klasy funkcji”. Myślę, że w twoich terminach mam na myśli to, że „klasa funkcji całkowitych nie może zawierać swojej własnej funkcji uniwersalnej”, więc myślę, że pytam „o jaką klasę funkcji całkowitych C, to znaczy, że żadna klasa funkcji całkowitych nie zawiera funkcja uniwersalna dla C ”. Jeśli rozumiem, czym jest „funkcja uniwersalna”, uważam, że jest to poprawne.
Jake
1
Ściśle mówiąc, nie jest to pytanie na poziomie badawczym. Ponadto, dlaczego jest to wiki społeczności? Albo to jest?
Andrej Bauer
„Wygląda na to, że rodzi to rodzaj„ ostatecznego ”niepoprawnego pełnego języka; tego (-ów), który może być interpretowany tylko przez maszynę Turinga”. nie podążajcie za tym twierdzeniem, że wydaje się to non sequitur, co masz na myśli, dlaczego tak się wydaje?
vzn

Odpowiedzi:

42

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.Nstring

Niech być funkcją parowania .m,n

Powiedzmy, że język programowania jest podany przez następujące dane:L=(P,ev)

  1. rozstrzygalne zestaw z „ważnych programów”, aPN.
  2. obliczeniowy i częściowo funkcją .ev:P×NN.

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.vzaljare: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.vzaljare(n)=1nP.mivmiv(m,n)mn

Możemy teraz wprowadzić terminologię:

  1. Języka jest całkowita , gdy to całkowita funkcja wszystkich m P .nmiv(m,n)mP.
  2. Język interpretuje język L 2 = ( P 2 , e v 2 ) czy istnieje u P 1 w taki sposób, e v 1 ( U , n , m ) e v 2 ( n , m ) dla wszystkich n PL.1=(P.1,miv1) L.2)=(P.2),miv2))uP.1ev1(u,n,m)ev2(n,m)nPi . Tutaj U jest symulator L 2 realizowanego w L 1 . Jest również znany jako program uniwersalny dla L 2 .mNuL2L1L2

Możliwe są inne definicje „ interpretuje L 2 ”, ale pozwólcie, że nie zajmę się tym teraz.L1L2

Mówimy, że i L 2 są równoważne, jeśli się interpretują.L1L2

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,φ)nNφ(n,m)nmev

Nasza definicja języków programowania jest bardzo swobodna. Aby spełnić następujące warunki, wymagamy jeszcze trzech warunków:

  • implementuje funkcję następczą: istnieje s u c c P takie, że e v ( s u c c , m ) = m + 1 dla wszystkich m N ,LsuccPev(succ,m)=m+1mN
  • narzędzia funkcją przekątnej: jest d I a g P tak, że e v ( d i g , m ) = m , m wszystkie m N ,LdiagPev(diag,m)=m,mmN.
  • jest zamknięte w składzie funkcji: jeśli L implementuje f i g, to również implementuje f g ,L.L.fasolfasol

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 uL.L.mP.nN.

miv(u,m,n)miv(m,n).
miv(u,-)L. . Istnieje n 0P tak, że e v ( n 0 , k ) e v ( u , K , K ) + 1 , a następnie e v ( u , N 0 , N 0) e v (kev(u,k,k)+1n0Pev(n0,k)ev(u,k,k)+1 Ponieważ nie ma liczbę równą własnego następcy wynika, że L nie jest całkowite lub że L nie interpretuje się. CO BYŁO DO OKAZANIA.
ev(u,n0,n0)ev(n0,n0)ev(u,n0,n0)+1
LL

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 , mLLLLevP={0,nnP}{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

ev(b,n,m)={ev(n,m)if b=0,ev(m0,m1)if b=1 and m=m0,m1
LLLL , Gdyż wtedy e v ' ( u , m , n ) e v ( m , n ) , zgodnie z wymaganiami. CO BYŁO DO OKAZANIA.u=1,0ev(u,m,n)ev(m,n)

Ć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.LLL

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.LLLLLL

Andrej Bauer
źródło
Jeśli zaznaczyłem pole wyboru wiki, było to niezamierzone.
Andrej Bauer
2
Czy istnieje dodatkowa moc w językach, w których nie można stwierdzić, czy dany program jest prawidłowy?
Phylliida
3
@DaniPhye: Jeśli składnia języka nie jest w połowie niezdecydowana, możesz „ukryć” moc obliczeniową w składni. Na przykład reguły językowe mogą wymagać, aby każda funkcja była wyposażona w bit, który mówi, czy funkcja jest całkowita. Moglibyśmy następnie zaimplementować 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.
Andrej Bauer
3
W jaki sposób „Jeśli język potrafi się zinterpretować, to nie jest całkowity”, żel z takim rezultatem: autoprepreter dla F-omegi ?
Cactus
18

Każdy język, który nie jest kompletny w Turingu, nie może napisać dla siebie tłumacza.

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.

David Richerby
źródło
Ach! To dobra uwaga. Dlatego muszą istnieć pewne wymagania dotyczące tego, co oblicza język. Wydaje się, że aby język ten był prawdziwy, należy wprowadzić minimalne wymagania dotyczące mocy języka. Wygląda na to, że jeśli wymagamy, aby był w stanie rozwiązać podstawowe problemy arytmetyczne, to może się utrzymywać.
Jake
@Jake Być może uda ci się uciec od czegoś niezwykle słabego, np. „Język definiuje co najmniej jedną niestałą funkcję” lub „język definiuje więcej niż jedną funkcję”. Mój kontrprzykład jest wyraźnie trywialny dla każdej rozsądnej definicji „trywialnej”.
David Richerby,
Brzmi jak interesujący problem do przemyślenia. Jeśli coś znajdę, odpowiem.
Jake