Apakah semua turing bahasa lengkap dipertukarkan

26

Catatan, sementara saya tahu cara memprogram, saya cukup pemula dalam teori CS.

Menurut jawaban ini

Kelengkapan Turing adalah konsep abstrak dari kemampuan komputasi. Jika suatu bahasa Turing lengkap, maka ia mampu melakukan perhitungan apa pun yang bisa dilakukan bahasa lengkap Turing lainnya.

Dan program apa pun yang ditulis dalam bahasa lengkap Turing apa pun dapat ditulis ulang dalam bahasa lain .

Baik. Ini masuk akal. Saya dapat menerjemahkan (kompilasi) C ke Majelis (dan saya melakukannya setiap hari!), Dan dapat menerjemahkan Majelis ke C (Anda dapat menulis mesin virtual di C). Dan hal yang sama berlaku untuk bahasa lain - Anda dapat mengkompilasi bahasa apa saja ke dalam Majelis, dan kemudian menjalankannya dalam VM yang ditulis dalam bahasa lain.

Tapi bisa saja program yang ditulis dalam bahasa yang lengkap Turing harus ditulis ulang di lain?

Bagaimana jika Majelis saya memiliki kode sandi LIGHTBUTTON? Secara fisik saya tidak dapat meniru bahasa itu pada sistem (bahasa) tanpa bola lampu.

Baik. Jadi Anda akan mengatakan bahwa karena kita berurusan dengan teori komputer , kita tidak membahas keterbatasan perangkat fisik.

Tetapi bagaimana dengan perangkat yang tidak memiliki multiplikasi? divisi? Sepengetahuan saya (meskipun ini lebih merupakan pertanyaan untuk matematika. SE), seseorang tidak dapat meniru perkalian (dan pasti bukan pembagian) dengan penambahan dan pengurangan [1].

Jadi bagaimana "turing bahasa lengkap" (yang dapat menambah, mengurangi, dan melompat) meniru bahasa lain yang dapat menambah, mengurangi, mengalikan dan melompat?

EDIT

[1]. Pada bilangan real arbitrer.

tur
sumber
33
Bilangan real milik dunia Hyper-Turing-Computation. Mesin Turing tidak dapat menangani bilangan real, ergo, mereka tidak relevan dengan kelengkapan Turing.
Jörg W Mittag
3
Terkait: set instruksi bahasa assembly dengan hanya satu instruksi masih cukup kuat untuk membangun komputer universal: en.wikipedia.org/wiki/One_instruction_set_computer . Misalnya, "Kurangi dan cabang jika kurang dari atau sama dengan nol" dengan operan memori. Ini akan lebih lambat dibandingkan dengan x86 modern, tetapi rasio kinerja terbatas untuk program apa pun.
Peter Cordes
1
Tidak ada mesin fisik (benar-benar ada) yang dapat atau pernah menjadi Turing lengkap, karena kelengkapan Turing membutuhkan penyimpanan tanpa batas dan alam semesta tidak terbatas. Oleh karena itu, jawaban afirmatif untuk apakah dua mesin abstrak adalah setara tidak membantu Anda menjawab pertanyaan apakah dua perkiraan fisik mesin tersebut setara.
Ben
2
@PeterCordes: Saya berasumsi bahwa ketika Anda mengatakan rasionya terbatas, Anda hanya berarti bahwa setiap tugas yang menyelesaikan dalam waktu terbatas pada keduanya akan melakukannya dalam waktu terbatas pada keduanya - bukan untuk mesin tertentu (tidak termasuk input) akan ada batas terbatas hingga seberapa tinggi rasio mungkin untuk beberapa input. Saya pikir orang dapat membangun mesin Turing-lengkap yang satu dapat memilih input yang akan membuat rasio tinggi sewenang-wenang - bahkan mungkin bukan fungsi yang dapat dihitung dari ukuran input.
supercat
6
Saya tidak tahu dari mana Anda mendapatkan gagasan bahwa "seseorang tidak dapat meniru perkalian (dan pasti bukan pembagian) dengan penambahan dan pengurangan". Itu diajarkan dari sekolah dasar ketika kita belajar bagaimana melipatgandakan
phuclv

Jawaban:

55

Kelengkapan Turing mengatakan satu hal dan hanya satu hal: model perhitungan adalah Turing-complete, jika ada perhitungan yang dapat dimodelkan oleh Mesin Turing juga dapat dimodelkan oleh model itu.

Jadi, apa saja komputasi yang bisa dimodelkan Mesin Turing? Yah, pertama dan terutama, Alan Turing dan semua rekannya hanya tertarik pada fungsi pada bilangan alami. Jadi, Mesin Turing (dan kalkulus λ, kalkulus kombinator SK, fungsi μ-rekursif, ...) hanya berbicara tentang kemampuan komputasi fungsi pada bilangan asli. Jika Anda tidak berbicara tentang fungsi pada bilangan asli, maka konsep Turing-kelengkapan bahkan tidak masuk akal, itu sama sekali tidak berlaku.

Namun, perlu diketahui bahwa kita dapat menyandikan banyak hal menarik sebagai bilangan alami. Kita dapat menyandikan string sebagai bilangan alami, kita dapat menyandikan grafik sebagai bilangan alami, kita dapat menyandikan boolean sebagai bilangan alami. Kita dapat menyandikan Mesin Turing sebagai bilangan alami, yang memungkinkan kita membuat Mesin Turing yang berbicara tentang Mesin Turing!

Dan, tentu saja, tidak semua fungsi pada bilangan asli dapat dihitung. Mesin Turing hanya dapat menghitung beberapa fungsi pada bilangan asli, kalkulus λ hanya dapat menghitung beberapa fungsi pada bilangan asli, kalkulus kombinator SK hanya dapat menghitung beberapa fungsi pada bilangan asli,…. Anehnya (atau tidak), ternyata setiap model perhitungan (yang benar-benar dapat diwujudkan dalam jagat fisik kita) dapat menghitung fungsi yang sama pada bilangan alami (setidaknya untuk semua model yang telah kita temukan sampai sekarang). [Catatan: jelas, ada model komputasi yang lebih lemah , tetapi kami belum menemukan yang lebih kuat, kecuali beberapa yang jelas-jelas tidak kompatibel dengan alam semesta fisik kita, seperti model yang menggunakan bilangan real atau perjalanan waktu.]

Fakta ini, bahwa setelah lama mencari banyak model yang berbeda, kami menemukan, setiap saat, bahwa mereka dapat menghitung fungsi yang persis sama, adalah dasar untuk Turing-Turing-Gereja, yang mengatakan (secara kasar) bahwa semua model-model perhitungan sama kuatnya, dan bahwa semuanya menangkap gagasan "ideal" tentang apa artinya menjadi "dapat dihitung". (Ada juga aspek CTT kedua yang lebih filosofis, yaitu bahwa manusia yang mengikuti algoritme juga dapat menghitung fungsi yang persis sama dengan yang dapat dihitung TM dan tidak lebih.)

Namun , tidak ada yang mengatakan apa-apa tentang ini

  • seberapa efisien berbagai model
  • betapa nyamannya mereka untuk digunakan
  • apa lagi yang bisa mereka lakukan selain menghitung fungsi pada bilangan asli

Dan bahwa justru di mana perbedaan antara model yang berbeda dari perhitungan (dan bahasa pemrograman) ikut bermain.

O(sizearray)O(sizearray2)sizearraysizearray

Sebagai contoh untuk kenyamanan yang berbeda, Anda bisa membandingkan kode yang ditulis dalam bahasa tingkat tinggi, kode yang ditulis dalam rakitan, dan deskripsi TM untuk memecahkan masalah yang sama.

Dan saklar lampu Anda adalah contoh dari jenis ketiga perbedaan, hal-hal yang dapat dilakukan beberapa model yang tidak berfungsi pada bilangan asli dan karenanya tidak ada hubungannya dengan kelengkapan Turing.

Untuk menjawab pertanyaan spesifik Anda:

Tapi bisa saja program yang ditulis dalam bahasa yang lengkap Turing harus ditulis ulang di lain?

Tidak. Hanya jika program menghitung fungsi Turing-computable pada bilangan asli. Dan bahkan kemudian, mungkin perlu pengkodean yang kompleks. Sebagai contoh, λ-calculus bahkan tidak memiliki bilangan asli, mereka perlu dikodekan menggunakan fungsi (karena fungsi adalah satu-satunya yang dimiliki λ-calculus).

Pengkodean input dan output ini bisa sangat kompleks, seperti yang dapat mengekspresikan algoritma. Jadi, walaupun benar bahwa program apa pun dapat ditulis ulang, program yang ditulis ulang mungkin jauh lebih kompleks, lebih besar, menggunakan lebih banyak memori, dan jauh lebih lambat.

Bagaimana jika Majelis saya memiliki kode sandi LIGHTBUTTON? Secara fisik saya tidak dapat meniru bahasa itu pada sistem (bahasa) tanpa bola lampu.

Bola lampu bukan fungsi Turing yang dapat dihitung pada bilangan asli. Sungguh, bola lampu bukanlah fungsi atau perhitungan. Mengaktifkan dan menonaktifkan bola lampu adalah efek samping I / O. Mesin Turing tidak memodelkan efek samping I / O, dan Kelengkapan Turing tidak relevan bagi mereka.

Pada bilangan real arbitrer.

Kelengkapan Turing hanya berkaitan dengan fungsi yang dapat dihitung pada bilangan asli, itu tidak berkaitan dengan bilangan real.

Kelengkapan Turing sama sekali tidak menarik ketika datang ke pertanyaan seperti milik Anda karena dua alasan:

  1. Ini bukan rintangan yang sangat tinggi. Yang Anda butuhkan adalah IF, GOTO, WHILE, dan satu variabel bilangan bulat (dengan asumsi variabel dapat menahan bilangan bulat sewenang-wenang besar). Atau, rekursi. Banyak dan banyak dan banyak hal yang Turing-lengkap. Permainan kartu Magic: The Gathering sudah selesai Turing. CSS3 selesai-Turing. File sendmailkonfigurasi selesai Turing. Intel x86 MMU sudah selesai Turing. MOVInstruksi Intel x86 adalah Turing-complete. Animasi PowerPoint sudah selesai Turing. Excel (tanpa skrip, hanya menggunakan rumus) sudah selesai Turing. Protokol perutean BGP sudah selesai Turing. sedadalah Turing-complete. mod_rewriteAturan Apache sudah lengkap Turing. Google untuk " (secara tidak sengaja ATAU mengejutkan) telah selesai"untuk menemukan beberapa contoh menarik lainnya. Jika hampir semuanya Turing-lengkap, Turing-lengkap berhenti menjadi properti yang menarik.
  2. Sebenarnya tidak perlu berguna. Banyak hal bermanfaat yang belum selesai Turing. CSS sebelum versi 3 tidak Turing-lengkap (dan fakta bahwa CSS3 adalah tidak benar-benar digunakan oleh siapa saja). SQL sebelum 1999 tidak menyelesaikan-Turing, namun, itu sangat berguna bahkan saat itu. Bahasa pemrograman C tanpa pustaka tambahan sepertinya tidak lengkap Turing . Bahasa yang diketik dengan tergantung, kurang lebih menurut definisi, bukan Turing-complete, namun, Anda dapat menulis sistem operasi, server web, dan game di dalamnya.

Edwin Brady, penulis Idris, menggunakan istilah "Tetris-complete" untuk membicarakan beberapa aspek ini. Menjadi Tetris-complete tidak didefinisikan dengan ketat (selain dari yang jelas "dapat digunakan untuk mengimplementasikan Tetris"), tetapi itu mencakup hal-hal seperti menjadi tingkat tinggi dan cukup ekspresif sehingga Anda dapat menulis permainan tanpa menjadi gila, mampu berinteraksi dengan dunia luar (input dan output), mampu mengekspresikan efek samping, mampu menulis loop peristiwa, mampu mengekspresikan pemrograman reaktif, asinkron, dan bersamaan, mampu berinteraksi dengan sistem operasi, mampu untuk berinteraksi dengan perpustakaan asing (dengan kata lain: bisa memanggil dan dipanggil dengan kode C) dan sebagainya. Itu adalah fitur yang jauh lebih menarik dari bahasa pemrograman tujuan umum daripada Turing-kelengkapannya.


Anda mungkin menemukan jawaban saya untuk pertanyaan yang Anda tautkan menarik, yang menyentuh beberapa poin yang sama meskipun menjawab pertanyaan yang berbeda.

Jörg W Mittag
sumber
7
Saya sangat suka jawaban ini, tetapi saya pikir perlu dicatat bahwa kita dapat mewakili segala macam hal yang menarik dengan bilangan alami. Misalnya kita dapat merepresentasikan string dengan bilangan natural, kita dapat merepresentasikan grafik dengan bilangan alami, kita dapat mewakili seluruh keadaan memori komputer dengan bilangan alami. Bilangan real dapat dikodekan sebagai fungsi pada bilangan asli dan (banyak) fungsi pada bilangan alami dapat dikodekan oleh bilangan alami. Jadi membatasi fungsi dari bilangan asli ke bilangan asli bukanlah batasan besar - kecuali jika gelap dan Anda ingin komputer Anda menyalakan lampu.
Theodore Norvell
3
Jawaban yang bagus, tetapi ini: "menjadi Turing-lengkap berhenti menjadi properti yang menarik" jelas salah. Jika ada sesuatu yang Turing-lengkap, maka masalah penghentiannya adalah Turing-complete dengan pengurangan yang dapat dihitung untuk masalah penghentian untuk mesin Turing. Misalnya, permainan kartu Magic: The Gathering selesai Turing. Ini berarti bahwa aturannya tidak dapat diputuskan , yaitu dalam kasus umum tidak mungkin untuk menyimpulkan secara apa yang akan menjadi kondisi permainan berikut, yang merupakan properti yang sangat menarik. Lebih serius, kami menggunakan Turing-kelengkapan dan pengurangan untuk membuktikan masalah tidak dapat diputuskan.
quicksort
Turing dan rekan-rekannya tertarik pada fungsi bilangan alami, tetapi mesin Turing tidak benar-benar berurusan dengan angka, mereka berurusan dengan serangkaian simbol. Jelas Anda dapat menafsirkan trivia dari simbol hingga terbatas dalam alfabet terbatas yang dikenal sebagai bilangan alami, tetapi TM tidak secara langsung melakukan hal-hal "bernomor" dengan input mereka, mereka hanya memanipulasi "digit". Sebenarnya perlu sedikit logika untuk beralih dari deskripsi standar TM ke "fungsi pada bilangan asli"; saat bekerja dengan TM, Anda menyandikan bilangan asli sebagai string, bukan string sebagai angka.
Ben
Ini jelas merupakan jawaban yang bagus tetapi saya khawatir itu melampaui pemahaman OP. OP sudah bingung tentang menerapkan perkalian pada (himpunan bagian dari) bilangan real. Mengingat hal ini, jawaban Anda tampaknya menyiratkan bahwa bahasa pemrograman Turing-complete tidak, pada kenyataannya, dapat ditukar dengan tujuan komputasi murni, padahal kenyataannya (karena semua yang dilakukan CPU modern - bukan hanya beberapa hal - dapat dikodekan sebagai alami angka).
Konrad Rudolph
9
@TheodoreNorvell Tentang penyandian bilangan real dengan bilangan alami. Faktanya, hampir semua bilangan real tidak dapat dikodekan oleh bilangan natural. Himpunan bilangan real yang dapat dikodekan oleh bilangan alami, berdasarkan yang dikodekan oleh bilangan alami, paling banyak tak terhingga. Dan karena itu hanya tak terhingga, himpunan memiliki ukuran nol. Agak tidak jujur ​​untuk mengatakan bahwa kita dapat mewakili bilangan real secara umum dengan bilangan alami karena kita hanya dapat mewakili sebagian kecil dari mereka, atau lebih tepatnya: 0%.
Shufflepants
9

Tentu saja Anda dapat menerapkan perkalian dengan penambahan dan pengurangan:

/* Assume b is positive for simplicity */
int multiply(int a, int b) {
  int res = 0;
  while (b > 0) { res += a; b -= 1; }
  return res;
}

Fakta bahwa Anda kemungkinan tidak akan melakukan itu tidak membuatnya kurang mungkin.

Divisi hampir tidak lebih sulit:

/* Assume a and b are positive for simplicity */
int divide(int a, int b) {
  int res = 0;
  while (a >= b) { res += 1; a -= b; }
  return res;
}

Dan bagaimana menurut Anda penggandaan dan pembagian sebenarnya dilakukan oleh sirkuit CPU? Petunjuk: ini bukan tabel pencarian yang besar. Ini lebih efisien daripada yang di atas, karena bit shifting juga digunakan, tetapi pada dasarnya diterapkan dalam hal penambahan dan pengurangan.

rici
sumber
4
2precision
7
@touring: Anda tahu, aritmatika floating point tersedia sebelum ada coprocessor floating point.
rici
6

Tidak ada mesin fisik (benar-benar ada) yang dapat atau pernah menjadi Turing lengkap, karena kelengkapan Turing membutuhkan penyimpanan tanpa batas dan alam semesta tidak terbatas.

Oleh karena itu, jawaban afirmatif untuk apakah dua mesin abstrak adalah setara tidak membantu Anda menjawab pertanyaan apakah dua perkiraan fisik dari mesin-mesin itu setara.

Oleh karena itu, kesetaraan Turing dari model abstrak (misalnya) dua bahasa tidak berarti bahwa masing-masing dapat menghitung segala sesuatu yang lain dapat menghitung dalam praktek. Seseorang mungkin menghadapi keterbatasan fisik sebelum yang lain.

Ben
sumber
Tetapi pertanyaannya adalah tentang bahasa. Itu menyebutkan mesin tertentu, tetapi hanya karena dia tidak menyadari bahwa hampir tidak ada mesin nyata yang beroperasi pada bilangan real.
Shufflepants
3

nm=n+n(m1)m/n=1+(mn)/n

Sebagai soal fakta, operasi “tambah 1”, “kurangi 1” dan “lompatan bersyarat jika register yang ditentukan adalah nol” sudah cukup untuk membuat model komputasi Turing-complete (lihat mesin 2-counter sebagai referensi untuk suatu model komputasi Turing-complete sangat minim).

22n=n+n2m×2n=2m×nm×(2n+1)=m+2m×n

quicksort
sumber
3

tl; mesin dr - Turing hanyalah deskripsi logis dasar untuk operasi sistem logis umum. Mereka dapat melakukan sebagian besar hal yang dapat kami gambarkan, termasuk memanggil opcode khusus dan membangun operasi matematika.


Bagaimana jika Majelis saya memiliki kode sandi LIGHTBUTTON? Secara fisik saya tidak dapat meniru bahasa itu pada sistem (bahasa) tanpa bola lampu.

Dalam model Turing, simbol seperti LIGHTBUTTONopcode hanyalah string dalam alfabet apa pun yang digunakan komputer Turing.

Jadi, mesin Turing akan bertanggung jawab untuk memproduksi string "LIGHTBUTTON", atau nilai integer yang sesuai dengan opcode itu; apakah entitas eksternal bertindak atas hal itu atau bukan bisnis komputer Turing.

Program C memiliki batasan yang sama. Ini adalah, sebuah program C hanya dapat memanggil opcode LIGHTBUTTON, tetapi apakah CPU benar-benar melakukan operasi yang terkait dengan opcode itu hingga CPU.


Tetapi bagaimana dengan perangkat yang tidak memiliki multiplikasi? divisi? Sepengetahuan saya (meskipun ini lebih merupakan pertanyaan untuk matematika. SE), seseorang tidak dapat meniru perkalian (dan jelas bukan pembagian) dengan penambahan dan pengurangan [pada bilangan real arbitrer].

Yup, mesin Turing dapat melakukan hal-hal itu, bahkan pada bilangan real, sejauh yang bisa dijelaskan oleh logika manusia. Mesin Turing bisa sesederhana otomatisasi seluler Peraturan 110 .

Triknya adalah membangun sistem logika dari fisika apa pun yang dimiliki mesin secara alami. Sebagai contoh, CPU mainstream dapat melakukan perkalian dan pembagian karena mereka memiliki unit logika aritmatika (ALU) . Tapi ALU itu bukan sihir; mereka hanya gerbang logika sederhana sendiri. Dan gerbang logika itu terbuat dari transistor . Dan transistor-transistor itu terbuat dari pasir yang diolah .

Jadi, untuk mendapatkan perangkat Turing-lengkap untuk melakukan matematika, hanya harus memprogram seperti itu.

ππ=0ππππ=0

Nat
sumber
3

Tapi bisakah program yang ditulis dalam bahasa lengkap Turing ditulis ulang di program lain?

Jika input ke program adalah urutan bit yang sewenang-wenang, dan outputnya juga merupakan urutan bit yang panjangnya sewenang-wenang, maka YES. Dengan asumsi Anda memiliki waktu dan energi untuk menulis ulang, dan bahwa Anda tidak peduli dengan kinerja, dan bahwa Anda memiliki memori fisik yang cukup untuk kedua implementasi.

Pertimbangan praktis yang berarti dua bahasa lengkap Turing tidak dapat dipertukarkan meliputi:

  • mereka mendukung berbagai jenis input dan output (misalnya akses database SQL)

  • mereka memiliki pustaka tipe data yang berbeda (mis. dukungan untuk string Unicode)

  • mereka menyediakan paradigma pemrograman berbeda yang dioptimalkan untuk tugas yang berbeda (misalnya objek, utas, coroutine, fungsi kelas satu)

  • mereka menyediakan pustaka fungsi yang berbeda (misalnya parsing XML dan serialisasi)

Michael Kay
sumber
1

Tidak. Kelengkapan Turing tidak ada hubungannya dengan program , ini tentang fungsi matematika (atau algoritma ). Algoritma apa saja - perhitungan apa saja - dapat Anda lakukan dalam C, Anda dapat melakukannya dalam bahasa lengkap Turing lainnya (ini harus jelas). Tapi kelengkapan Turing sebenarnya tidak mengatakan Anda bisa melakukan I / O - sama sekali. Tidak berbicara tentang perangkat keras sama sekali. Hanya perhitungannya.

Anda dapat memperluas bahasa lengkap Turing dengan operasi perangkat keras apa pun yang Anda inginkan (secara teknis, ini adalah caranya fputcdan fgetcbekerja di C). Jika Anda mengambil dua bahasa lengkap Turing dan memperluasnya dengan operasi spesifik perangkat keras yang identik , maka mereka tetap dapat dipertukarkan. Jadi bahasa assembly Anda dengan LIGHTBULBoperasi lebih kuat daripada Turing-complete; Anda bisa mengatakan sudah selesai TuringLIGHTBULB . Untuk membuat bahasa lain identik dengan itu, itu juga harus Turing-selesai selesai LIGHTBULB; cara termudah untuk melakukannya adalah dengan menambahkan LIGHTBULBprimitif / instruksi / fungsi / dll.

Inilah sebabnya mengapa implementasi C umumnya mendukung assembler inline, atau mendokumentasikan cara memanggil fungsi yang ditulis dalam assembler, dan mengapa implementasi bahasa lain umumnya menyediakan cara untuk memanggil fungsi yang ditulis dalam C.

Jonathan Cast
sumber