Уявіть функціональну мову програмування, єдиним типом даних якої є чисельні скаляри та довільні вставки масивів. У мові відсутні будь-які засоби безмежної ітерації, тому заборонено наступне:
- явні петлі (не так багато використання без побічних ефектів)
- рекурсія
- довільні функції першого класу (без у-комбінатора)
Однак мова має:
- функції верхнього рівня
- лексично охоплені нехай палітурки
- розгалуження контрольного потоку
- загальні скалярні математичні та логічні функції
- деякий простий конструктор масиву, як fill (n, x), який створює масив n елементів з однаковими значеннями x
- найголовніше: обмежений набір операторів вищого порядку, які виконують паралельну структуровану ітерацію (наприклад, карта, зменшення, сканування, всі пари).
Щоб бути більш конкретними щодо операторів паралельних даних:
- y = карта (f, x) => y [i] = f [i]
- y = зменшити (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ...))) для деякої перестановки p
- y = сканування (f, a, x) => y [i] = зменшити (f, a, y [0 ... i-1])
- y = allpairs (f, x, y) => y [i, j] = f (x [i], y [j])
У нас можуть бути й інші оператори, але для того, щоб кваліфікувати, вони повинні мати тривалість полінома, бути реалізованою за якоюсь розумною моделлю паралельних обчислень даних та використовуватись у більшості поліноміального простору.
Очевидно, є деякі конструкції, які неможливо виразити цією мовою, такі як:
while f(x) > tol:
x <- update(x)
Що ми можемо виразити в цій системі? Чи ми обмежені лише пошуком проблем у ПП? Чи можемо ми захопити всі поліноміальні алгоритми часу? Також є якийсь мінімальний набір операторів для цього класу?