Bahasa while
program dapat mengekspresikan fungsi yang dapat dihitung secara komputasi. (Ini benar bahkan jika satu-satunya operasi aritmatika pada variabel adalah, katakanlah, kenaikan dan pengurangan.)
Jika while
digantikan oleh for
, membuat loop selalu dibatasi, bahasa kemudian hanya dapat mengekspresikan fungsi rekursif primitif.
Baru-baru ini saya menjadi sadar akan kelas fungsi-fungsi dasar , yang benar-benar di bawah fungsi rekursif primitif, tetapi masih benar-benar di atas hierarki eksponensial.
Jelas akan mungkin untuk mendefinisikan bahasa pemrograman imperatif yang menangkap persis fungsi dasar, katakanlah dengan memperkenalkan operator untuk jumlah dan produk terbatas. Namun, pertanyaan saya adalah,
Apakah ada perubahan sintaksis pada bahasa
while
program yang membatasi fungsi-fungsi dasar dan yang dapat dinyatakan sebagai pembatasan (while
->for
) ke fungsi rekursif primitif?
Pembatasan pada for
program sebagai gantinya juga akan cukup, tentu saja, dan mungkin saya harus menjelaskan bahwa saya tidak mencari sesuatu yang benar - benar - sederhana, hanya sesuatu dengan kesederhanaan yang sebanding yang tidak memerlukan penambahan operator tambahan atau sejenisnya .
Sunting : Contoh for
bahasa representatif adalah PL- {GOTO} dari Brainerd dan Landweber "Theory of Computation" (1974), di mana setiap program memiliki jumlah variabel yang terbatas tetapi tidak terbatas, yang masing-masing dapat berisi bilangan asli, dan yang pada dasarnya terdiri dari perintah-perintah berikut:
X <- 0
(tetapkan 0 ke variabel)X <- Y
(tetapkan nilaiY
untukX
)X <- Y + 1
(menugaskan penerus nilaiY
untukX
)LOOP X; ... END;
(ulangi blok kode yang berisiX
waktu; tidak berubahX
)
Para penulis memberikan bukti bahwa ini dapat mengekspresikan persis fungsi rekursif primitif. Bahasa PL tidak cocok dengan pertanyaan dengan sempurna, karena ia menggunakan GOTO
alih-alih while
, dan PL- {GOTO} berasal dari PL dengan menghapusnya GOTO
. Namun, program PL hanya sebagai kuat sebagai while
program, dan ini GOTO
transformasi -removal sama hanya dinyatakan sebagai mengganti while
denganfor
. (Boleh dibilang mungkin bahkan sedikit lebih sederhana.)
Sunting 2 : http://en.wikipedia.org/wiki/Total_Turing_machine menyarankan hasil ini kembali ke: Meyer, AR, Ritchie, DM (1967), Kompleksitas program loop , Proc. Pertemuan Nasional ACM, 465.
sumber
for
loop, tetapi saya belum pernah melihat bukti. Sudahkah Anda?LOOP
(apa yang saya sebutfor
) danGOTO
, Turing-complete, tetapi tanpaGOTO
itu hanya dapat mengekspresikan fungsi pr. Saya akan mengedit pertanyaan untuk memasukkan deskripsi singkat tentang bahasa ini.Jawaban:
Menurut hasil klasik Meyer dan Ritchie (disebutkan dalam makalah yang dikutip dalam pertanyaan), fungsi dasar dicirikan oleh program LOOP di mana kedalaman bersarang untuk for-loop dibatasi paling banyak 2.
sumber
Dugaan saya hanya didasarkan pada definisi: satu jawaban mungkin "pembatasan loop untuk loop paralel yang memalukan
for
".Definisi kerja saya tentang "paralel memalukan
for
loop " adalah di mana tidak ada iterasi yang memiliki ketergantungan data pada iterasi lain dan ada fungsi peredam biner untuk menggabungkan output (bersama dengan case dasar). Poin memalukan bonus jika fungsi peredam adalah asosiatif, tapi saya tidak tahu apakah perbedaan itu akan membatasi kekuatan bahasa.Jika kita membatasi pengurang yang diizinkan untuk penambahan dan penggandaan, sepertinya bagi saya bahwa program apa pun yang diterapkan di bawah pembatasan ini dapat ditulis sebagai fungsi rekursif dasar (dan sebaliknya). Saya kurang yakin tentang reduksi yang lebih umum.
Jadi cara yang menyenangkan untuk mengatakannya adalah bahwa hanya konstruksi perulangan bahasa Anda adalah MapReduce.
Saya bukan ahli di bidang ini, tetapi saya ingin mengusulkan ini sebagai hipotesis dan melihat pendapat orang.
Ini tampaknya benar secara paralel-
for
program ketika fungsi peredam terbatas pada penambahan atau perkalian, tetapi tampaknya tidak benar untuk pilihan peredam yang lebih luas. Saya ingin menemukan bahwa kita bisa mendapatkan fungsi dasar setiap kali kita membatasi peredam untuk berjalan dalam waktu polinomial (perkalian adalah linier dalam model ini), tetapi saya harus mencoba untuk menyelesaikannya.Edit 2 . Benar, jadi sepertinya kita harus mengizinkan fungsi peredam yang berjalan dalam waktu polinomial untuk memulihkan fungsi dasar rekursif. [1] Kemudian kita perhatikan bahwa pembatasan ini tidak begitu menarik, karena fungsi polinomial dalam model ini hanya yang dapat diekspresikan oleh program dengan
for
loop tunggal ataufor
loop paralel dengan fungsi reducer non-looping. Jadi pada dasarnya kami baru saja memulihkan batasan yang dimiliki oleh program hingga duafor
loop bersarang , tetapi kami baru saja memindahkan batasan itu ke fungsi peredam.Ringkasan: Karakterisasi tampaknya berlaku untuk reduksi yang dijalankan dalam waktu polinomial. Tidak jelas apakah ini menarik.
for
for
for
sumber