Département d'Informatique
Licence Informatique 2001-2002
Programmation Fonctionnelle
7 janvier



Compilation du λ-calcul
(ou comment améliorer l'efficacité de la réduction de graphe
en éliminant systématiquement toutes les variables)



I   Règles de compilation : combinateurs S, K, I

La fonction comb qui transforme une λ-expression en du code SKI est définie par:
comb(k) = k
comb(E1   E2) = comb(E1)   comb(E2)
comb(λ x . E) = [xcomb(E)   où
 [x] (E1   E2) = S   ([x]   E1)   ([x]   E2)
 [x]   k = K   k    (si  k x)
 [x]   x = I
k dénote une constante ou une variable.

Exemple : comb(λ x . (+   x   2)) donne S   (S   (K   +)   I)   (K   2)
Vérification : λ x . (+   x   2)   1 &rarr (+   1   2)
S   (S   (K   +)   I)   (K   2)   1 (+   1   2)
  1. Déterminer le code SKI des λ-expressions suivantes:
    1. λ y . (y   1)
    2. λ x . (+   x   x)
    3. λ x . λ y . (x   y)
    4. λ x . λ y . (y   x)
    5. λ x . λ y . (+   x   y)
  2. Vérifier le résultat des questions précédentes
    en choisissant des arguments arbitraires.

II   Règles d'optimisation : combinateurs B, C, ...

Optimiser le code SKI obtenu en I.1. en utilisant les règles suivantes:





S   (K   E1)   (K   E2) = K   (E1   E2) (1)
S   (K   E)   I = E (2)
S   (K   E1)   E2 = B   E1   E2 (3)
S   E1   (K   E2) = C   E1   E2 (4)

Exemple :
S   (S   (K   +)   I)   (K   2) (2)
= S   +   (K   2) (4)
= C   +   2
Réponses :

I

    1. comb(λ y . (y   1)) = S I (K 1)
    2. comb(λ x . (+   x   x))
      = S (S (K  +) II

    3. comb(λ x . λ y . (x   y))
      = S (S (K S) (S (K KI)) (K I)
    4. comb(λ x . λ y . (y   x))
      = S (S (K S) (K I)) (S (K KI)
    5. comb(λ x . λ y . (+  x   y))
      = [x] (S (S (K +) (K x)) I)
      = S (S (K S) (S (S (K S) (S (K K) (K +))) (S (K KI))) (K I)
II

    1. S I (K 1) (4)
      = C   I   1

    2. S (S (K  +) II (2)
      = S + I

    3. S (S (K S) (
      S (K KI
      )) (K I)
      (2)
      = S 
      (S (K SK)
       (K I)
      (3)
      = S (B S K) (K I) (4)
      = C (B S KI

    4. S (
      S (K S) (K I)
      ) (S (K KI)
      (1)
      = S (K (S I)) (
      S (K KI
      )
      (2)
      = S (K (S I)) K (3)
      = B (S IK

    5. S (S (K S) (S (S (K S) (
      S (K K) (K +)
      )) (S (K KI))) (K I)
      (1)
      = S (S (K S) (S (
      S (K S) (K (K +))
      ) (S (K KI))) (K I)
      (1)
      = S (S (K S) (S (K (S (K +))) (
      S (K KI
      ))) (K I)
      (2)
      = S (
      S (K S) (S (K (S (K +))) K)
      ) (K I)
      (3)
      = S (B S (
      S (K (S (K +))) K
      )) (K I)
      (3)
      = C (B S (B (S (K +)) K)) I
Support du TD :

I

    1. comb(λ y . (y   1))
      = [ycomb((y   1))
      = [y] (comb(y)   comb(1))
      = [y] (y   1)
      = S ([yy) ([y] 1)
      = S I (K 1)
    2. comb(λ x . (+   x   x))
      = [xcomb(+   x  x))
      = [x] (comb(+)   comb(x)   comb(x))
      = [x] (+   x   x)
      = S ([x] (+   x)) ([xx)
      = S (S ([x] +) ([xx)) ([xx)
      = S (S (K  +) II

    3. comb(λ x . λ y . (x   y))
      = [xcomb(λ y . (x   y))
      = [x] ([y] comb(x   y))
      = [x] ([y] (comb(x)   comb(y)))
      = [x] ([y] (x   y))
      = [x] (S ([yx) ([yy))
      = [x] (S (K xI)
      = S ([x] (S (K x))) ([xI)
      = S ([x] (S (K x))) ([xI)
      = S (S ([xS) ([x] (K x))) ([xI)
      = S (S ([xS) (S ([xK) ([xx))) ([xI)
      = S (S (K S) (S (K KI)) (K I)
    4. comb(λ x . λ y . (y   x))
      = [xcomb(λ y . (y   x))
      = [x] ([y] comb(y   x))
      = [x] ([y] (comb(y)   comb(x)))
      = [x] ([y] (y   x))
      = [x] (S ([yy) ([yx))
      = [x] (S I (K x))
      = S ([x] (S I)) ([x] (K x))
      = S (S ([xS) ([xI)) (S ([xK) ([xx))
      = S (S (K S) (K I)) (S (K KI)
    5. comb(λ x . λ y . (+  x   y))
      = [xcomb(λ y . (+  x   y))
      = [x] ([ycomb(+   x   y))
      = [x] ([y] (comb(+)   comb(x)   comb(y)))
      = [x] ([y] (+   x   y))
      = [x] (S ([y] (+   x)) ([yy))
      = [x] (S (S ([y] +) ([yx)) ([yy))
      = [x] (S (S (K +) (K x)) I)
      = [x] (S (S (K +) (K x)) I)
      = S ([x] (S (S (K +) (K x)))) ([xI)
      = S (S ([xS) ([x] (S (K +) (K x)))) ([xI)
      = S (S ([xS) (S ([x] (S (K +))) ([x] (K x)))) ([xI)
      = S (S ([xS) (S (S ([xS) ([x] (K +))) ([x] (K x)))) ([xI)
      = S (S ([xS) (S (S ([xS) (S ([xK) ([x] +))) ([x] (K x)))) ([xI)
      = S (S ([xS) (S (S ([xS) (S ([xK) ([x] +))) (S ([xK) ([xx)))) ([xI)
      = S (S (K S) (S (S (K S) (S (K K) (K +))) (S (K KI))) (K I)
II

    1. S I (K 1) = C   I   1

    2. S (S (K  +) II (2)
      = S + I

    3. S (S (K S) (S (K KI)) (K I) (4)
      = C (S (K S) (S (K KI)) I (3)
      = C (B S (S (K KI)) I (2)
      = C (B S KI

    4. S (S (K S) (K I)) (S (K KI) (1)
      = S (K (S I)) (S (K KI) (3)
      = B (S I) (S (K KI) (2)
      = B (S IK

    5. S (S (K S) (S (S (K S) (
      S (K K) (K +)
      )) (S (K KI))) (K I)
      (1)
      = S (S (K S) (S (
      S (K S) (K (K +)))
       (S (K KI))) (K I)
      (1)
      = S (S (K S) (S (K (S (K +))) (
      S (K KI
      ))) (K I)
      (2)
      = S (
      S (K S) (S (K (S (K +))) K)
      ) (K I)
      (3)
      = S (B S (
      S (K (S (K +))) K
      )) (K I)
      (3)
      = C (B S (B (S (K +)) K)) I

This document was translated from LATEX by HEVEA.