Bisakah bahasa biasa Turing selesai?

32

Saya membaca tentang Iota dan Jot dan menemukan bagian ini membingungkan:

Tidak seperti Iota, di mana pohon sintaksis untuk string dapat bercabang baik di kiri atau di kanan, sintaks Jot secara seragam bercabang kiri. Akibatnya, Iota benar-benar bebas konteks, tetapi Jot adalah bahasa biasa.

Pemahaman saya adalah bahwa kedua Iota dan Jot adalah Turing lengkap. Namun ternyata, yang satu bebas konteks, dan yang lainnya teratur! Tentunya bahasa reguler tidak bisa Turing lengkap?

sdleihssirhc
sumber
3
Perhatikan bahwa bahasa yang menggambarkan mesin turing dapat dengan mudah ditulis dalam bahasa biasa, misalnya i = {0,1, -1}, b = {akhir input} (i + bi + bi) + b (i +) menjelaskan seperangkat aturan yang tidak kosong diikuti oleh input yang tidak kosong. Atau, lebih tepatnya, Anda dapat menafsirkannya seperti itu jika Anda memiliki seorang juru bahasa, yang, seperti jawaban yang disebutkan, adalah konsep yang terpisah dengan kelas bahasa.
Cubic
1
@Cubic: dalam hal ini, mesin Turing dapat diberi nomor sehingga setiap angka mewakili tepat satu mesin (yaitu mereka dapat dihitung), dan angka-angka itu dapat dinyatakan dalam notasi unary. Saya tidak pernah mempelajari hal-hal ini dengan benar, jadi saya harus mengerjakan definisi, tapi saya rasa 1*0adalah bahasa biasa ;-) Meskipun bukan bahasa pemrograman yang sangat ramah baik untuk programmer atau penulis kompiler.
Steve Jessop

Jawaban:

40

Singkatnya, jawabannya adalah ya.

Tetapi Anda mencampurkan dua makna yang sama sekali tidak terkait dengan istilah "bahasa" (ya, ini membingungkan):

  • Satu set string. "Bahasa bebas konteks" berarti "serangkaian string yang dapat dikenali menggunakan tata bahasa bebas konteks".
  • Cara menentukan perhitungan. "Bahasa Turing-complete" berarti "cara menentukan program di mana mesin Turing dapat ditentukan".

Perhatikan bahwa Anda dapat berbicara tentang "bahasa C ++" dari dua sudut pandang yang sama sekali tidak terkait, menggunakan dua arti yang tidak terkait dari kata "bahasa":

  • C ++ sebagai satu set string yang legal menurut tata bahasa C ++
  • C ++ sebagai cara menentukan program.

Ciri-ciri "bahasa C ++" dari dua sudut pandang ini tidak berhubungan.

Lebih banyak contoh untuk membantu Anda memisahkan konsep-konsep ini:

  • Ekspresi "[az] + @ [az]. [Az]" menggambarkan serangkaian string yang dikenali oleh automata terbatas, yaitu bahasa biasa. Namun, hanya itu - serangkaian string: bukan cara menentukan program (kecuali jika Anda menganggap cara untuk menafsirkan setiap string seperti program), jadi tidak masuk akal untuk berbicara tentang apakah itu Turing atau tidak. lengkap.
  • Bahasa diagram alur adalah cara menentukan program; tergantung pada rasa tertentu dari diagram alur, itu mungkin atau mungkin tidak Turing-lengkap. Namun, diagram alur bukan string, jadi sama sekali tidak masuk akal untuk berbicara tentang diagram alur dalam arti "bahasa sebagai seperangkat string".
Jkff
sumber
3
Saya ingin menambahkan bahwa itu (([a-z][0-9]*)*[A-Z][0-9]*([a-z][0-9]*)*->([a-zA-Z][0-9]*)*)*adalah bahasa reguler yang dapat menggambarkan tata bahasa dari bahasa apa pun di kelas 0
Erbureth mengatakan Reinstate Monica
2
{0,1}
10

Sementara serangkaian program hukum di Jot adalah reguler, Jot sendiri adalah Turing-complete. Itu berarti bahwa setiap fungsi yang dapat dikomputasi dapat diekspresikan dalam Jot. Kita bahkan dapat menemukan bahasa di mana semua string biner legal, tetapi bahasa itu sendiri adalah Turing lengkap (latihan). Anda membingungkan sintaks dan semantik.

Omong-omong, bahasa bebas konteks juga (mungkin) tidak lengkap-NP, karena mereka memiliki algoritma penguraian waktu polinomial.

Yuval Filmus
sumber
9

Sintaks sendiri (seperti yang dikodekan dalam pohon sintaks) bahasa pemrograman modern jauh dari semua yang mereka lakukan. Bahkan, bahasa formal yang didefinisikan oleh himpunan semua program dalam bahasa tertentu yang dikompilasi tanpa kesalahan bahkan jarang bebas konteks .

Faktor statis dan dinamis menjadi persamaan. Mereka tidak terlihat dalam sintaksis pohon tetapi menentukan apakah sepotong kode sebenarnya adalah sebuah program dan apa yang dihitungnya. Intinya, resp bebas konteks. bahasa formal reguler yang didefinisikan oleh "sintaks" memberikan perkiraan yang berlebihan dari bahasa pemrograman.

Sekarang untuk menjawab pertanyaan Anda: ya, itu mungkin. Pertimbangkan, misalnya, penomoran Gödel dari mesin Turing; Anda mendapatkan "bahasa pemrograman" dari semua bilangan asli, masing-masing mewakili TM. Memang, ini bukan bahasa yang bagus untuk diprogram, tapi tentu saja itu adalah bahasa lengkap Turing yang biasa - sepele, bahkan.

Raphael
sumber
3
  1. Bahasa pemrograman Turing-complete jika cukup ekspresif untuk menentukan setiap fungsi yang dapat dihitung oleh mesin Turing. Di sini kita membahas kekuatan bahasa yang ditentukan dalam bahasa pemrograman . Misalnya tidak sulit untuk menulis juru bahasa untuk mesin Turing dengan Python, jadi Python adalah bahasa pemrograman Turing-complete.

  2. Sintaks dari suatu bahasa pemrograman , yaitu himpunan string yang sesuai dengan program yang valid dalam bahasa pemrograman, itu sendiri adalah bahasa. Misalnya, pertimbangkan set semua program Python yang mungkin. Sintaks bahasa pemrograman bisa peka konteks , bebas konteks , reguler , dll. Kami tertarik pada kesulitan memeriksa bahwa string yang diberikan adalah program yang valid dalam bahasa pemrograman (ini dilakukan oleh kompiler / juru bahasa). Ketika kami mengatakan sintaks dari suatu bahasa pemrograman bebas konteks, itu berarti bahwa ada tata bahasa bebas konteks untuk sintaksnya dan menyiratkan bahwa ada push-down automata untuk memeriksa validitas program,

Perhatikan bahwa kesederhanaan sintaksis suatu bahasa pemrograman tidak menyiratkan suatu batasan pada kekuatan komputasi dari program-program yang ditentukan dalam bahasa-bahasa pemrograman tersebut.

Kaveh
sumber
1

Jawabannya iya. Anda lihat, seperti yang dinyatakan oleh jawaban yang diterima, tata bahasa tidak tergantung dari artinya. Dengan kata-kata Chomsky sendiri:

Saya pikir kita dipaksa untuk menyimpulkan bahwa tata bahasa adalah otonom dan independen dari makna ...

Chomsky, Struktur Sintaksis (1956)

Jika tata bahasa dapat menghasilkan kalimat yang cukup untuk menggambarkan semua hal yang dapat dihitung, maka kita dapat secara sewenang-wenang memberikan makna komputasi pada kalimatnya - satu untuk setiap hal yang dapat dihitung.

Adapun contoh nyata nyata, bahasa populer whitespacememiliki tata bahasa yang teratur dan bahkan mungkin x86 assembly languages(perlu verifikasi).

Eric
sumber
Saya tidak berpikir bagian itu berarti bahwa tata bahasa Go adalah bahasa biasa dalam arti formal; Saya pikir itu hanya berarti bahwa tata bahasanya tidak teratur , yaitu konsisten. Jika sintaksis Go sebenarnya adalah bahasa reguler dalam hierarki Chomsky, itu tidak akan mampu menghasilkan misalnya kurung kurung yang seimbang dan bersarang.
tsleyson
Ya, ada rekursi dalam tata bahasa Go. Memperbarui pos.
Eric