Apakah ada definisi yang jelas tentang "computable" untuk model perhitungan yang belum selesai?

9

Ini adalah tindak lanjut dari pertanyaan lain di sini , dan saya harap itu tidak terlalu filosofis. Seperti yang ditunjukkan oleh Raphael dalam komentar pada pertanyaan saya sebelumnya, saya tidak benar-benar mendapatkan definisi "computable", tetapi menurut beberapa makalah yang saya baca, definisi itu juga tidak begitu jelas dalam hal model perhitungan yang lebih lemah daripada menggunakan turing. mesin karena pengkodean input dan output.

Definisi khas dari turing yang dapat dihitung adalah sebagai berikut:

Definisi 1: Suatu fungsi disebut turing computable iff jika ada mesin turing yang menghitung menggunakan pengkodean bilangan alami yang sesuai sebagai string.f:NkNMf

Definisi berbeda dalam apa sebenarnya pengkodean yang cocok , tetapi kebanyakan merujuk ke pengkodean biner , pengkodean unary atau pengkodean desimal sebagai pengkodean yang tetap dan sesuai. Dimungkinkan juga untuk menunjukkan bahwa memperbaiki satu encoding diperlukan untuk definisi turing computability. Tetapi apa yang membuat, katakanlah, pengkodean biner dari bilangan asli menjadi spesial sehingga kita dapat mengacomasinya sebagai pengkodean yang cocok? Mungkin karena cocok dengan gagasan intuitif tentang apa arti komputabilitas secara kebetulan .

Sekarang bagaimana jika kita melihat model komputasi yang lebih lemah daripada mesin turing? Sebagai contoh, mari kita pertimbangkan set dari mesin turing "pincang" dengan alfabet yang hanya dapat bergerak ke kanan, dan definisi turing lumpuh yang dapat dihitung yang konsisten dengan turing yang dapat dihitung:Mc{0,1}

Definisi 2: Suatu fungsi disebut turing yang dilumpuhkan yang dapat dihitung atau dalam jika ada mesin turing yang dilumpuhkan yang menghitung menggunakan pengkodean yang sesuai dari bilangan asli sebagai Sebuah benang.f:NkNMcMf

Jika kita mendefinisikan "encoding cocok" sebagai "encoding biner", maka fungsi adalah tidak dihitung di . Jika kita aksioma "encoding yang sesuai" sebagai "encoding unary", maka dapat dihitung dalam . Ini tampaknya aneh mengingat fakta bahwa setiap orang dapat memperbaiki salah satu pengkodean intuitif yang tak terhingga banyaknya. Seharusnya jelas jika model komputasi dapat menghitung atau tidak tanpa merujuk ke beberapa pengkodean spesifik - setidaknya saya belum pernah melihat ada yang menyebutkan pengkodean apa yang digunakan ketika menyatakan "program loop lebih lemah daripada mesin turing".f:NN,nn+1Mcf Mcf


Setelah pengantar ini, akhirnya saya dapat mengutarakan pertanyaan saya: Bagaimana cara mendefinisikan "pengkodean yang cocok" dan "komputabilitas" untuk model komputasi sewenang - wenang yang tidak sesuai dengan gagasan intuitif tentang komputabilitas? Apakah ini mungkin dalam kerangka turing computability?

Sunting: Saya mempersingkat pengantar, itu tidak menambah pertanyaan.

Stefan Lutz
sumber

Jawaban:

6

Beberapa fakta dasar yang Anda lewatkan di sini adalah bahwa semua pengkodean yang Anda sebutkan setara dari perspektif komputabilitas: ada fungsi yang dapat dikomputasi memetakan pengkodean biner dari suatu angka ke pengkodean yang tidak diketahui, atau sebaliknya. Oleh karena itu demi mendefinisikan komputasi, tidak masalah pengkodean mana yang Anda pilih untuk angka. Perbaiki penyandian favorit Anda.

Komputasi pada intinya adalah properti dari fungsi string . Saat Anda menentukan kemampuan komputasi di domain lain, Anda harus memperbaiki penyandian. Dalam praktiknya, semua penyandian "masuk akal" adalah setara dalam arti paragraf sebelumnya, sehingga penyandian yang tepat tidak masalah.f:ΣΣ

Namun, pengkodean itu penting dalam model komputasi yang terbatas. Untuk mengambil contoh ekstrem, anggaplah Anda mempertimbangkan mesin Turing yang dibatasi waktu: misalnya, Anda ingin mesin Anda berakhir dalam waktu untuk beberapa c , di mana n adalah panjang input (sebagai string). Kita tidak bisa lagi beralih antara pengkodean biner dan pengkodean unary, karena pengkodean biner jauh lebih ringkas. Ketika kita berbicara tentang fungsi komputable waktu polinomial dari bilangan bulat , kami menetapkan bahwa bilangan bulat dikodekan dalam biner. Bahkan ini adalah pilihan yang agak sewenang-wenang, karena pengkodean desimal akan mengarah pada gagasan yang sama tentang komputabilitas waktu polinomial.O(nc)cn

Jadi untuk menjawab pertanyaan Anda - pengkodean ditentukan sebagai bagian dari definisi model terbatas.

Yuval Filmus
sumber
"Beberapa fakta dasar yang Anda lewatkan di sini adalah bahwa semua pengkodean yang Anda sebutkan setara dari perspektif komputabilitas: ada fungsi yang dapat dikomputasi memetakan pengkodean biner dari suatu angka ke pengkodean yang tidak diketahui, atau sebaliknya" - ya, saya memiliki itu dalam versi asli dari pertanyaan saya, tetapi saya tidak dapat melihat bagaimana itu relevan untuk pertanyaan tentang model yang lebih lemah. Juga jelas bahwa pengkodean harus ditentukan sebagai bagian dari definisi model, tetapi pertanyaannya adalah bagaimana seseorang dapat sampai pada definisi yang masuk akal.
Stefan Lutz
1
Seseorang menarik definisi ini dari topi. Karena definisi yang berbeda cenderung setara, definisi yang tepat tidak masalah. Ketika itu terjadi, akan ada beberapa konsep kompleksitas yang berbeda. Misalnya, untuk beberapa algoritma grafik, akan ada bedanya jika Anda diberi matriks adjacency atau daftar edge.
Yuval Filmus
Jadi untuk meringkas: a) Definisi dari masing-masing model perhitungan harus menyertakannya sintaks, semantik DAN pengkodean yang sesuai. b) Definisi "encoding yang cocok" sepenuhnya independen dari sintaks dan semantik model. c) Tidak ada cara untuk memberikan definisi "encoding yang cocok" yang berlaku untuk semua model perhitungan. Apakah itu benar?
Stefan Lutz
Saya setuju dengan a) dan b), tetapi dengan c) hanya sebagian. Anda dapat menentukan pengkodean yang cocok yang berfungsi sebagai "pengkodean standar", digunakan kecuali disebutkan secara eksplisit. Dalam hal angka, ada pengkodean standar seperti itu - pengkodean biner.
Yuval Filmus
M
4

Pertama-tama, Anda tidak dapat memperbaiki "penyandian yang cocok" menjadi string biner, atau penyandian lainnya. Ini karena Anda akan kehilangan terlalu banyak model komputasi, karena model komputasi yang berbeda mungkin memiliki model input dan output yang sangat berbeda. Dengan kata lain, mereka mungkin tidak "berbicara".

Misalnya, istilah kalkulus lambda yang tidak diketik adalah variabel, atau penerapan satu istilah ke yang lain, atau abstraksi dari istilah lambda. Input dan output adalah istilah, string acak. Namun, kalkulus lambda yang tidak diketik adalah Turing-complete karena terdapat "pengkodean yang cocok" yang mengkodekan bilangan alami sebagai istilah lambda dari bentuk tertentu, dan di bawah pengodean ini untuk setiap fungsi yang dihitung ada terdapat istilah lambda yang menghitungnya.

Anda dapat memformalkan "penyandian yang sesuai" jika Anda memperbaiki mesin Turing sebagai model perhitungan komputasi Anda, dan kemudian mengharuskan pengkodean dan dekode dari dan ke string biner harus dilakukan oleh mesin Turing yang selalu berhenti. Misalnya, mesin Turing akan dapat menerjemahkan angka alami sebagai string biner ke istilah Lambda yang menyatakan angka ini, mensimulasikan pengurangan dalam kalkulus lambda, dan menerjemahkan hasilnya kembali ke string biner.

Untuk model perhitungan yang lebih sederhana saya akan mengharapkan pendekatan yang sama: mengambil model referensi perhitungan dan memperbaiki pengkodean bilangan alami, dan kemudian memastikan bahwa pengkodean dan decoding dilakukan dengan contoh dari model sederhana itu. Seperti yang Anda catat, untuk mesin Turing lumpuh, menggunakan angka yang disandikan unary dan biner tidak akan menghasilkan model perhitungan yang setara.

Hoopje
sumber
Mungkinkah Anda membalikkan keadaan di paragraf terakhir? Anda menulis bahwa pengkodean dilakukan oleh model sederhana, bukan model referensi - pada paragraf sebelumnya Anda ingin agar pengkodean dilakukan oleh model referensi, bukan model lain (lambda calculus).
Stefan Lutz
Jika Anda mempelajari model komputasi yang lebih lemah, Anda tidak ingin menggunakan mesin Turing di mana pun, bahkan dalam fase pengkodean / decoding. Kemudian Anda bisa melakukan semua perhitungan dalam fase penyandian dan tentang model komputasi apa saja yang akan diselesaikan Turing. Jadi, Anda perlu menggunakan model referensi yang lebih sederhana untuk encoding / decoding.
Hoopje
1
nNchurch:Nlambdatermchurch(n)toBinary:lambdatermlambdatermwΣ