Bahasa total yang hanya dapat diterjemahkan oleh bahasa Turing yang lengkap

16

Bahasa apa pun yang tidak lengkap Turing tidak dapat menulis penerjemah untuk itu sendiri. Saya tidak tahu di mana saya membaca itu tetapi saya telah melihatnya digunakan beberapa kali. Sepertinya ini memunculkan semacam bahasa "Turing" non-Turing lengkap; satu-satunya yang hanya bisaditafsirkan oleh mesin Turing. Bahasa-bahasa ini tidak harus mampu menghitung semua fungsi total dari naturals ke naturals juga tidak harus isomorfik (yang mungkin merupakan bahasa pamungkas A dan B ada sedemikian rupa sehingga ada fungsi F yang A dapat dihitung tetapi B tidak dapat). Agda dapat menafsirkan sistem Godel T dan Agda bersifat total sehingga bahasa utama semacam itu harus benar-benar lebih kuat sehingga sistem Godel T akan terlihat. Tampaknya bagi saya bahwa bahasa seperti itu setidaknya akan sekuat agda juga (meskipun saya tidak punya bukti, hanya firasat).

Apakah ada penelitian yang dilakukan dalam bidang ini? Apa hasil yang diketahui (yaitu bahasa "akhir" yang dikenal)?

Bonus: Saya khawatir ada kasus patologis yang tidak dapat menghitung fungsi yang Godel's System T masih bisa hanya dapat ditafsirkan oleh mesin Turing karena memungkinkan beberapa fungsi yang sangat aneh untuk dihitung. Apakah ini masalahnya atau dapatkah kita tahu bahwa bahasa seperti itu akan dapat menghitung apa pun yang dapat dihitung oleh Sistem T Godel?

Jake
sumber
2
Pernyataan Anda membingungkan karena cara Anda menggunakan terminologi. Sebagai ganti mengandalkan terminologi, coba nyatakan pertanyaan Anda dengan cara yang ketat dan jelas secara matematis sehingga kami dapat memahami pertanyaan Anda. Apa yang Anda maksud dengan bahasa pemrograman dalam konteks teori komputasi? Apakah maksud Anda penghitungan fungsi yang dapat dihitung?
Kaveh
1
Tebakan saya tentang apa yang Anda baca: jika suatu bahasa cukup kuat dan berisi fungsi universal dari kelas fungsi lain, maka ia dapat menentukan fungsi diagonal untuk kelas tersebut. Jika ini adalah kelas dari total fungsi maka fungsi diagonal tidak dapat berada di dalam kelas.
Kaveh
Itu dinyatakan secara informal di mana saya menemukannya. Sesuatu yang benar-benar sesuai dengan apa yang saya berikan di sini. Saya juga tidak tahu bagaimana menyatakan ini secara matematis. Setelah beberapa bacaan saya tidak yakin apa "fungsi diagonal dari kelas fungsi". Saya pikir dalam istilah Anda apa yang saya maksud adalah bahwa "kelas fungsi total tidak dapat mengandung fungsi universal sendiri" dan jadi saya pikir saya bertanya "untuk kelas apa fungsi total C itu kasus bahwa tidak ada kelas fungsi total mengandung fungsi universal untuk C ". Jika saya mengerti apa "fungsi universal" itu, saya pikir itu benar.
Jake
1
Sebenarnya, ini bukan pertanyaan tingkat penelitian. Juga, mengapa ini wiki komunitas? Atau itu?
Andrej Bauer
"Sepertinya ini memunculkan semacam bahasa lengkap yang" tidak sempurna "tanpa bahasa; satu-satunya yang hanya bisa ditafsirkan oleh mesin Turing." jangan ikuti pernyataan itu sepertinya tidak berurutan, apa maksudmu, mengapa itu tampak begitu?
vzn

Jawaban:

42

Ini adalah pertanyaan yang diutarakan dengan buruk, jadi mari kita pertama-tama memahaminya. Saya akan melakukannya dengan gaya teori komputabilitas. Jadi saya akan menggunakan angka alih-alih string: sepotong kode sumber adalah angka, bukan serangkaian simbol. Tidak masalah, Anda dapat mengganti dengan s t r i n gNstring seluruh bawah.

Mari m,n menjadi fungsi pasangan .

Katakanlah bahasa pemrograman L=(P,ev) diberikan oleh data berikut:

  1. satu set yang dapat ditentukan PN dari "program yang sah", dan
  2. sebuah komputasi dan parsial fungsi ev:P×NN .

Fakta bahwa adalah decidable berarti ada total peta yang dapat dihitung v a l i d : N{ 0 , 1 } sedemikian rupa sehingga v a l i d ( n )Pvalid:N{0,1} . Secara informal, kami mengatakan bahwa adalah mungkin untuk mengetahui apakah string yang diberikan adalah bagian kode yang valid. Fungsi e v sangat penting sebagai juru bahasa kita: e v ( m , n ) menjalankan kode m pada input nvalid(n)=1nPevev(m,n)mn - hasilnya mungkin tidak ditentukan.

Kami sekarang dapat memperkenalkan beberapa terminologi:

  1. Bahasa adalah total jika adalah fungsi total untuk semua m Pnev(m,n)mP .
  2. Sebuah bahasa menafsirkan bahasa L 2 = ( P 2 , e v 2 ) jika ada u P 1 sehingga e v 1 ( u , n , m ) e v 2 ( n , m ) untuk semua n PL1=(P1,ev1) L2=(P2,ev2)uP1ev1(u,n,m)ev2(n,m)nPdan . Di sini u adalah simulator untuk L 2 diimplementasikan di L 1 . Ia juga dikenal sebagai program universal untuk L 2 .mNuL2L1L2

Definisi lain dari " interprets L 2 " dimungkinkan, tetapi saya tidak akan membahasnya sekarang.L1L2

Kami mengatakan bahwa dan L 2 adalah setara jika mereka menginterpretasikan satu sama lain.L1L2

Ada "bahasa yang paling kuat" dari mesin Turing (yang Anda sebut sebagai "mesin Turing") di mana n N adalah penyandian mesin Turing dan φ ( n , m ) adalah fungsi komputasi sebagian yang "menjalankan mesin Turing yang dikodekan oleh n pada input m ". Bahasa ini dapat memadukan semua bahasa lain, jelas karena kami membutuhkan e vT=(N,φ)nNφ(n,m)nmev menjadi dihitung.

Definisi bahasa pemrograman kami sangat santai. Agar hal-hal berikut dapat dilalui, mari kita membutuhkan tiga kondisi lagi:

  • mengimplementasikan fungsi penerus: ada s u c c P sedemikian sehingga e v ( s u c c , m ) = m + 1 untuk semua m NLsuccPev(succ,m)=m+1mN ,
  • mengimplementasikan fungsi diagonal: ada d i a g P sehingga e v ( d i a g , m ) = m , m untuk semua m NLdiagPev(diag,m)=m,mmN ,
  • ditutup di bawah komposisi fungsi: jika L mengimplementasikan f dan g maka ia juga mengimplementasikan f g ,LLfgfg

Hasil klasiknya adalah ini:

Teorema: Jika suatu bahasa dapat menafsirkan dirinya sendiri maka itu tidak total.

Bukti. Misalkan adalah program universal untuk total langauge L diimplementasikan dalam L , yaitu, untuk semua m P dan n N , e v ( u , m , n ) e v ( m , n ) . Sebagai penerus, diagonal, dan e v ( u , - ) diimplementasikan dalam L , demikian juga komposisi mereka e vuLLmPnN

ev(u,m,n)ev(m,n).
ev(u,)L . Ada ada n 0P sehingga e v ( n 0 , k ) e v ( u , k , k ) + 1 , tapi kemudian e v ( u , n 0 , n 0) e v (kev(u,k,k)+1n0Pev(n0,k)ev(u,k,k)+1 Karena tidak ada nomor sama penggantinya sendiri, berikut bahwa L tidak total atau bahwa L tidak menafsirkan sendiri. QED.
ev(u,n0,n0)ev(n0,n0)ev(u,n0,n0)+1
LL

Perhatikan bahwa kami dapat mengganti peta pengganti dengan peta bebas-fixpoint lainnya.

Berikut adalah teorema kecil yang saya pikir akan membersihkan kesalahpahaman.

Teorema: Setiap bahasa total dapat ditafsirkan oleh bahasa total lainnya.

Bukti. Biarkan menjadi bahasa total. Kami mendapatkan total L ' yang menafsirkan L oleh sebelahnya untuk L nya evaluator e v . Lebih tepatnya, mari P ' = { 0 , n | n P } { 1 , 0 } dan mendefinisikan e v ' sebagai e v ' ( b , n , mLLLLevP={0,nnP}{1,0}ev Jelas, L ' total karenaLtotal. Untuk melihat bahwa L ' dapat mensimulasikanLhanya mengambilu=1,0

ev(b,n,m)={ev(n,m)if b=0,ev(m0,m1)if b=1 and m=m0,m1
LLLL , sejak itu eu=1,0ev(u,m,n)ev(m,n) , seperti yang diperlukan. QED.

LLL melakukannya.

LLLLLL tidak menafsirkan sendiri.

Andrej Bauer
sumber
Jika saya menandai kotak centang wiki itu tidak disengaja.
Andrej Bauer
2
Apakah ada kekuatan ekstra dalam bahasa di mana Anda tidak dapat mengetahui apakah suatu program tertentu valid atau tidak?
Phylliida
3
@DaniPhye: Jika sintaks bahasa tidak dapat ditentukan, Anda dapat "menyembunyikan" kekuatan komputasi dalam sintaks. Misalnya, aturan bahasa bisa mengharuskan setiap fungsi dilengkapi dengan sedikit yang memberi tahu apakah fungsi tersebut total. Kami kemudian dapat mengimplementasikan is_total, yang sebaliknya tidak dapat di-cmputable, tetapi tidak dapat mengimplementasikan evaluasi (karena Anda juga harus menghitung bit dari fungsi yang dihasilkan). Secara umum saya akan mengatakan itu bukan bahasa pemrograman jika Anda bahkan tidak dapat mengimplementasikan parser untuk itu.
Andrej Bauer
3
Bagaimana "Jika suatu bahasa dapat mengartikan dirinya sendiri maka itu bukan total" gel dengan hasil ini: A Self-Interpreter for F-omega ?
Cactus
18

Bahasa apa pun yang tidak lengkap Turing tidak dapat menulis penerjemah untuk itu sendiri.

Pernyataan ini salah. Pertimbangkan bahasa pemrograman di mana semantik setiap string adalah "Abaikan masukan Anda dan segera hentikan". Bahasa pemrograman ini tidak lengkap, tetapi setiap program adalah juru bahasa.

David Richerby
sumber
Ah! Itu poin yang bagus. Jadi harus ada persyaratan tertentu tentang apa yang dihitung bahasa. Tampaknya beberapa persyaratan minimum harus dibuat pada kekuatan bahasa untuk membuat pernyataan itu benar. Sepertinya jika kita menuntutnya bisa menyelesaikan masalah aritmatika dasar maka itu mungkin berlaku.
Jake
@Jake Anda mungkin benar-benar dapat pergi dengan sesuatu yang sangat lemah seperti "bahasa mendefinisikan setidaknya satu fungsi tidak konstan" atau "bahasa mendefinisikan lebih dari satu fungsi". Contoh tandingan saya jelas sepele untuk definisi "sepele" yang masuk akal.
David Richerby
Kedengarannya seperti masalah yang menarik untuk saya pikirkan. Jika saya menemukan sesuatu, saya akan membalasnya.
Jake