Imaginez un langage de programmation fonctionnel dont les seuls types de données sont des scalaires numériques et des imbrications arbitraires de tableaux. La langue ne dispose d'aucun moyen d'itération illimitée, les éléments suivants sont donc interdits:
- boucles explicites (pas très utiles sans effets secondaires de toute façon)
- récursivité
- fonctions arbitraires de première classe (pas de combinateur y)
La langue a cependant:
- fonctions de niveau supérieur
- reliures let à portée lexicale
- flux de contrôle de branchement
- fonctions mathématiques et logiques scalaires communes
- un constructeur de tableau simple comme fill (n, x) qui crée un tableau à n éléments avec des valeurs identiques x
- le plus important: un ensemble restreint d'opérateurs d'ordre supérieur qui effectuent une itération structurée parallèle (comme la carte, la réduction, le balayage, toutes les paires).
Pour être plus précis sur les opérateurs parallèles de données:
- y = carte (f, x) => y [i] = f [i]
- y = réduire (f, a, x) => y = f (a, f (y [p [0]], f (y [p [1]], ...))) pour une certaine permutation p
- y = scan (f, a, x) => y [i] = réduire (f, a, y [0 ... i-1])
- y = toutes les paires (f, x, y) => y [i, j] = f (x [i], y [j])
Nous pourrions également avoir d'autres opérateurs, mais pour les qualifier, ils devraient avoir un temps d'exécution polynomial, être implémentables sous un modèle raisonnable de calcul parallèle de données et utiliser au maximum l'espace polynomial.
Il y a évidemment des constructions qui ne peuvent pas être exprimées dans ce langage, telles que:
while f(x) > tol:
x <- update(x)
Que pouvons-nous exprimer dans ce système? Sommes-nous limités uniquement aux problèmes de recherche dans FP? Pouvons-nous capturer tous les algorithmes de temps polynomiaux? Existe-t-il également un ensemble minimal d'opérateurs pour cette classe?