Bayangkan sebuah bahasa pemrograman fungsional yang hanya tipe datanya berupa skalar numerik dan susunan array yang sewenang-wenang. Bahasa tidak memiliki sarana iterasi tanpa batas, jadi yang berikut ini tidak diizinkan:
- loop eksplisit (tidak banyak digunakan tanpa efek samping)
- pengulangan
- fungsi kelas satu yang arbitrer (tidak ada kombinator)
Namun, bahasa tersebut memiliki:
- fungsi tingkat atas
- ikatan mengikat lexically lexically
- kontrol aliran bercabang
- fungsi skalar matematika dan logika umum
- beberapa konstruktor array sederhana seperti isian (n, x) yang membuat array n-elemen dengan nilai identik x
- yang paling penting: seperangkat terbatas operator tingkat tinggi yang melakukan iterasi terstruktur paralel (seperti peta, perkecil, pindai, semua-pasangan).
Untuk lebih spesifik tentang operator paralel data:
- y = peta (f, x) => y [i] = f [i]
- y = mengurangi (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ...))) untuk beberapa permutasi p
- y = memindai (f, a, x) => y [i] = mengurangi (f, a, y [0 ... i-1])
- y = semua pasangan (f, x, y) => y [i, j] = f (x [i], y [j])
Kita dapat memiliki operator lain juga, tetapi untuk memenuhi syarat mereka harus memiliki waktu berjalan polinomial, dapat diimplementasikan di bawah beberapa model yang wajar dari perhitungan paralel data, dan digunakan di sebagian besar ruang polinomial.
Jelas ada beberapa konstruksi yang tidak dapat diekspresikan dalam bahasa ini, seperti:
while f(x) > tol:
x <- update(x)
Apa yang bisa kami ungkapkan dalam sistem ini? Apakah kita hanya terbatas pada masalah pencarian di FP? Bisakah kita menangkap semua algoritma waktu polinomial? Juga, apakah ada beberapa set minimal operator untuk kelas ini?