S'il n'y a pas de solution c'est qu'il n'y a pas de problème
— Proverbe Shadock
Von Neumann Style
Fossé Sémantique
Fossé Sémantique
Architectures dédiées
Architectures Dataflow
Machines Lisp
Penser différemment
Programmer avec des fonctions
functĭo, ōnis, f. (fungor), accomplissement, exécution
— Dictionnaire Gaffiot
Fonction
Transparence référentielle & pureté
Une expression $\mathcal{e}$ est référentiellement transparente si
du point de vue d'un programme $\mathcal{P}$, toute occurence de $\mathcal{e}$
peut être remplacée par le résultat de son évaluation sans changer le sens de $\mathcal{P}$
Une fonction $\mathcal{f}$ est pure si $\mathcal{f(e)}$ est référentiellement transparente pour tout $\mathcal{e}$ référentiellement transparent
Quizz
public static int[] insertionSort(int array[]) {
int n = array.length;
int[] result = new int[n];
for (int j = 0; j < n; j++) {
int key = array[j];
int i = j-1;
while ( (i > -1) && ( result[i] > key ) ) {
result [i+1] = result[i];
i--;
}
result[i+1] = key;
}
return result;
}
Quizz
public static int[] insertionSort(int array[]) {
int n = array.length;
for (int j = 0; j < n; j++) {
int key = array[j];
int i = j-1;
while ( (i > -1) && ( array[i] > key ) ) {
array [i+1] = array[i];
i--;
}
array[i+1] = key;
}
return array;
}
$plus \equiv \lambda m. \lambda n. \lambda f. \lambda x . m f (n f x)$
Codage de Church
Exemple de réduction
$plus \: 1 \: 2$
$\triangleright \: $$\lambda m. \lambda n. \lambda f. \lambda x . m f (n f x)$$ \: 1 \: 2$
$\triangleright \: \lambda f. \lambda x . $$1$$ \:f \: ($$2$$ \: f \: x)$
$\triangleright \: \lambda f. \lambda x . $$(\lambda f'.\lambda x'.f'(x'))$$ \:f \:(2 \:f \: x)$
$\triangleright \: \lambda f. \lambda x . $$f \: (2 \: f \: x)$
$\triangleright \: \lambda f. \lambda x . f ($$\lambda f''. \lambda x'' . f''(f''(x''))$$ \: f \: x)$
$\triangleright \: \lambda f. \lambda x . f ($$f(f(x))$$)$$ \: \equiv \: 3$
Ensembles
type Set e = e -> Bool
empty :: Set e
empty = \e -> False
single :: (Ord e) => e -> Set e
single v = \e -> v == e
range :: (Ord e) => e -> e -> Set e
range x y = \e -> e >= x && e <= y
Ensembles
union :: Set e -> Set e -> Set e
union s1 s2 = \e -> (s1 e || s2 e)
inter :: Set e -> Set e -> Set e
inter s1 s2 = \e -> (s1 e && s2 e)
enum :: (Ord e) => [e] -> Set e
enum v = \e -> any (== e) v
enum :: (Ord e) => [e] -> Set e
enum l = foldr (union . single) empty l
Ensembles
*Main> let s = inter (enum (take 20 fibonacci)) (range 50 1000)
*Main> s 5
False
*Main> s 89
True