Saya tahu bahwa, dalam bahasa pemrograman imperatif, loop sementara-lakukan sudah cukup sebagai konstruk aliran kontrol untuk membuat bahasa Turing-lengkap (sejauh aliran kontrol berlangsung - tentu saja kita juga memerlukan memori tidak terbatas dan operator tertentu ...) . Inti dari pertanyaan saya adalah: apakah loop do-while memiliki kekuatan komputasi yang sama dengan loop sementara-do? Dengan kata lain, dapatkah sebuah bahasa menjadi Turing-lengkap jika tidak mungkin untuk melewatkan instruksi sepenuhnya.
Saya menyadari bahwa beberapa semantik di sini bisa sedikit ambigu, jadi izinkan saya mengutarakan pertanyaan aktual dengan contoh spesifik:
Brainfuck (BF) adalah turing Turing di mana satu-satunya aliran kontrol adalah loop sementara, dilambangkan sebagai [...]
(ada spesifikasi bahasa lengkap di bagian bawah pertanyaan, jika Anda tidak terbiasa dengan Brainfuck). Mari kita mendefinisikan bahasa baru BF *, di mana ,.+-<>
memiliki semantik yang sama dengan di BF, tetapi alih-alih []
kita memiliki {}
yang menunjukkan loop do-while. Yaitu, satu-satunya perbedaan pada BF adalah bahwa setiap loop dijalankan setidaknya satu kali sebelum iterasi lebih lanjut dapat dilewati.
Apakah BF * Turing-lengkap? Jika ya, saya akan tertarik pada bagaimana saya bisa menerjemahkan BF ke BF *. Jika tidak, bagaimana saya membuktikannya?
Beberapa pengamatan saya sendiri:
- Tidak setiap program BF dapat diterjemahkan ke dalam BF *. Misalnya, tidak mungkin untuk menulis program dalam BF * yang mungkin atau mungkin tidak membaca atau mencetak nilai - jika program berpotensi mencetak satu atau lebih nilai, ia akan selalu mencetak setidaknya satu. Namun, mungkin ada subset Turing-complete dari BF yang dapat diterjemahkan ke BF *.
- Kami tidak dapat dengan mudah menerjemahkan
[f]
(di manaf
ada beberapa program Brainfuck yang sewenang-wenang yang hanya terdiri dari+-[]<>
) untuk (dalam upaya untuk membatalkan efek dari iterasi pertama), karena a) tidak setiap fungsi yang dihitung memiliki kebalikan yang dapat dihitung dan b) bahkan jika itu terjadi, tidak harus memiliki loop yang lebih sedikit daripada menerapkan langkah ini secara rekursif tidak dijamin untuk berakhir di tempat pertama.f-1{f}
f-1
f
Berikut ini adalah ikhtisar cepat atas bahasa Brainfuck. Brainfuck beroperasi pada pita tanpa batas di mana setiap sel berisi nilai byte, awalnya nol. Meluap membungkus, sehingga kenaikan 255 memberi 0 dan sebaliknya. Bahasa ini terdiri dari 8 instruksi:
+ Increment the current cell.
- Decrement the current cell.
> Move tape head to the right.
< Move tape head to the left.
, Input a character from STDIN into the current cell.
. Output the current cell as a character to STDOUT.
[ If the current cell is zero, jump past the matching ].
] If the current cell is non-zero, jump back to just behind the matching [.
[]
tidak persis mendefinisikan loop "sambil melakukan" di BF. seperti pada tabel Anda kurung kiri dan kanan mengevaluasi nol sel saat ini / bukan nol. jadi apa deskripsi yang tepat dari {}
logika evaluasi kawat gigi yang sesuai ? sarankan dialog / diskusi lebih lanjut dalam Obrolan Ilmu Komputer . juga "pengamatan" Anda lebih seperti "postulat" atau "proposisi" tanpa bukti.
{}
adalah {
tidak melakukan apa-apa dan }
sama dengan ]
. Saya tidak akan punya banyak waktu selama beberapa hari ke depan, tetapi saya akan bergabung dengan Anda dalam obrolan ketika saya menemukan waktu.
{}
dan pengambilan yang diberikan []
, adalah BF * Turing lengkap. dengan pemahaman bahwa BF []
adalah konstruksi hanya sesuatu yang agak mirip / analog dengan loop sementara di Turing bahasa lengkap.