Pembatasan sederhana pada bahasa pemrograman imperatif yang menangkap fungsi-fungsi dasar?

8

Bahasa whileprogram dapat mengekspresikan fungsi yang dapat dihitung secara komputasi. (Ini benar bahkan jika satu-satunya operasi aritmatika pada variabel adalah, katakanlah, kenaikan dan pengurangan.)

Jika whiledigantikan 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 whileprogram yang membatasi fungsi-fungsi dasar dan yang dapat dinyatakan sebagai pembatasan ( while-> for) ke fungsi rekursif primitif?

Pembatasan pada forprogram 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 forbahasa 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 nilai YuntukX )
  • X <- Y + 1(menugaskan penerus nilai YuntukX )
  • LOOP X; ... END;(ulangi blok kode yang berisi Xwaktu; tidak berubah X)

Para penulis memberikan bukti bahwa ini dapat mengekspresikan persis fungsi rekursif primitif. Bahasa PL tidak cocok dengan pertanyaan dengan sempurna, karena ia menggunakan GOTOalih-alih while, dan PL- {GOTO} berasal dari PL dengan menghapusnya GOTO. Namun, program PL hanya sebagai kuat sebagai whileprogram, dan ini GOTOtransformasi -removal sama hanya dinyatakan sebagai mengganti whiledenganfor . (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.

Chris Pressey
sumber
Apakah bahasa Anda memiliki array? Agaknya hanya variabel yang memegang bilangan asli, dan boolean. Bagaimanapun, saya selalu berpikir bahwa fungsi rekursif primitif berhubungan dengan forloop, tetapi saya belum pernah melihat bukti. Sudahkah Anda?
Andrej Bauer
@AndrejBauer: Saya tidak memiliki salinannya saat ini, tetapi saya percaya Brainerd dan Landweber memberikan bukti dalam buku teks mereka Theory of Computation (1974). Mereka menunjukkan bahasa mainan, PL, yang memiliki keduanya LOOP(apa yang saya sebut for) dan GOTO, Turing-complete, tetapi tanpa GOTOitu hanya dapat mengekspresikan fungsi pr. Saya akan mengedit pertanyaan untuk memasukkan deskripsi singkat tentang bahasa ini.
Chris Pressey
Menindaklanjuti jawaban Jan, ini membantu: en.wikipedia.org/wiki/Grzegorczyk_hierarchy
usul

Jawaban:

8

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.

Jan Johannsen
sumber
3
Terima kasih. Menindaklanjuti tindak lanjut usul, untuk n > = 2, program LOOP dengan kedalaman bersarang n sesuai dengan _n_ + 1-th yang diatur dalam hierarki Grzegorczyk.
Chris Pressey
1

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.

HAI(22...n)...k .

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 forloop tunggal atau forloop paralel dengan fungsi reducer non-looping. Jadi pada dasarnya kami baru saja memulihkan batasan yang dimiliki oleh program hingga dua forloop 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.

nHAI(nk)kfor22...n

fornnf(n)f(n)HAI(22...n)

halfornhalf(n)hal(f(n),hal(f(n),...))xxkHAI(f(n)kn)f(n)22nf(n)2...n

n

usul
sumber